-1

これは私の最後の質問に対するある種のフォローアップです。交差/重なり合う線を検出するアルゴリズムを見つける必要がありました。

次のコードはほとんどの場合うまく機能しましたが、一致する行を正しく処理しません。

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;
}

平行線ではなく一致する線のみが交差として評価されるように、コードを改良するにはどうすればよいですか?

どうもありがとう!

4

1 に答える 1

1

一致する2本の線を検出するのは簡単です。あなたがする必要があるのは、両方のセグメントの低い点を取り、それらをm1、m2と呼び、高い点をM1、M2と呼ぶことです。

次に、m1M2がm2M1と交差するかどうかを確認します。

そうでない場合、それらは同じ行にあります。

次に、下位セグメントのハイエンドが上位セグメントにあることを確認します。 図

于 2012-06-23T15:36:23.267 に答える