我在 Winform 上的两个对象之间绘制了一个箭头。
确定我的鼠标当前悬停在这条线上或附近的最简单方法是什么。
我考虑过测试鼠标点是否与由两个点定义和外推的正方形相交,但是这只有在两个点具有非常相似的 x 或 y 值时才可行。
我也在想,这个问题可能更多地属于线性代数而不是简单的三角学,虽然我确实记得矩阵的简单方面,但这个问题超出了我对线性代数的了解。
另一方面,如果 .NET 库能够处理该功能,那就更好了。
编辑 感谢您的回答,有一些非常好的都值得被标记为已回答。
我选择了 Coincoin 的答案作为接受,因为我喜欢它可以应用于绘制的任何形状,但最终实现了 Tim Robinson 的方程,因为使用简单的方程而不是更新图形路径和笔似乎更有效,如我的情况是,我需要为 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));