Si tiene, o puede calcular fácilmente, el vector normal para el plano en el que se encuentran actualmente sus puntos, creo que la forma más fácil de hacerlo será girar alrededor del eje común a los dos planos. Así es como me gustaría ir al respecto:
- Let
M
el vector normal a su plano actual, y N
el vector normal al plano que desea girar en. Si M == N
puede detenerse ahora y dejar los puntos originales sin cambios.
calcular el ángulo de rotación como
costheta = dot(M,N)/(norm(M)*norm(N))
Calcular el eje de rotación como
axis = unitcross(M, N)
donde unitcross
es una función que realiza el producto cruzado y normaliza a un vector unitario, es decir, unitcross(a, b) = cross(a, b)/norm(cross(a, b))
. Como user1318499 señaló en un comentario, este paso puede causar un error si M == N
, a menos que su implementación de unitcross
devuelva (0,0,0)
cuando a == b
.
Calcular la matriz de rotación desde el eje y el ángulo como
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 ])
donde x
, y
, y z
son los componentes de axis
. Esta fórmula se describe on Wikipedia.
Para cada punto, calcular su punto correspondiente en el nuevo plano que
newpoint = dot(rmat, point)
donde la función de dot
realiza la multiplicación de la matriz.
Esto no es único, por supuesto; como se menciona en la respuesta de peterk, hay un número infinito de rotaciones posibles que podrían transformar el plano normal a M
en el plano normal a N
. Esto corresponde al hecho de que, después de seguir los pasos descritos anteriormente, puede rotar el plano alrededor de N
, y sus puntos estarán en lugares diferentes mientras permanece en el mismo plano. (En otras palabras, cada rotación que puede hacer que satisfaga sus condiciones corresponde a hacer el procedimiento descrito anteriormente seguido de otra rotación alrededor de N
). Pero si no le importa en qué punto del avión terminan sus puntos, creo que esta rotación el eje común es la forma más sencilla para obtener sólo los puntos en el plano que los quiere en.
Si usted no tiene M
, pero tiene las coordenadas de los puntos en el plano de partida relativa a un origen en ese plano, puede calcular el vector normal de partida desde las posiciones de dos puntos x1
y x2
como
M = cross(x1, x2)
(también puede usar unitcross
aquí pero no hace ninguna diferencia). Si usted tiene los puntos coordenadas relativas a un origen que no está en el plano, todavía puede hacerlo, pero tendrá que tres puntos posiciones:
M = cross(x3-x1, x3-x2)
+1 Buena respuesta. La única queja (en la medida en que se eleva al nivel de una queja, lo cual es cuestionable) es que no mencionaron la rotación de cuaternión como una posible alternativa a los pasos 4 y 5. Son algo más eficientes. – andand
@andand: generalmente hago este tipo de cosas analíticamente, así que no estoy completamente familiarizado con los cuaterniones. Pero si tengo tiempo lo editaré. –
Un buen resumen está en http://en.wikipedia.org/wiki/Quaternion_rotation – andand