Spostamento sistema di riferimento e rotazione

array811
Mi trovo a sviluppare un piccolo programma che tra le altre cose deve effettuare operazioni con dei punti nello SPAZIO. Visto che è passato del tempo da quando mi cimentavo con queste cose spero qualcuno possa consigliarmi la strada.
Vi illustro sinteticamente cosa dovrei fare parendo da quello che conosco:
1. sistema di riferimento (che chiameremo globale);
2. serie di punti di coordinate note rispetto al sistema globale (che chiameremo P1, P2, ..., Pn);
3. sistema di riferimento con origine in Px (che chiameremo sistema locale 1) di cui è noto l'orientamento rispetto al sistema globale (il sistema locale 1 risulta traslato e ruotato rispetto a quello globale);
4. un terzo sistema di coordinate (che chiameremo sistema locale 2)
5. serie di punti di coordinate note rispetto al sistema locale 2 (che chiameremo O1, O2, ..., On);

Definito un punto Ox del terzo gruppo devo:
1. spostare tutti i punti O dal sistema locale 2 al sistema locale 1 in modo che Ox corrisponda con Px e che l'asse Z dei 2 sistemi coincidano (gli assi X e Y non mi interessano, ovviamente si troveranno sullo stesso piano);
2. ruotare i punti O del punto precedente intorno all'asse Z del sistema locale 1 di un certo angolo;

Spero di essermi spiegato, di fatto credo sia più facile a farlo che a descrivere la cosa.
Se non sono stato chiaro ditemelo che vedo di cambiare la descrizione.

Risposte
niccoset
Per il punto 1 l'idea potrebbe essere quella di traslare rispetto al world frame (il sdr globale [anche se in computer graphics si parla più spesso di frame]) il sistema di riferimento 2 in modo che la sua origine vada a coincidere con il sistema di riferimento 1 e successivamente ruotarlo in maniera adeguata così da far coincidere i loro assi z. In pratica per prima cosa potresti ricavarti lo scostamento tra i due sistemi di riferimento 1 e 2 che è dato dalla differenza dei due vettori $ vec(P_x)-vec(O_x) $ (in coordinate del world frame) e quindi applicare una matrice affine rappresentante la traslazione ricavata al sistema di riferimento 2 in modo da far coincidere le origini dei due sistemi. Successivamente (forse con qualche difficoltà in più, ma non troppe) potresti ruotare il sdr 2 (o indifferentemente il sdr 1) rispetto a se stesso in modo da far coincidere i due assi z, in termini matriciali dovresti utilizzare una composizione di rotazioni per far ruotare in modo adeguato il tuo sistema attorno a un asse generico oppure più semplicemente utilizzare la formula di Rodrigues' (https://en.wikipedia.org/wiki/Rodrigues ... on_formula) che fornisce la matrice di rotazione attorno a un asse generico.

Il punto 2 è semplicemente una rotazione rispetto al frame (sistema di riferimento) ottenuto in precedenza attorno al suo asse z. Detto $ vec(f)^t $ il frame ottenuto e $ tilde(p) = vec(f)^t \mathfrak(c) $ un generico punto espresso in coordinare del nuovo sistema di riferimento, il nuovo punto ruotato rispetto a z di un angolo $theta$ è dato da $ tilde(p) = vec(f)^t R \mathfrak(c) $ dove $ R = [ ( costheta , -sintheta , 0 ),( sintheta , costheta , 0 ),( 0 , 0 , 1 ) ] $.

array811
"niccoset":
Per il punto 1 l'idea potrebbe essere quella di traslare rispetto al world frame (il sdr globale [anche se in computer graphics si parla più spesso di frame]) il sistema di riferimento 2 in modo che la sua origine vada a coincidere con il sistema di riferimento 1 e successivamente ruotarlo in maniera adeguata così da far coincidere i loro assi z. In pratica per prima cosa potresti ricavarti lo scostamento tra i due sistemi di riferimento 1 e 2 che è dato dalla differenza dei due vettori $ vec(P_x)-vec(O_x) $ (in coordinate del world frame) e quindi applicare una matrice affine rappresentante la traslazione ricavata al sistema di riferimento 2 in modo da far coincidere le origini dei due sistemi. Successivamente (forse con qualche difficoltà in più, ma non troppe) potresti ruotare il sdr 2 (o indifferentemente il sdr 1) rispetto a se stesso in modo da far coincidere i due assi z, in termini matriciali dovresti utilizzare una composizione di rotazioni per far ruotare in modo adeguato il tuo sistema attorno a un asse generico oppure più semplicemente utilizzare la formula di Rodrigues' (https://en.wikipedia.org/wiki/Rodrigues ... on_formula) che fornisce la matrice di rotazione attorno a un asse generico.

Il punto 2 è semplicemente una rotazione rispetto al frame (sistema di riferimento) ottenuto in precedenza attorno al suo asse z. Detto $ vec(f)^t $ il frame ottenuto e $ tilde(p) = vec(f)^t \mathfrak(c) $ un generico punto espresso in coordinare del nuovo sistema di riferimento, il nuovo punto ruotato rispetto a z di un angolo $theta$ è dato da $ tilde(p) = vec(f)^t R \mathfrak(c) $ dove $ R = [ ( costheta , -sintheta , 0 ),( sintheta , costheta , 0 ),( 0 , 0 , 1 ) ] $.


Scusa se rispondo solo ora ma non ho molto tempo da dedicare alla cosa purtroppo.
Non conosco la formula di Rodrigues' sto quindi cercando qualche esempio di applicazione pratica della stessa data che a prima vista non mi sembra proprio immediata. Grazie comunque della dritta.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.