C# XNA线段交点?

C# XNA线段交点?,c#,math,xna,C#,Math,Xna,假设我们有4个向量2(是的,这是2d),所以我们有lineOneStart、lineOneEnd、lineTwoStart和lineTwoEnd 如何检测这两条线是否相交?我不在乎它们在哪里交叉,我只想知道它们是否相交。检查这个公式 我最近也不得不解决这个问题。另一个选项是使用(获取)直线方程(y=mx+c),但您需要关注几个边缘情况,以及实际检查交点是否在线段内。上面链接中的公式是有效的,虽然我不能真正评论公式是如何重新排列的,但我要说的是它是有效的;) 编辑: 正如AndiDog提到的,我使

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

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

检查这个公式

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

编辑

正如AndiDog提到的,我使用的另一个站点(这个例子也很好)是这个。因为这是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的范围内,则交点在两条直线段内。

关于该主题(直线段相交)有一个主题。

为了完整性,当直线在
(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;
    
  • 通过极性方向
    (cos(θ),sin(θ))的点
    (x,y)
    定义线
    (a,b,c)


+1引用伯克的几何算法集。“我一直在用它,太棒了!”菲利普我修复了坏掉的链接!
a= -sin(θ);
b=  cos(θ);
c= x*sin(θ)-y*cos(θ);