检查碰撞中的重合线

时间:2012-06-23 14:54:39

标签: algorithm actionscript-3

这是我上一个问题的某种后续行动。 我需要找到一种能够检测线路交叉/重叠的算法。

以下代码适用于大多数情况,但没有正确处理重合的行:

public static function checkLinesIntersection(p_a:Point,p_b:Point,p_c:Point,p_d:Point):Point
{

    // Denominator
    var d:Number = (p_d.y - p_c.y) * (p_b.x - p_a.x) - (p_d.x - p_c.x) * (p_b.y - p_a.y);

    //
    var n_a:Number = (p_d.x - p_c.x) * (p_a.y - p_c.y) - (p_d.y - p_c.y) * (p_a.x - p_c.x);
    var n_b:Number = (p_b.x - p_a.x) * (p_a.y - p_c.y) - (p_b.y - p_a.y) * (p_a.x - p_c.x);

    var ua:Number = n_a / d;
    var ub:Number = n_b / d;

    var p_intersection:Point = new Point();

    //coincidental but also happenes when lines are just aligned on the same plane
    if(d + n_a + n_b == 0){

        //how can i find if the lines really coincide and are not just in alignment, or parallel?

    };
    if ((ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1))
    {
        p_intersection.x = p_a.x + (ua * (p_b.x - p_a.x));
        p_intersection.y = p_a.y + (ua * (p_b.y - p_a.y));
        return p_intersection;
    }
    return null;
}

如何优化代码,以便只将重合而非平行的线作为交集进行评估?

非常感谢!

1 个答案:

答案 0 :(得分:1)

检测两条重合线很容易。所有你需要做的是,取两个段的较低点,让我们称之为m1,m2和更高的点M1,M2。

现在检查m1M2是否与m2M1相交。

如果他们没有,那么他们就在同一条线上。

现在只检查下段高端是否在更高的段中。 Illustration