Wie teste ich, ob ein Polygon in Bezug auf eine beliebige Linie monoton ist?

16

Definition : Ein Polygon in der Ebene heißt monoton in Bezug auf eine Gerade L , wenn jede zu L orthogonale Linie P höchstens zweimal schneidet .PLLP

Ist es möglich, bei gegebenem Polygon zu bestimmen, ob irgendeine Linie L existiert, so dass das Polygon P in Bezug auf L monoton ist ? Wenn ja, wie?PLPL

Früher fragte ich eine ähnliche Frage (wo ich gefragt , wie zu bestimmen , ob ein Polygon monoton in Bezug auf eine bestimmte Linie ist), aber jetzt bin ich in dem Fall interessiert , wenn ist nicht gegeben oder im Voraus festgelegt.L

com
quelle
Warum nicht einfach das Koordinatensystem so drehen / verschieben, dass L zur x Achse wird und dann den alten Algorithmus erneut ausführen? Die Zusatzarbeit soll in überschaubar sein O(1).
HdM
4
@HdM: Zeile L wird nicht als Teil der Eingabe angegeben.
Tsuyoshi Ito

Antworten:

16

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δ

Asteroiden

Nun der Algorithmus.

vi=(xi,yi)iαi(vivi+1)βiviatan2

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

Kehre die Reihenfolge der Eckpunkte um, wenn sie nicht im Gegenuhrzeigersinn liegen, dh wenns=iβinπ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,,γm1+γm2,γm+π2}

Wenn Sie etwas dann existiert und hat eine Steigung von . Ansonsten ist nicht eintönig. L - 1 / tan δ PδL1/tanδP

jmad
quelle
Mit welcher Software haben Sie diese Illustration erstellt?
Jojman
@jojman Ich erinnere mich nicht, aber es musste GIMP sein. Ich kann mich an kein anderes Programm erinnern, das ich damals verwendet hätte.
Jmad