Come posso verificare se un poligono è monotono rispetto a una linea arbitraria?


16

Definizione : un poligono nel piano è chiamato monotono rispetto a una linea retta , se ogni linea ortogonale a interseca al massimo due volte.PLLP

Dato un poligono , è possibile determinare se esiste una linea tale che il poligono sia monotono rispetto a ? Se si, come?PLPL

In precedenza, ho posto una domanda correlata (in cui ho chiesto come determinare se un poligono è monotono rispetto a una determinata riga), ma ora sono interessato al caso in cui non viene fornito o specificato in anticipo.L


Perché non semplicemente ruotare / spostare il sistema di coordinate in modo che diventi l' asse e quindi esegua nuovamente il vecchio algoritmo? Il lavoro aggiuntivo dovrebbe essere gestibile in . x O ( 1 )LxO(1)
HdM,

4
@HdM: la riga L non viene fornita come parte dell'input.
Tsuyoshi Ito,

Risposte:


16

È 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/tanδ

Asteroids

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 ivi=(xi,yi)iαi(viovio+1)βiovioatan2

β i = α i + 1 - α i + { 0  se  α i + 1α i 2 π  se  α i + 1 < α i

αio=atan2(yio+1-yio,Xio+1-Xio)
βi=αi+1αi+{0 if αi+1αi2π if αi+1<αio

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


Quale software hai usato per realizzare quell'illustrazione?
jojman

@jojman Non ricordo ma doveva essere GIMP, non ricordo nessun altro programma che avrei usato allora.
jmad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.