XNA线段交叉?

时间:2010-02-17 22:05:15

标签: c# math xna

假设我们有4个Vector2(是的,这是2d),所以我们有lineOneStart,lineOneEnd,lineTwoStart和lineTwoEnd。

如何检测2条线是否交叉?我不在乎他们在哪里交叉,我只是想知道他们是否相交。

3 个答案:

答案 0 :(得分: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) 求解为ua和ub提供以下表达式

将这些中的任何一个代入线的相应等式给出交点。例如,交点(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 :(得分:3)

该主题有一个tutorial(线段交叉点)。

答案 2 :(得分: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;
    

附录

  • 要通过两个点(a,b,c)(x1,y1)定义一行(x2,y2),请使用

    a= y1-y2;
    b= x2-x1;
    c= x1*y2-y1*x2;
    
  • 通过极向(a,b,c)的点(x,y)定义一条线(cos(θ),sin(θ))

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