我在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