Proiezione di un punto su una retta
La situazione è questa:
nel piano cartesiano bidimensionale ho le coordinate (x,y) di un punto e le cooridnate degli estremi di un segmento (xA,yA) (xB,yB). Voglio controllare se la proiezione ortogonale del punto sulla retta che contiene il segmento appartiene al segmento. Dato che devo poi scrivere un algoritmo per un programma volevo chiedervi se avete un'idea migliore di quella che ho avuto io, che è:
- calcolo l'equazione della retta per i due estremi
- calcolo la perpendicolare al segmento passante per (x,y)
- le interseco, ottengo (p,q)
- se ( $xA<=p<=xB$ oppure $xB<=p<=xA$ ) e ( $yA<=q<=yB$ oppure $yB<=q<=yA$ ) allora la proiezione sta sul segmento, altrimenti no
questa richiede un po' di casi fatta fare ad un computer nel caso generale (per calcolare la perpendicolare devo stare attenta che la retta non sia orizzontale se no con la formula classica divido per 0, quando interseco le rette la formula non è la stessa in tutti i casi), non c'è un metodo più semplice?
nel piano cartesiano bidimensionale ho le coordinate (x,y) di un punto e le cooridnate degli estremi di un segmento (xA,yA) (xB,yB). Voglio controllare se la proiezione ortogonale del punto sulla retta che contiene il segmento appartiene al segmento. Dato che devo poi scrivere un algoritmo per un programma volevo chiedervi se avete un'idea migliore di quella che ho avuto io, che è:
- calcolo l'equazione della retta per i due estremi
- calcolo la perpendicolare al segmento passante per (x,y)
- le interseco, ottengo (p,q)
- se ( $xA<=p<=xB$ oppure $xB<=p<=xA$ ) e ( $yA<=q<=yB$ oppure $yB<=q<=yA$ ) allora la proiezione sta sul segmento, altrimenti no
questa richiede un po' di casi fatta fare ad un computer nel caso generale (per calcolare la perpendicolare devo stare attenta che la retta non sia orizzontale se no con la formula classica divido per 0, quando interseco le rette la formula non è la stessa in tutti i casi), non c'è un metodo più semplice?
Risposte
La proiezione del punto $P(x_P,y_P)$ appartiene al segmento AB se gli angoli $PhatAB$ e $PhatBA$ sono entrambi acuti (o al limite retti).
Ti basta allora controllare che il prodotto scalare $vec(AP)*vec(AB)>=0$ e che $vec(BP)*vec(BA)>=0$
In coordinate cartesiane:
$(x_P-x_A)(x_B-x_A)+(y_P-y_A)(y_B-y_A)>=0$ and $(x_P-x_B)(x_A-x_B)+(y_P-y_B)(y_A-y_B)>=0$
Ti basta allora controllare che il prodotto scalare $vec(AP)*vec(AB)>=0$ e che $vec(BP)*vec(BA)>=0$
In coordinate cartesiane:
$(x_P-x_A)(x_B-x_A)+(y_P-y_A)(y_B-y_A)>=0$ and $(x_P-x_B)(x_A-x_B)+(y_P-y_B)(y_A-y_B)>=0$
Grazie mille, capito, così è molto più veloce
