Definicja : Wielokąt w płaszczyźnie jest nazywany monotonicznym w stosunku do linii prostej , jeśli każda linia prostopadła do przecina najwyżej dwa razy.L L P
Biorąc pod uwagę wielokąt , czy można ustalić, czy istnieje jakaś linia tak że wielokąt jest monotoniczny względem ? Jeśli tak to jak?L P L
Wcześniej zadałem powiązane pytanie (gdzie zapytałem, jak ustalić, czy wielokąt jest monotoniczny w odniesieniu do konkretnej linii), ale teraz interesuje mnie przypadek, gdy nie jest podane lub określone z góry.
Odpowiedzi:
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) βja vja
atan2
β i = α i + 1 - α i + { 0 jeśli α i + 1 ≥ α i 2 π jeśli α i + 1 < α i
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
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.
źródło