Winform上の2つのオブジェクトの間に矢印が描かれています。
私のマウスが現在この線の上または近くにあることを確認する最も簡単な方法は何でしょうか。
マウスポイントが2つのポイントによって定義および外挿された正方形と交差するかどうかをテストすることを検討しましたが、これは2つのポイントのx値またはy値が非常に似ている場合にのみ実行可能です。
また、この問題はおそらく単純な三角法ではなく線形代数の領域にあると思います。行列のより単純な側面を覚えていますが、この問題は線形代数の知識を超えています。
一方、.NETライブラリがこの機能に対応できる場合は、さらに優れています。
編集 答えてくれてありがとう、答えとしてタグ付けされるに値するいくつかの非常に良いものがありました。
描画された任意の形状に適用できるので、Coincoinの回答を受け入れたものとして選択しましたが、グラフィックパスとペンを新しくするよりも単純な方程式を使用した方がはるかに効率的であるため、TimRobinsonの方程式を実装することになりました。私の場合、1-nの異なる関係のためにonMouseMoveでそれを行う必要があります(明らかに、いくつかのキャッシングと最適化がありますが、ポイントはまだ残っています)
方程式の主な問題は、線が無限大として扱われるように見えることでした。そのため、境界テストも追加しました。
興味のある人のためのコード(最初のカット、おそらく少し調整します)は以下のとおりです
if (Math.Sqrt( Math.Pow(_end.X - _start.X, 2) +
Math.Pow(_end.Y - _start.Y, 2) ) == 0)
{
_isHovering =
new RectangleF(e.X, e.Y, 1, 1).IntersectsWith(_bounds);
}
else
{
float threshold = 10.0f;
float distance = (float)Math.Abs(
( ( (_end.X - _start.X) * (_start.Y - e.Y) ) -
( (_start.X - e.X) * (_end.Y - _start.Y) ) ) /
Math.Sqrt( Math.Pow(_end.X - _start.X, 2) +
Math.Pow(_end.Y - _start.Y, 2) ));
_isHovering = (
distance <= threshold &&
new RectangleF(e.X, e.Y, 1, 1).IntersectsWith(_bounds)
);
}
_boundsは次のように定義されます。
_bounds = new Rectangle(
Math.Min(_start.X, _end.X),
Math.Min(_start.Y, _end.Y),
Math.Abs(_start.X - _end.X), Math.Abs(_start.Y - _end.Y));