Se si dispone, o si può calcolare facilmente, il vettore normale sul piano in cui si trovano attualmente i punti, penso che il modo più semplice per farlo sarà quello di ruotare attorno all'asse comune ai due piani. Ecco come mi piacerebbe andare a questo proposito:
- Sia
M
essere il vettore normale al piano attuale, e N
il vettore normale al piano da ruotare in. Se M == N
puoi fermarti ora e lasciare invariati i punti originali.
calcolare l'angolo di rotazione
costheta = dot(M,N)/(norm(M)*norm(N))
Calcolare l'asse di rotazione come
axis = unitcross(M, N)
dove unitcross
è una funzione che esegue il prodotto vettoriale e normalizza ad un vettore unitario, cioè unitcross(a, b) = cross(a, b)/norm(cross(a, b))
. Come indicato da user1318499 in un commento, questo passaggio può causare un errore se M == N
, a meno che l'implementazione di unitcross
restituisca (0,0,0)
quando a == b
.
Calcolare la matrice di rotazione dall'asse e angolo come
c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
dove x
, y
, e z
sono componenti axis
. Questa formula è descritta on Wikipedia.
Per ciascun punto, calcolare il punto corrispondente sulla nuovo piano come
newpoint = dot(rmat, point)
dove la funzione dot
esegue la moltiplicazione di matrici.
Questo non è univoco, ovviamente; come accennato nella risposta di peterk, ci sono un numero infinito di rotazioni possibili che potrebbero trasformare il piano normale in M
nel piano normale a N
. Ciò corrisponde al fatto che, dopo aver eseguito i passaggi sopra descritti, è possibile ruotare l'aereo attorno a N
ei punti si troveranno in posizioni diverse pur rimanendo sullo stesso piano. (In altre parole, ogni rotazione che puoi fare per soddisfare le tue condizioni corrisponde a fare la procedura descritta sopra seguita da un'altra rotazione attorno allo N
.) Ma se non ti interessa dove nell'aereo finiscono i tuoi punti, penso che questa rotazione intorno l'asse comune è il modo più semplice per ottenere solo i punti nel piano li volete a.
Se non si dispone di M
, ma avete le coordinate dei punti nel vostro piano di partenza relativa a un'origine in quel piano, è possibile calcolare il vettore normale iniziale dalle posizioni di due punti x1
e x2
come
M = cross(x1, x2)
(è anche possibile utilizzare unitcross
qui ma non fa alcuna differenza). Se si dispone di punti coordinate relative ad un'origine che non è nel piano, si può ancora farlo, ma avrete bisogno di tre punti posizioni:
M = cross(x3-x1, x3-x2)
fonte
2012-02-24 00:56:54
+1 buona risposta. L'unica lamentela (nella misura in cui sale al livello di una lamentela, che è discutibile) che ho è che non hai menzionato Quaternion Rotation come possibile alternativa ai passaggi 4 e 5. Sono un po 'più efficienti. – andand
@andand: di solito sto facendo questo genere di cose analiticamente, quindi non ho completamente familiarità con i quaternioni. Ma se avrò tempo lo modifico. –
Un buon sommario è su http://en.wikipedia.org/wiki/Quaternion_rotation – andand