Як перевірити, чи багатокутник є однотонним щодо лінії?


10

Добре відомо, що одноманітні багатокутники відіграють вирішальну роль у триангуляції полігонів .

Визначення: Багатокутник у площині називається монотонним відносно прямої , якщо кожна пряма, прямокутна на перетинає не більше ніж удвічі.PLLP

Враховуючи лінію та багатокутник , чи існує ефективний алгоритм для визначення того, чи є багатокутник однотонним щодо ?LPPL

Відповіді:


10

Підказка: Узагальнений простий багатокутник є монотонним щодо осі якщо і лише тоді, коли він має рівно одну вершину, -координат якої менший, ніж у сусідів. Це спостереження одразу підказує алгоритм часу , принаймні, якщо жоден край вашого багатокутника не є вертикальним.x O ( n )xxO(n)

Спойлери Ahoy:

IsMonotone (X [0..n-1], Y [0..n-1])
    local_mins ← 0
    для i ← 0 до n-1
        якщо (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))

Нарешті, якщо - якийсь інший рядок форми , змініть наступним чином: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. Знайдіть крайню ліву і праву вершини (тобто вершини багатокутника з відповідно min і max -координатом) за час (тобто просто повторіть один раз список вершин).O ( n )xO(n)

  2. Ці дві вершини розділяють межу полігона на дві криві: верхній і нижній ланцюг.

  3. Пройдіться зліва направо вздовж кожного ланцюга, переконавшись, що координати не зменшуються. Це займає час.O ( n )xO(n)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.