XNA线段相交?

8
假设我们有四个Vector2(是的,这是2D),因此我们有lineOneStart、lineOneEnd、lineTwoStart和lineTwoEnd。如何检测这两条线是否相交?我不关心它们相交在哪里,我只想知道它们是否相交。
3个回答

6

通过Bourke检查此公式。

我最近也必须解决这个问题。另一个选择是使用(获取)直线的方程(y = mx + c),但是您需要关注几个边缘情况,并实际检查交点是否在线段内。上面链接中的公式有效,尽管我无法真正评论方程式如何重新排列,但我会说它有效;)

编辑

如AndiDog所提到的,我使用的另一个网站(示例也很好)是tutorial。由于这是XNA,因此第二个链接将非常适合您。

编辑(来自损坏链接的内容)

直线的方程式为Pa = P1 + ua ( P2 - P1 )Pb = P3 + ub ( P4 - P3 )

解决方程 Pa = Pb 得到以下两个未知数(ua 和 ub)的两个方程式: x1 + ua (x2 - x1) = x3 + ub (x4 - x3)y1 + ua (y2 - y1) = y3 + ub (y4 - y3) 解决后,将其代入线条相应的方程式中,得出交点。例如,交点 (x,y) 为: x = x1 + ua (x2 - x1) y = y1 + ua (y2 - y1) 注意: ua和ub的分母相同。 如果ua和ub的方程分母为0,则两条直线平行。 如果ua和ub的方程的分子和分母都为0,则两条直线重合。 这些方程适用于直线,如果需要求线段的交点,则只需测试ua和ub是否在0到1之间。无论哪一个在该范围内,相应的线段都包含交点。如果两者都在0到1的范围内,则交点位于两个线段内部。

+1 引用 Bourke 的几何算法集合。我经常使用它,非常棒。 - David Seiler
@Filip,我修复了这个链接的问题! - Peter

3

这个主题有一篇教程(线段相交),可以参考链接


0
为了完整起见,我将在下面包括算法,当使用(a,b,c)坐标表示线时,线的方程为a*x+b*y+c=0
  • 具有坐标(a1,b1,c1)(a2,b2,c2)的两条线在点(x,y)相交
  • 找到该点的齐次坐标

    u = b1*c2-b2*c1;
    v = a2*c1-a1*c2;
    w = a1*b2-a2*b1;
    
  • 如果两条线平行,则w=0

  • 否则,交点位于

    x = u/w;
    y = v/w;
    

附录

  • 通过两点 (x1,y1)(x2,y2) 定义一条线 (a,b,c),使用以下公式:

    a= y1-y2;
    b= x2-x1;
    c= x1*y2-y1*x2;
    
  • 通过一个点 (x,y) 和极角方向 (cos(θ),sin(θ)) 定义一条线 (a,b,c),使用以下公式:

    a= -sin(θ);
    b=  cos(θ);
    c= x*sin(θ)-y*cos(θ);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接