Come posso verificare se un poligono è monotono rispetto a una linea?


10

È noto che i poligoni monotoni svolgono un ruolo cruciale nella triangolazione dei poligoni .

Definizione: un poligono nel piano è chiamato monotono rispetto a una linea retta , se ogni linea ortogonale a interseca al massimo due volte.L L PPLLP

Data una linea e un poligono , esiste un algoritmo efficiente per determinare se un poligono è monotono rispetto a ?P P LLPPL

Risposte:


10

Suggerimento: un poligono generico generico è monotono rispetto all'asse se e solo se ha esattamente un vertice il cui coordinato è più piccolo dei suoi vicini. Questa osservazione suggerisce immediatamente un algoritmo -time, almeno se nessun bordo del poligono è verticale.x O ( n )xxO(n)

Spoiler ahoy:

IsMonotone (X [0..n-1], Y [0..n-1])
    local_mins ← 0
    per i ← da 0 a n-1
        if (X [i] <X [i + 1 mod n]) e (X [i] <X [i-1 mod n])
            local_mins ← local_mins + 1
    return (local_mins = 1)

Se sei preoccupato che il tuo poligono possa avere bordi verticali, usa la seguente subroutine al posto del confronto X[i] < X[j]per rompere costantemente i legami:

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

Infine, se è un'altra linea della forma , modifica come segue:a x + b y = cLax+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

Ecco una spiegazione più informale, di alto livello e, si spera, intuitiva di un algoritmo per verificare se un poligono è "orizzontalmente monotono", cioè rispetto all'asse .x

  1. Trova i vertici più a sinistra e più a destra (cioè i vertici del poligono con rispettivamente la coordinata min e max ), in tempo (ovvero iterare una volta l'elenco dei vertici).O ( n )xO(n)

  2. Questi due vertici dividono il confine del poligono in due curve: una catena superiore e una catena inferiore.

  3. Cammina da sinistra a destra lungo ogni catena, verificando che le coordinate non diminuiscano. Questa operazione richiede tempo.O ( n )xO(n)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.