我在Winform上的兩個對象之間繪製了一個箭頭。.NET確定鼠標是在兩個任意點之間繪製的線條
什麼是最簡單的方法來確定我的鼠標當前懸停在這條線上或附近。
我已經考慮測試鼠標點是否與由兩點定義和外推的平方相交,但只有兩點具有非常相似的x或y值纔可行。
我在想,這個問題可能更多的是線性代數領域,而不是簡單的三角學,雖然我記得矩陣的更簡單的方面,但這個問題超出了我對線性代數的認識。
另一方面,如果一個.NET庫可以處理該功能,甚至更好。
編輯 感謝您的答案,有幾個非常好的答案,都應該被標記爲答案。
我選擇了Coincoin的答案,因爲我喜歡它可以應用於任何形狀的繪製,但是最終實現了Tim Robinson的方程,因爲使用簡單的方程看起來效率更高,而不是新建圖形路徑和筆,就像在我的情況下,我需要在1-n不同關係上進行鼠標移動(顯然會有一些緩存和優化,但該點仍然存在)
這個方程的主要問題是它似乎要處理這條線是無限的,所以我加了一個邊界測試。
代碼(初始切,我可能會neaten有點),對於那些有興趣,低於
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));
我所需要的,而且當我通過什麼0特例檢查 – johnc 2010-03-20 04:15:16