【问题标题】:XNA line segment intersection?XNA线段相交?
【发布时间】:2010-02-17 22:05:15
【问题描述】:

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

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

【问题讨论】:

    标签: c# math xna


    【解决方案1】:

    通过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 引用了 Bourke 的几何算法集。我一直在用,很好用。
    • @Filip 我修复了断开的链接!
    【解决方案2】:

    关于该主题(线段交点)有一个tutorial

    【讨论】:

      【解决方案3】:

      为了完整起见,当线条以(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;
        
      • 定义一条线(a,b,c)通过点(x,y),极坐标方向(cos(θ),sin(θ))

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 2011-02-20
        • 2011-03-23
        • 2012-09-02
        • 1970-01-01
        相关资源
        最近更新 更多