Bir poligonun bir çizgiye göre monoton olup olmadığını nasıl test edebilirim?


10

Monoton çokgenlerin çokgen üçgenlemesinde çok önemli bir rol oynadığı iyi bilinmektedir .

Tanım: bir çokgen düzlemindeki bir düz çizgi ile ilgili olarak monoton olarak adlandırılır ise ortogonal her satır, kesiştiği en fazla iki kez.PLLP

Bir çizgi ve bir poligon verildiğinde, bir poligon göre monoton olup olmadığını belirlemek için etkili bir algoritma var mı?LPPL

Yanıtlar:


10

İpucu: Genel basit bir çokgen, yalnızca x- koordinatı komşularından daha küçük olan tam bir tepe noktasına sahipse eksenine göre monotondur . Bu gözlem , en azından çokgeninizin kenarı dikey değilse, hemen bir O ( n ) -zamanı algoritması önerir .xxÖ(n)

Spoiler selam:

İzoton (X [0..n-1], Y [0..n-1])
    local_mins ← 0
    için i ← 0 ila n-1
        eğer (X [i] <X [i + 1 mod n]) ve (X [i] <X [i-1 mod n])
            local_mins ← local_mins + 1
    dönüş (local_mins = 1)

Çokgeninizin dikey kenarları olabileceğinden endişe ediyorsanız, X[i] < X[j]bağları tutarlı bir şekilde koparmak için karşılaştırma yerine aşağıdaki alt yordamı kullanın :

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

Son olarak, formunun başka bir çizgi , bir x + b y = C , ve değişiklikler , aşağıdaki gibi:Lbirx+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

İşte bir çokgenin "yatay olarak monoton", yani eksenine göre olup olmadığını kontrol etmek için bir algoritmanın daha gayri resmi, yüksek seviyeli ve umarım sezgisel bir açıklaması .x

  1. xÖ(n)

  2. Bu iki köşe çokgenin sınırını iki eğriye böler: bir üst zincir ve bir alt zincir.

  3. xÖ(n)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.