Можливо.
Розглянемо вас багатокутник і розглянемо «увігнуті» вершини. Вони точно визначають, які лінії будуть перетинати багатокутник більше ніж удвічі. На наступному малюнку я позначив інтервали (червоним кольором) заборонених кутів. Якщо їх скласти разом і побачити дірку на червоному диску, то є дозволені кути δ (синім кольором). Тоді багатокутник одноманітний щодо будь-якої лінії схилу −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+1−yi,xi+1−xi)
βi=αi+1−αi+{02π if αi+1≥αi if αi+1<αi
Зверніть порядок вершин, якщо вони не в порядку проти годинникової стрілки, тобто якщо не від'ємний. ( s = - 2 π : проти годинникової стрілки, s = 2 π : за годинниковою стрілкою).s=∑iβi−nπ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,…,γm−1+γm2,γm+π2}
δL−1/tanδP