ポリゴンがラインに関して単調かどうかをテストするにはどうすればよいですか?


10

モノトーンポリゴンポリゴンの三角形分割で重要な役割を果たすことはよく知られています。

定義: Aポリゴン平面では直線に関して単調と呼ばれるへのすべての行が直交する場合は、Lと交差P最も二回で。PLLP

ラインLとポリゴンPが与えられたP場合、ポリゴンPLに関して単調かどうかを判断する効率的なアルゴリズムはありLますか?

回答:


10

ヒント:一般的な、単純なポリゴンに関して単調であるそれはその正確に一つの頂点がある場合にのみ-axis -座標隣国よりも小さくなっているが。この観察結果は、少なくともポリゴンのエッジが垂直でない場合、タイムアルゴリズムをすぐに示唆します。xxO(n)

ネタバレ:

IsMonotone(X [0..n-1]、Y [0..n-1])
    local_mins←0
    for i←0からn-1
        if(X [i] <X [i + 1 mod n])および(X [i] <X [i-1 mod n])
            local_mins←local_mins + 1
    戻り値(local_mins = 1)

ポリゴンに垂直エッジがあるのではないかと心配している場合は、比較の代わりに次のサブルーチンを使用して、X[i] < X[j]一貫性を保ちます。

IsLess(X, i, j):
    return ((X[i] < X[j]) or (X[i] = X[j] and i < j))

最後に、が形式の他の行である場合は、次のように変更します。Lax+by=cIsLess

IsLess(X, Y, i, j):
    Di ← a·X[i] + b·Y[i]
    Dj ← a·X[j] + b·Y[j]
    return ((Dj < Dj) or (Di = Dj and i < j))

1

これは、ポリゴンが「水平方向に単調」かどうか、つまり軸に関してかどうかを確認するアルゴリズムの、より非公式で高レベルの、そしてできれば直感的な説明です。x

  1. 左端と右端の頂点(つまり、それぞれ最小と最大の持つポリゴンの頂点)を時間で検索します(つまり、頂点のリストを1回繰り返すだけです)。On xO(n)

  2. これらの2つの頂点は、ポリゴンの境界を2つの曲線に分割します。上部チェーンと下部チェーンです。

  3. 各チェーンに沿って左から右に歩いて、が減少していないことを確認します。これには時間かかります。On xO(n)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.