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


16

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

Враховуючи багатокутник P , чи можна визначити, чи існує якась така лінія L , що багатокутник P є монотонним щодо L ? Якщо так, то як?

Раніше я задав відповідне питання (де я запитав , як визначити , є чи багатокутник монотонна по відношенню до певної лінії), але зараз я зацікавлений в тому випадку , коли L є НЕ дано або НЕ вказано заздалегідь.


Чому б просто не повернути / змістити систему координат таким чином, щоб L перетворився на осі x а потім знову запустив старий алгоритм? Додаткова робота повинна бути керованою в O(1) .
HdM

4
@HdM: рядок L не вводиться як частина вводу.
Цуйосі Іто

Відповіді:


16

Можливо.

Розглянемо вас багатокутник і розглянемо «увігнуті» вершини. Вони точно визначають, які лінії будуть перетинати багатокутник більше ніж удвічі. На наступному малюнку я позначив інтервали (червоним кольором) заборонених кутів. Якщо їх скласти разом і побачити дірку на червоному диску, то є дозволені кути δ (синім кольором). Тоді багатокутник одноманітний щодо будь-якої лінії схилу 1/tanδ (зеленого кольору).

Астероїди

Тепер алгоритм.

Нехай - i -та вершина многокутника. Спочатку обчисліть абсолютний кут α i ребра ( v i v i + 1 ) та внутрішній кут β i вершини v i . Використовуйте функцію, доступну на всіх хороших мовах програмування.vi=(xi,yi)iαi(vivi+1)βiviatan2

β i = α i + 1 - α i + { 0,  якщо  α i + 1α i 2 π,  якщо  α i + 1 < α i

αi=atan2(yi+1yi,xi+1xi)
βi=αi+1αi+{0 if αi+1αi2π if αi+1<αi

Зверніть порядок вершин, якщо вони не в порядку проти годинникової стрілки, тобто якщо не від'ємний. ( s = - 2 π : проти годинникової стрілки, s = 2 π : за годинниковою стрілкою).s=iβinπs=2πs=2π

Далі йдеться лише про внутрішніх кутах, більших за π , тобто β j > π . Червоні на моєму малюнку. Мета - знайти кут δ, який не знаходиться в j [ α j + 1 , α j ] по модулю π . А саме таке, що для всіх j таких, що β j > π :mπβj>πδj[αj+1,αj]πjβj>π

( α j < δ < α j + 1 ),  якщо  α j < α j + 1

(δ<αj+1αj<δ) if αj+1<αj
(αj<δ<αj+1) if αj<αj+1

αjαj[0,π)πδ

O(n2)αj mod πγ1,γmδ{γ12,γ1+γ22,,γm1+γm2,γm+π2}

δL1/tanδP


Яке програмне забезпечення ви використали для створення цієї ілюстрації?
їйман

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