Indicazioni geografiche matematiche 2D
Domanda
Sto cercando di verificare la posizione di un punto (px, py) sul grafico 2D in relazione a un segmento di linea (lx1, ly1) (lx2, ly2), usando la logica delle direzioni Nord Sud Est Ovest. La logica che ho implementato è disegnare un punto perpendicolare sul segmento di linea dal punto.
se la perpendicolare è in linea significa che è a sud.
Se il punto sul lato destro indica la sua Est.
Se il punto sul lato sinistro significa Ovest.
Se la perpendicolare è lontana dalla linea in avanti, significa Nord.
Se la perpendicolare è lontana dalla linea in direzione arretrata, significa Sud.
Il mio problema è che questa logica sembra buona sulla carta, ma sta diventando davvero difficile decidere se si tratta di un caso NW, NE, SW o SE. Qualcuno può suggerirmi come calcolare questa logica ?? Sto usando C ++, ma l'algoritmo in qualsiasi lingua sarà di grande aiuto.
Sto usando il punto finale del segmento di linea per calcolare la relazione Nord Sud Est Ovest.
Saluti
Soluzione
-
delta_x = x2 - x1
-
delta_y = y2 - y1
-
distance = sqrt (delta_x ^ 2 + delta_y ^ 2)
-
tan (theta) = delta_y / delta_x
-
theta = arctan (delta_y / delta_x)
;; ma non dividere per zero! - moltiplica
theta
per180 / PI
per ottenere gradi
I gradi sono in senso antiorario dal lato positivo dell'asse x. Alla fine dovrai fare una piccola quantità di algebra per riorientare i gradi in modo che 0 sia in alto (anziché a destra) e corra in senso orario. Ma prima di ciò:
Un problema è che arctan (1 / -1)
è uguale a arctan (-1 / 1)
. Cioè , otterrai -PI / 4
radianti o -45 gradi, sia in alto a sinistra (ha bisogno di un offset di 180 gradi) che in basso a destra (ok come è). Dovrai fare dei test sul segno di delta_y
vs. delta_x
per vedere se il risultato di arctan
deve essere modificato.
Prima di codificare la soluzione, assicurati di codificare anche i test per assicurarti che le funzioni che stai chiamando producano valori previsti.
Altri suggerimenti
Sono d'accordo con ndim
. Calcolare la direzione da un punto all'altro è facile. Non capisco quale contesto richiederebbe la tua direzione da una linea. È un'applicazione di mappatura? C'è una strada e circa a metà lungo un tratto di strada hai un punto sul lato?
La semantica di ciò che " nord " o " NE " oppure "est" di un segmento di linea in realtà significa che non è chiaro.
Indicazioni come " nord " oppure "est" o " NE " vengono generalmente utilizzati per descrivere la posizione di un punto rispetto a un altro punto (base). Qual è il punto sul segmento di linea che stai usando come punto base?
MODIFICA: Ora che dici di voler usare il punto finale (x2, y2)
come punto centrale per la bussola, un punto (x , y)
verrà posizionato rispetto alla bussola esaminando il vettore delta (x-x2, y-y2)
.
Il facile ragionamento sul metodo utilizza atan2 ()
sul vettore delta e considera l'angolo restituito da atan2 ()
.
Tuttavia, potrebbe anche essere una buona idea confrontare gli argomenti con atan2 ()
tra loro e determinare gli intervalli di angolo risultanti da quello. Questo in pratica evita di chiamare atan2 ()
in fase di esecuzione a spese della necessità di eseguire alcuni calcoli in fase di compilazione (o prima).