Es ist möglich.
Betrachten Sie Ihr Polygon und die "konkaven" Eckpunkte. Sie definieren genau, welche Linien das Polygon mehr als zweimal schneiden. In der folgenden Abbildung habe ich die Intervalle (in rot) der verbotenen Winkel markiert. Wenn Sie sie zusammenfügen und ein Loch in der roten Scheibe sehen, gibt es zulässige Winkel (in blau). Das Polygon ist dann in Bezug auf jede Steigungslinie eintönig - 1 / tan δ (in Grün).δ−1/tanδ
Nun der Algorithmus.
vi=(xi,yi)iαi(vivi+1)βiviatan2
αi=atan2(yi+1−yi,xi+1−xi)
βi=αi+1−αi+{02π if αi+1≥αi if αi+1<αi
Kehre die Reihenfolge der Eckpunkte um, wenn sie nicht im Gegenuhrzeigersinn liegen, dh wenns=∑iβi−nπs=−2πs=2π
Das Folgende gilt nur für die Innenwinkel, die größer als sind, . Die roten auf meinem Bild. Ziel ist es, einen Winkel zu finden , der nicht in modulo . Nämlich so, dass für alle so, dass :mπβj>πδ∪j[αj+1,αj]πjβj>π
(δ<αj+1∨αj<δ) if αj+1<αj
(αj<δ<αj+1) if αj<αj+1
wobei hier der normalisierte Wert von in . Der zweite Fall entspricht einem Intervall, das über hinausgeht (also muss diese Zeit "innen" sein).αjαj[0,π)πδ
Es gibt wahrscheinlich einen schnelleren Weg, dies zu tun, aber einer in besteht darin, die Werte in zu und auf zu testen. .α j mod π γ 1 , … γ m δ ∈ { γ 1O(n2)αj mod πγ1,…γmδ∈{γ12,γ1+γ22,…,γm−1+γm2,γm+π2}
Wenn Sie etwas dann existiert und hat eine Steigung von . Ansonsten ist nicht eintönig. L - 1 / tan δ PδL−1/tanδP