Comment puis-je tester si un polygone est monotone par rapport à une ligne?


10

Il est bien connu que les polygones monotones jouent un rôle crucial dans la triangulation des polygones .

Définition: Un polygone dans le plan est appelé monotone par rapport à une droite , si chaque ligne orthogonale à coupe au plus deux fois.L L PPLLP

Étant donné une ligne et un polygone , existe-t-il un algorithme efficace pour déterminer si un polygone est monotone par rapport à ?P P LLPPL

Réponses:


10

Astuce: Un polygone simple générique est monotone par rapport à l' axe si et seulement s'il a exactement un sommet dont la coordonnée est plus petite que ses voisins. Cette observation suggère immédiatement un algorithme à temps , du moins si aucun bord de votre polygone n'est vertical.x O ( n )xxO(n)

Spoilers ahoy:

IsMonotone (X [0..n-1], Y [0..n-1])
    local_mins ← 0
    pour i ← 0 à n-1
        si (X [i] <X [i + 1 mod n]) et (X [i] <X [i-1 mod n])
            local_mins ← local_mins + 1
    return (local_mins = 1)

Si vous craignez que votre polygone ait des bords verticaux, utilisez le sous-programme suivant à la place de la comparaison X[i] < X[j]pour rompre systématiquement les liens:

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

Enfin, si est une autre ligne de la forme , modifiez comme suit: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

x

  1. xO(n)

  2. Ces deux sommets divisent la frontière du polygone en deux courbes: une chaîne supérieure et une chaîne inférieure.

  3. xO(n)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.