È possibile.
Considera il tuo poligono e considera i vertici "concavi". Definiscono esattamente quali linee intersecheranno il poligono più di due volte. Nella figura seguente ho segnato gli intervalli (in rosso) degli angoli proibiti. Se li metti insieme e vedi un buco nel disco rosso, allora ci sono angoli autorizzati (in blu). Il poligono è quindi monotono rispetto a qualsiasi linea di pendenza -1 / \ tan δ (in verde). - 1 / tan δδ- 1 / abbronzaturaδ
Ora l'algoritmo.
Sia il vertice del poligono. innanzitutto l'angolo assoluto del bordo e l'angolo interno del vertice . Utilizzare la funzione disponibile in tutti i buoni linguaggi di programmazione.i α i ( v i v i + 1 ) β i v ivio= ( xio, yio)ioαio( viovi + 1)βiovioatan2
β i = α i + 1 - α i + { 0 se α i + 1 ≥ α i 2 π se α i + 1 < α i
αio= atan2 ( yi + 1- yio, xi + 1- xio)
βi=αi+1−αi+{02π if αi+1≥αi if αi+1<αi
Invertire l'ordine dei vertici se non sono in senso antiorario, ovvero se non è negativo. ( : antiorario, : orario). s = - 2 π s = 2 πs = ∑ioβio- n πs = - 2 πs = 2 π
Quanto segue è solo per gli angoli interni maggiori di cioè . Quelli rossi nella mia foto. L'obiettivo è trovare un angolo che non sia in modulo . Vale a dire tale che per tutti tale che :π β j > π δ ∪ j [ α j + 1 , α j ] π j β j > πmπβj> πδ∪j[ αj + 1, αj]πjβj> π
( δ < αj + 1∨ αj< δ ) se αj + 1< αj
( αj< δ < αj + 1) se αj< αj + 1
dove è qui il valore normalizzato di in . Il secondo caso corrisponde a un intervallo che va oltre (quindi questa volta deve essere "dentro").αjαj[ 0 , π )πδ
C'è probabilmente un modo più veloce per farlo ma uno in è quello di ordinare i valori in e testare .O ( n2)αj mod πγ1, ... γmδ ∈{ γ12, γ1+ γ22, ... , γm - 1+ γm2, γm+ π2}
Se hai trovato un po allora esiste ed è di pendenza . Altrimenti non è monotono.δL- 1 / abbronzaturaδP