最好不要使用任何循环,因为这将用于游戏。
我希望将一条线段与一个任意大小的矩形相交。 但我也希望返回交点(们)。
我已经尝试过谷歌搜索,但仍未解决问题。
该线由(x1,y1,x2,y2)定义。 矩形也有这两个点。
最好不要使用任何循环,因为这将用于游戏。
我希望将一条线段与一个任意大小的矩形相交。 但我也希望返回交点(们)。
我已经尝试过谷歌搜索,但仍未解决问题。
该线由(x1,y1,x2,y2)定义。 矩形也有这两个点。
我建议对组成矩形的每条线段(边)进行线段交点检查。以下是我很久以前编写的线段交点检测算法,从我的旧XNA项目中挖掘出来:
// a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end
static bool Intersects(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2, out Vector2 intersection)
{
intersection = Vector2.Zero;
Vector2 b = a2 - a1;
Vector2 d = b2 - b1;
float bDotDPerp = b.X * d.Y - b.Y * d.X;
// if b dot d == 0, it means the lines are parallel so have infinite intersection points
if (bDotDPerp == 0)
return false;
Vector2 c = b1 - a1;
float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp;
if (t < 0 || t > 1)
return false;
float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp;
if (u < 0 || u > 1)
return false;
intersection = a1 + t * b;
return true;
}
当您有一组大多数不与矩形相交的线时,可以查看Cohen-Sutherland算法以高效地完成此操作。它使用一个9段网格,并将每个线段的端点放置在该网格的某个区域中:
使用这种方法,我们可以确定是否没有任何线段相交:
例如,在此处CD
不会与矩形相交(在第一幅图像中以红色显示),因为C
和D
都在顶行,AB
也是如此。对于可能与矩形相交的线,我们必须尝试线-线交点。
部分编号/标签的方式使我们可以简单地执行x AND y != 0
(其中x
和y
是每个线段端点的部分标签)以确定是否不会有交点。
使用此方法意味着我们必须进行许多更少的线-线交点,从而大大加快了整个过程的速度。