Retta passante per 2 punti nello spazio 3D
-INPUT: $P1=(x_{1}, y_{1}, z_{1}) P2=(x_{2}, y_{2}, z_{2}) P3=(x_{3}, y_{3}, z_{3}) $
-OBIETTIVO:
P1 -> Posizione primo satellite
P2 -> Posizione secondo satellite
P3 -> Posizione del centro della Terra (che non è sempre lo stesso perchè la terra si deve muovere)
Quello che voglio fare è vedere se il primo e secondo satellite riescono a guardarsi.
Per farlo, devo trovare la retta che passa per P1,P2 e verificare che la distanza tra questa retta ed il centro della Terra (P3) sia maggiore del raggio medio della terra.
-Procedimento:
Pongo:
$l = x_{2} - x_{1} $
$m = y_{2} - y_{1} $
$n = z_{2} - z_{1} $
Risolvo rispetto a "d" l'equazione:
$l*x_{3}+m*y_{3}+n*z_{3}+d=0 $
Adesso risolvo il seguente sistema con 3 equazioni:
$lx+my+nz+d=0 $(mettendoci l,m,n,d trovati)
$(x-x_{1})/(x_{2}-x_{1})=(y-y_{1})/(y_{2}-y_{1}) $
$(y-y_{1})/(y_{2}-y_{1})=(z-z_{1})/(z_{2}-z_{1}) $
e trovo un punto che chiamerò $H=(x_{h}, y_{h}, z_{h})$
Infine calcolo la distanza tra P3 ed H:
$d=sqrt((x_{3}-x_{h})^2+(y_{3}-y_{h})^2+(z_{3}-z_{h})^2) $
E questo è il risultato cercato.
La prima cosa che voglio chiedere è se il sistema di queste due equazioni:
$(x-x_{1})/(x_{2}-x_{1})=(y-y_{1})/(y_{2}-y_{1}) $
$(y-y_{1})/(y_{2}-y_{1})=(z-z_{1})/(z_{2}-z_{1}) $
è la retta passante per quei due punti.
La seconda cosa e ben più importante è:
se $x_{1}=x_{2}$ o/e $ y_{1}=y_{2}$ o/e $ z_{1}=z_{2}$
quelle formule non sono più valide ed io non so più come fare!!!
Grazie per il vostro aiuto.
-OBIETTIVO:
P1 -> Posizione primo satellite
P2 -> Posizione secondo satellite
P3 -> Posizione del centro della Terra (che non è sempre lo stesso perchè la terra si deve muovere)
Quello che voglio fare è vedere se il primo e secondo satellite riescono a guardarsi.
Per farlo, devo trovare la retta che passa per P1,P2 e verificare che la distanza tra questa retta ed il centro della Terra (P3) sia maggiore del raggio medio della terra.
-Procedimento:
Pongo:
$l = x_{2} - x_{1} $
$m = y_{2} - y_{1} $
$n = z_{2} - z_{1} $
Risolvo rispetto a "d" l'equazione:
$l*x_{3}+m*y_{3}+n*z_{3}+d=0 $
Adesso risolvo il seguente sistema con 3 equazioni:
$lx+my+nz+d=0 $(mettendoci l,m,n,d trovati)
$(x-x_{1})/(x_{2}-x_{1})=(y-y_{1})/(y_{2}-y_{1}) $
$(y-y_{1})/(y_{2}-y_{1})=(z-z_{1})/(z_{2}-z_{1}) $
e trovo un punto che chiamerò $H=(x_{h}, y_{h}, z_{h})$
Infine calcolo la distanza tra P3 ed H:
$d=sqrt((x_{3}-x_{h})^2+(y_{3}-y_{h})^2+(z_{3}-z_{h})^2) $
E questo è il risultato cercato.
La prima cosa che voglio chiedere è se il sistema di queste due equazioni:
$(x-x_{1})/(x_{2}-x_{1})=(y-y_{1})/(y_{2}-y_{1}) $
$(y-y_{1})/(y_{2}-y_{1})=(z-z_{1})/(z_{2}-z_{1}) $
è la retta passante per quei due punti.
La seconda cosa e ben più importante è:
se $x_{1}=x_{2}$ o/e $ y_{1}=y_{2}$ o/e $ z_{1}=z_{2}$
quelle formule non sono più valide ed io non so più come fare!!!
Grazie per il vostro aiuto.
Risposte
[mod="cirasa"]Non capisco perchè tu abbia aperto un nuovo thread per risolvere una questione che avevi già richiesto.
Avresti potuto semplicemente "uppare" quello precedente, visto che la tua richiesta era passata inosservata.
Un utente che legge solo questo non capisce nemmeno di cosa si sta parlando.
Per cortesia, togli la parte del testo tutto in maiuscolo, come da regolamento.
[/mod]
L'algoritmo, ad uno sguardo veloce, sembra giusto.
Purtroppo non ho potuto controllarlo nel dettaglio, perchè senza le formule è molto difficoltoso farlo.
Se puoi, modifica il tuo messaggio usando nel modo corretto le formule (clic, usa il MathML se non conosci il LaTeX).
Vedrai che dopo il tuo messaggio sarà molto più chiaro e troverai più utenti disposti a leggere il tuo lungo messaggio.
Per quanto riguarda il secondo problema, se ne è parlato pochi giorni fa. Dacci un'occhiata.
Avresti potuto semplicemente "uppare" quello precedente, visto che la tua richiesta era passata inosservata.
Un utente che legge solo questo non capisce nemmeno di cosa si sta parlando.
Per cortesia, togli la parte del testo tutto in maiuscolo, come da regolamento.
[/mod]
L'algoritmo, ad uno sguardo veloce, sembra giusto.
Purtroppo non ho potuto controllarlo nel dettaglio, perchè senza le formule è molto difficoltoso farlo.
Se puoi, modifica il tuo messaggio usando nel modo corretto le formule (clic, usa il MathML se non conosci il LaTeX).
Vedrai che dopo il tuo messaggio sarà molto più chiaro e troverai più utenti disposti a leggere il tuo lungo messaggio.
Per quanto riguarda il secondo problema, se ne è parlato pochi giorni fa. Dacci un'occhiata.
Ho modificato il messaggio come mi hai consigliato così è più leggibile.
Spero che adesso mi saprete dire se questo modo di fare è corretto.
Sono andato a guardare il post precedente ma sinceramente non ci ho capito molto....
Potreste rispiegarmelo magari dicendomi anche come il calcolo diverso della retta si riflette nel calcolo successivo della distanza?
Grazie 10000
Spero che adesso mi saprete dire se questo modo di fare è corretto.
Sono andato a guardare il post precedente ma sinceramente non ci ho capito molto....
Potreste rispiegarmelo magari dicendomi anche come il calcolo diverso della retta si riflette nel calcolo successivo della distanza?
Grazie 10000
Innanzitutto ti ringrazio per aver modificato il tuo messaggio iniziale. Ora è perfetto.
Il tuo algoritmo funzionerebbe sempre (anche nei casi "fastidiosi"), se facessi queste modifiche:
Dovresti sostituire a (1) e (2) le tre seguenti equazioni:
$(x-x_{1})(y_{2}-y_{1})=(y-y_{1})(x_{2}-x_{1}) $ (1)'
$(y-y_{1})(z_{2}-z_{1})=(z-z_{1})(y_{2}-y_{1}) $ (2)'
$(x-x_{1})(z_{2}-z_{1})=(z-z_{1})(x_{2}-x_{1}) $ (3)'
Le (1)',(2)',(3)' sono equivalenti alle (1),(2) nel caso buono.
Ma funzionano anche nel caso "fastidioso", cioè quando $x_1=x_2$ o $y_1=y_2$ oppure $z_1=z_2$.
Il tuo algoritmo funzionerebbe sempre (anche nei casi "fastidiosi"), se facessi queste modifiche:
"andreaandrea":
...
Adesso risolvo il seguente sistema con 3 equazioni:
$lx+my+nz+d=0 $(mettendoci l,m,n,d trovati)
$(x-x_{1})/(x_{2}-x_{1})=(y-y_{1})/(y_{2}-y_{1}) $ (1)
$(y-y_{1})/(y_{2}-y_{1})=(z-z_{1})/(z_{2}-z_{1}) $ (2)
e trovo un punto che chiamerò $H=(x_{h}, y_{h}, z_{h})$
...
Dovresti sostituire a (1) e (2) le tre seguenti equazioni:
$(x-x_{1})(y_{2}-y_{1})=(y-y_{1})(x_{2}-x_{1}) $ (1)'
$(y-y_{1})(z_{2}-z_{1})=(z-z_{1})(y_{2}-y_{1}) $ (2)'
$(x-x_{1})(z_{2}-z_{1})=(z-z_{1})(x_{2}-x_{1}) $ (3)'
Le (1)',(2)',(3)' sono equivalenti alle (1),(2) nel caso buono.
Ma funzionano anche nel caso "fastidioso", cioè quando $x_1=x_2$ o $y_1=y_2$ oppure $z_1=z_2$.
Per prima cosa sono io a ringraziare te per la risposta ed anzi colgo l'occasione per dirti che qualora ogni tanto facessi qualche errore nel mettere i miei post non è per scortesia nei confronti del forum del quale ho profondo rispetto e grande stima per l'aiuto che da a tante persone ogni giorno.
Fatta questa giusta premessa, non mi è chiara una cosa:
nel mio programma, devo sostituire al mio sistema di tre equazioni, un sistema di 4 equazioni in 3 incognite? Perchè? Non basterebbe scriverne due ma nella forma senza denominatore?Tutto questo vale anche se si verifica una sola delle condizioni precedentemente dette? e sai pure se questo può creare problemi in matlab quando risolvo il sistema A*H=b con il comando H=b\A ?
Detto questo, mi resta un altro dubbio..... Questo sistema che tu mi hai dato, mi da sempre, in ogni caso possibile che ti venga in mente, senza nessuna eccezione, un unico punto come soluzione? E trovato questo punto quindi posso sempre calcolare la distanza come facevo?
Mi scuso per le mille domande ma essendo una parte importante per la mia tesi, non vorrei avere spiacevoli sorprese.....
Grazie tante.
Fatta questa giusta premessa, non mi è chiara una cosa:
nel mio programma, devo sostituire al mio sistema di tre equazioni, un sistema di 4 equazioni in 3 incognite? Perchè? Non basterebbe scriverne due ma nella forma senza denominatore?Tutto questo vale anche se si verifica una sola delle condizioni precedentemente dette? e sai pure se questo può creare problemi in matlab quando risolvo il sistema A*H=b con il comando H=b\A ?
Detto questo, mi resta un altro dubbio..... Questo sistema che tu mi hai dato, mi da sempre, in ogni caso possibile che ti venga in mente, senza nessuna eccezione, un unico punto come soluzione? E trovato questo punto quindi posso sempre calcolare la distanza come facevo?
Mi scuso per le mille domande ma essendo una parte importante per la mia tesi, non vorrei avere spiacevoli sorprese.....
Grazie tante.
Avevo dimenticato che dovessi usare il Matlab per l'algoritmo.
Il problema è questo. I punti $P_1=(x_1,y_1,z_1)$ e $P_1=(x_2,y_2,z_3)$ in input sono diversi.
Quindi almeno una delle tre coordinate di $P_1$ è diversa dalla corrispondente coordinata di $P_2$.
Se sono tutte e tre diverse o se solo una è diversa allora puoi tranquillamente usare il sistema
(*) ${((x-x_1)(y_2-y_1)=(y-y_1)(x_2-x_1)),((x-x_1)(z_2-z_1)=(z-z_1)(x_2-x_1)):}$
per rappresentare la retta da $P_1$ a $P_2$ (e quindi aggiungendo l'altra equazione ottieni un sistema tre equazioni in tre incognite).
Ma può capitare anche il caso in cui due coordinate di $P_1$ sono uguali alle corrispondenti di $P_2$, per esempio, $x_1=x_2$ e $y_1=y_2$ (e naturalmente $z_1!=z_2$). In questo caso la prima equazione del sistema (*) si riduce ad un inutile $0=0$ e pertanto devi usare altre equazioni.
La prima soluzione che mi viene in mente, non so se è la più efficiente, è quella di prevedere un controllo $"if"$ prima della definizione del sistema da risolvere.
Precisamente io suggerirei una cosa del genere (con $r$ ho indicato la retta da $P_1$ a $P_2$):
Non mi ricordo la sintassi del Matlab, spero che si capisca.
Il problema è questo. I punti $P_1=(x_1,y_1,z_1)$ e $P_1=(x_2,y_2,z_3)$ in input sono diversi.
Quindi almeno una delle tre coordinate di $P_1$ è diversa dalla corrispondente coordinata di $P_2$.
Se sono tutte e tre diverse o se solo una è diversa allora puoi tranquillamente usare il sistema
(*) ${((x-x_1)(y_2-y_1)=(y-y_1)(x_2-x_1)),((x-x_1)(z_2-z_1)=(z-z_1)(x_2-x_1)):}$
per rappresentare la retta da $P_1$ a $P_2$ (e quindi aggiungendo l'altra equazione ottieni un sistema tre equazioni in tre incognite).
Ma può capitare anche il caso in cui due coordinate di $P_1$ sono uguali alle corrispondenti di $P_2$, per esempio, $x_1=x_2$ e $y_1=y_2$ (e naturalmente $z_1!=z_2$). In questo caso la prima equazione del sistema (*) si riduce ad un inutile $0=0$ e pertanto devi usare altre equazioni.
La prima soluzione che mi viene in mente, non so se è la più efficiente, è quella di prevedere un controllo $"if"$ prima della definizione del sistema da risolvere.
Precisamente io suggerirei una cosa del genere (con $r$ ho indicato la retta da $P_1$ a $P_2$):
Se $x_1!=x_2$ il sistema che definisce la retta $r$ è il sistema (*) altrimenti se $y_1!=y_2$ il sistema che definisce la retta $r$ è ${((y-y_1)(x_2-x_1)=(x-x_1)(y_2-y_1)),((y-y_1)(z_2-z_1)=(z-z_1)(y_2-y_1)):}$ altrimenti il sistema che definisce la retta $r$ è ${(x=x_1),(y=y_1):}$ end if end if
Non mi ricordo la sintassi del Matlab, spero che si capisca.
secondo me questo modo non va bene perchè non tiene in considerazione che mgari sono altre coppie ad annullarsi insieme!! Magari potrei avere $x_{1}=x_{2}$ e $z_{1}=z_{2}$ !!
Ma la domanda è al di la dell'efficienza che credo cambi pochissimo, se io metto il sistema in 4 equazioni che mi hai scritto all'inizio, faccio un errore? Oppure se uso quello sicuramente è tutto giusto sempre? Perchè se fosse così uso quello e mi sono tolto il problema!
Ma la domanda è al di la dell'efficienza che credo cambi pochissimo, se io metto il sistema in 4 equazioni che mi hai scritto all'inizio, faccio un errore? Oppure se uso quello sicuramente è tutto giusto sempre? Perchè se fosse così uso quello e mi sono tolto il problema!
"andreaandrea":No, questo caso l'ho contemplato. Infatti in questo caso si avrebbe $y_1!=y_2$ e l'equazione della retta sarebbe:
secondo me questo modo non va bene perchè non tiene in considerazione che mgari sono altre coppie ad annullarsi insieme!! Magari potrei avere $x_{1}=x_{2}$ e $z_{1}=z_{2}$ !!
${((y-y_1)(x_2-x_1)=(x-x_1)(y_2-y_1)),((y-y_1)(z_2-z_1)=(z-z_1)(y_2-y_1)):}$
ovvero
${(x=x_1),(z=z_1):}$
che è quella che cercavamo.
Non ti preoccupare con l'algoritmo che ti ho dato, becchi tutti i casi.
"andreaandrea":
Ma la domanda è al di la dell'efficienza che credo cambi pochissimo, se io metto il sistema in 4 equazioni che mi hai scritto all'inizio, faccio un errore?
Guarda, sinceramente non mi ricordo se Matlab sa risolvere i sistemi (compatibili) 4 equazioni in 3 incognite. Bisognerebbe guardarsi la guida.
si si, matlab sa risolvere tutto quanto!! l'importante è che mi assicuri che quel sistema di 4 equazioni in 3 incognite va bene in tutti i casi e mi da sempre e solo un punto (Questa è una cosa che devo sapere ed è importantissima perchè se il sistema magari ha dei casi in cui non tira fuori il punto, l'algoritmo di matlab impazzisce completamente!!)E questo punto èpoi quello da cio faccio la distanza per trovare la distanza tra il punto iniziale e la retta, SEMPRE?
(comunque è più una curiosità che altro perchè penso che userò il tuo algoritmo se mi assicuri al 100% che è giusto!)
(comunque è più una curiosità che altro perchè penso che userò il tuo algoritmo se mi assicuri al 100% che è giusto!)
Ricapitoliamo per l'ultima volta:
- Il mio algoritmo ti restituisce SEMPRE l'equazione della retta $r$ passante per i due punti. Poi metti e sistema con l'altra equazione (quella del piano ortogonale alla retta $r$ e passante per $P_3$) e ottieni SEMPRE il punto $H$ per cui la distanza fra $P_3$ e $H$ è uguale alla distanza fra $P_3$ e la retta $r$.
- Per ottenere il punto $H$ in maniera alternativa basta risolvere il sistema formato dalle tre equazioni
$(x-x_1)(y_2-y_1)=(y-y_1)(x_2-x_1)$
$(x-x_1)(z_2-z_1)=(z-z_1)(x_2-x_1)$
$(y-y_1)(z_2-z_1)=(z-z_1)(y_2-y_1)$
e l'equazione del piano ortogonale. E risolvendo questo sistema (4 equazioni in 3 incognite) ottieni SEMPRE il punto $H$.
Ora fa' come più ti aggrada.
- Il mio algoritmo ti restituisce SEMPRE l'equazione della retta $r$ passante per i due punti. Poi metti e sistema con l'altra equazione (quella del piano ortogonale alla retta $r$ e passante per $P_3$) e ottieni SEMPRE il punto $H$ per cui la distanza fra $P_3$ e $H$ è uguale alla distanza fra $P_3$ e la retta $r$.
- Per ottenere il punto $H$ in maniera alternativa basta risolvere il sistema formato dalle tre equazioni
$(x-x_1)(y_2-y_1)=(y-y_1)(x_2-x_1)$
$(x-x_1)(z_2-z_1)=(z-z_1)(x_2-x_1)$
$(y-y_1)(z_2-z_1)=(z-z_1)(y_2-y_1)$
e l'equazione del piano ortogonale. E risolvendo questo sistema (4 equazioni in 3 incognite) ottieni SEMPRE il punto $H$.
Ora fa' come più ti aggrada.
PERFETTO!! Sei un GRANDE! Scusa se l'ho scritto maiuscolo ma era per mettere in evidenza la mia GRATITUDINE!!
Grazie Grazie Grazie
Grazie Grazie Grazie
Prego. E in bocca al lupo per la tua tesi
