Intersezione retta-piano in Matlab
Ragazzi dubbio gigantesco: in Matlab devo trovare l'intersezione tra una retta (di cui ho due punti) e un piano (di cui ho un punto e le direzioni dei vettori che lo individuano). Avete qualche suggerimento su come fare? Grazie in anticipo a tutti!

Risposte
Come lo faresti se ti venisse chiesto in un esame di geometria?
Farei il sistema con le equazioni della retta e del piano in forma parametrica e, una volta trovati i valori dei parametri, li sostituirei nelle equazioni trovando il punto.
Però speravo che Matlab avesse qualcosa di più comodo, so che esiste la funzione polyxpoly che trova le intersezioni tra spezzate ma funziona solo in due dimensioni e a me serve stare nello spazio.


Ma risolvere sistemi lineari è molto facile in matlab se hai la matrice dei coefficienti. Il tuo primo passaggio è quindi quello di trovare un modo per calcolare la matrice dei coefficienti del sistema. Come è fatto questo sistema? Una volta che hai la matrice dei coefficienti devi semplicemente usare l'operatore \ per risolverla (mldivide).
Per avere la matrice dei coefficienti dovrei calcolarla a mano per ogni piano con cui devo intersecare la retta, e viene una cosa improponibile perchè i piani possono cambiare da un'esecuzione con l'altra.
In sostanza devo trovare le intersezioni tra un raggio (di dati punti di partenza e arrivo) e un volume messo da qualche parte in mezzo tra la partenza e l'arrivo del raggio..ma sia il volume che il raggio cambiano di volta in volta quindi, ho pensato adesso, potrei approssimare il volume con una sfera a esso circoscritta, a quel punto trovo il centro e il raggio della sfera e per differenza tra segmenti posso trovare la parte di raggio esterna al volume. Secondo te può funzionare? La precisione richiesta è piuttosto bassa, più avanti nel codice verrà raffinata.

In sostanza devo trovare le intersezioni tra un raggio (di dati punti di partenza e arrivo) e un volume messo da qualche parte in mezzo tra la partenza e l'arrivo del raggio..ma sia il volume che il raggio cambiano di volta in volta quindi, ho pensato adesso, potrei approssimare il volume con una sfera a esso circoscritta, a quel punto trovo il centro e il raggio della sfera e per differenza tra segmenti posso trovare la parte di raggio esterna al volume. Secondo te può funzionare? La precisione richiesta è piuttosto bassa, più avanti nel codice verrà raffinata.
Prova a scrivere la formula generale di questa matrice dei coefficienti invece.
Ci ho provato ma viene una cosa troppo complicata, l'espediente della sfera invece funziona a perfezione per i miei scopi!
Grazie comunque per l'aiuto!


Prendiamo la retta: \( r : (1 - t) \, P_0 + t \, P_1 \) e il piano \( \pi : O + u \, \boldsymbol{d_1} + v \, \boldsymbol{ d_2} \). Un punto che appartiene sia alla retta che al piano deve soddisfare l'identità seguente per almeno una tripla \((t, u, v)\):
\[ P_0 + t \, (P_1 - P_0) = O + u \, \boldsymbol{d_1} + v \, \boldsymbol{ d_2}. \]
Si tratta quindi di risolvere il seguente sistema (espresso in forma vettoriale):
\[ t \, (P_1 - P_0) - u \, \boldsymbol{d_1} - v \, \boldsymbol{ d_2} = O - P_0. \]
Se quindi P0, P1, O, d1 e d2 sono delle matrici colonna per rappresentare i punti e le direzioni rispettivamente, allora il punto di intersezione dovrebbe essere semplicemente:
\[ P_0 + t \, (P_1 - P_0) = O + u \, \boldsymbol{d_1} + v \, \boldsymbol{ d_2}. \]
Si tratta quindi di risolvere il seguente sistema (espresso in forma vettoriale):
\[ t \, (P_1 - P_0) - u \, \boldsymbol{d_1} - v \, \boldsymbol{ d_2} = O - P_0. \]
Se quindi P0, P1, O, d1 e d2 sono delle matrici colonna per rappresentare i punti e le direzioni rispettivamente, allora il punto di intersezione dovrebbe essere semplicemente:
hit = [(P1 - P0); -d1; -d2] \ (O - P0);
Ma se risolvo il sistema come dici giustamente tu trovo la terna (t,u,v), che però non corrisponde alle coordinate del punto, giusto? Devo ancora sostituire questi valori nell'equazione della retta o in quella del piano se ho capito bene.. Comunque grazie mille per il chiarimento, questi conti li avevo fatti anche io a mano ma senza riuscire a passare alla generalizzazione.

ma è sufficiente usare \(t\) e inserirlo nell'equazione della retta.