To jest możliwe.
Rozważmy wielokąt i rozważmy „wklęsłe” wierzchołki. Określają dokładnie, które linie przecinają wielokąt więcej niż dwa razy. Na poniższym rysunku zaznaczyłem przedziały (na czerwono) zakazanych kątów. Jeśli położysz je razem i zobaczysz dziurę w czerwonym dysku, wówczas dozwolone kąty (na niebiesko). Wielobok jest wówczas monotonny względem dowolnej linii nachylenia -1 / \ tan δ (na zielono). - 1 / tan δδ- 1 / tanδ
Teraz algorytm.
Niech będzie tym wierzchołkiem wielokąta. Najpierw oblicz bezwzględny kąt krawędzi i kąt wewnętrzny wierzchołka . Użyj funkcji dostępnej we wszystkich dobrych językach programowania.i α i ( v i v i + 1 ) β i v ivja= ( xja, yja)jaαja( vjavi + 1)βjavjaatan2
β i = α i + 1 - α i + { 0 jeśli α i + 1 ≥ α i 2 π jeśli α i + 1 < α i
αja= atan2 ( yi + 1- yja, xi + 1- xja)
βja= αi + 1- αja+ { 02 π jeśli αi + 1≥ αja jeśli αi + 1< αja
Odwróć kolejność wierzchołków, jeśli nie są one w kolejności przeciwnej do ruchu wskazówek zegara, tj. Jeśli nie jest ujemne. ( : przeciwnie do ruchu wskazówek zegara, : zgodnie z ruchem wskazówek zegara). s = - 2 π s = 2 πs = ∑jaβja- n πs = - 2 πs = 2 π
Poniższe dotyczy tylko kątów wewnętrznych większych niż , to . Czerwone na moim zdjęciu. Celem jest znalezienie kąta który nie jest w modulo . Mianowicie takie, że dla wszystkich takie, że :π β j > π δ ∪ j [ α j + 1 , α j ] π j β j > πmπβjot> πδ∪jot[ αj + 1, αjot]πjotβjot> π
( α j < δ < α j + 1 ) jeśli α j < α j + 1
( δ < αj + 1∨ αjot< δ ) jeśli αj + 1< αjot
( αjot< δ < αj + 1) jeśli αjot< αj + 1
gdzie jest tutaj znormalizowaną wartością w . Drugi przypadek odpowiada interwałowi, który wykracza poza (więc tym razem musi znajdować się „wewnątrz”).α j [0, π ) π δαjotαjot[ 0 , π )πδ
Prawdopodobnie jest na to szybszy sposób, ale jednym z jest posortowanie wartości do i przetestowanie pod kątem .O ( n2))αjot mod πγ1, … Γmδ ∈{ γ12), γ1+ γ2)2), … , Γm - 1+ γm2), γm+ π2)}
Jeśli trzeba znaleźć następnie istnieje i nachylenia . W przeciwnym razie nie jest monotonne.δL.- 1 / tanδP.