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

com
la source

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))
JeffE
la source
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)

nbro
la source