这个问题我已经查过了,但答案对我来说很大:
How to know if a line intersects a plane in C#? - Basic 2D geometry
是否有任何.NET方法可以知道由两点定义的直线是否与矩形相交?
public bool Intersects(Point a, Point b, Rectangle r)
{
// return true if the line intersects the rectangle
// false otherwise
}
先谢谢你。
8条答案
按热度按时间sqougxex1#
cx6n0qe32#
不幸的是,错误的答案已经被投票通过。计算实际的交点是非常昂贵的,你只需要比较。要寻找的关键字是“线裁剪”(http://en.wikipedia.org/wiki/Line_clipping).维基百科推荐使用Cohen-Sutherland算法(http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland)当您需要快速剔除时,这可能是最常见的情况。在维基百科页面上有一个C++-实现。如果你对实际剪切这行不感兴趣,你可以跳过大部分,@Johann的答案看起来和那个算法非常相似,但是我没有仔细看。
lxkprmvk3#
暴力算法......
首先检查矩形是在直线端点的左边还是右边:
然后,如果以上不足以排除相交,请检查矩形是在直线端点之上还是之下:
然后,如果以上不足以排除相交,则需要检查直线
y = m * x + b
的方程,以查看矩形是否在直线上方:然后,如果上面的不足以排除相交,你需要检查矩形是否在下面的行:
然后,如果您到达此处:
注:我相信有一个更优雅的代数解法,但用笔和纸以几何方式执行这些步骤是很容易遵循的。
一些未经测试和未经编译的代码:
x6yk4ghg4#
此代码具有更好的性能:
您也可以在JS演示中查看它是如何工作的:http://jsfiddle.net/77eej/2/
如果你有两个点和矩形,你可以这样调用这个函数:
gk7wooem5#
我采用了HABJAN的解决方案,它运行良好,并将其转换为Objective-C。Objective-C代码如下:
非常感谢HABJAN。我会注意到,一开始我写了自己的例程来检查梯度沿着的每个点,我做了我能做的一切来最大限度地提高性能,但这马上就快多了。
p8h8hvxi6#
对于Unity(反转y!)。这解决了除零问题,其他方法在这里有:
wlsrxk517#
最简单的计算几何技术是遍历多边形的线段,看看它是否与其中任何一个相交,因为它也必须与多边形相交。
这种方法(以及CG的大多数方法)唯一的警告是,我们必须小心边缘情况。如果直线与矩形相交于一点,我们是否将其视为相交?在实现过程中要小心。
编辑:计算线段与线段相交的典型工具是
LeftOf(Ray, Point)
测试,如果点在射线的左侧,则返回。给定一条l
线(我们将其用作射线)和一条包含点a
和b
的线段,如果一个点在左侧而另一个点不在左侧,则该线与线段相交:同样,当点在直线上时,您需要注意边缘情况,但这取决于您希望如何实际定义相交。
rryofs0p8#
没有简单的预定义.NET方法可以调用来完成此操作。但是,使用Win32 API,有一种非常简单的方法可以完成此操作(简单是指实现,性能不是优点):LineDDA
此函数为要绘制的线的每个像素调用回调函数。在此函数中,您可以检查像素是否在矩形内-如果找到一个,则它相交。
正如我所说的,这不是最快的解决方案,但很容易实现。要在C#中使用它,当然需要从gdi32.dll导入它。