Как проверить, является ли многоугольник монотонным относительно линии?


10

Хорошо известно, что монотонные полигоны играют решающую роль в триангуляции полигонов .

Определение: Многоугольник на плоскости называется монотонным относительно прямой , если каждая прямая, ортогональная пересекает не более двух раз.PLLP

При заданной прямой и многоугольнике существует ли эффективный алгоритм для определения того, является ли многоугольник монотонным относительно ?LPPL

Ответы:


10

Подсказка: Общий простой многоугольник монотонен относительно к оси х тогда и только тогда , когда она имеет ровно одну вершину которого координата меньше , чем ее соседи. Это наблюдение сразу предлагает алгоритм -времени, по крайней мере, если ни один край вашего многоугольника не является вертикальным.xxO(n)

Спойлеры ахой:

IsMonotone (X [0..n-1], Y [0..n-1])
    local_mins ← 0
    для меня ← 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))

Наконец, если - это другая строка вида , измените ее следующим образом:Lax+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 ) за время (т. Е. Просто итерируйте один раз список вершин).xO(n)

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

  3. Идите слева направо по каждой цепочке, проверяя, что координаты не уменьшаются. Это занимает время.xO(n)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.