Tengo un conjunto de puntos de datos en el espacio 3D que aparentemente todos caen en un plano específico. Uso PCA para calcular los parámetros del plano. El 3er componente de PCA me da el vector normal del avión (componente más débil).Girar vector normal en el plano del eje
Lo que quiero hacer a continuación es transformar todos los puntos en dicho plano y mirarlo en 2D.
Mi idea era hacer lo siguiente:
- Encontrar un punto central (punto medio) en el plano
- Restar desde todos los puntos de datos para organizarlos en torno al origen
- Girar la normalidad de modo que se convierte en (0,0, -1)
- Aplicar esta rotación a todos los puntos de datos
- uso proyección ortogonal (básicamente, omitir eje z)
Ahora estoy atascado en encontrar la operación de rotación correcta. Intenté trabajar con acos o atan y configurar dos matrices de rotación. Parece que ambos métodos (usando acos, usando atan) me dan el resultado incorrecto. Quizás puedas ayudarme aquí!
Matlab código siguiente:
b = atan(n(1)/n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1)/n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
espero tener n2
y componente de cero. Sin embargo, eso ya falla para el vector (-0.6367, 0.7697, 0.0467).
¿Por qué no simplemente proyecta todos los puntos en el plano y luego gira todo para que pueda dibujar los puntos usando sus coordenadas xz (o xy)? –
Eso, o coloque la cámara directamente en el plano de modo que esté mirando directamente. –
La idea de la cámara es buena. Mueves la cámara desde el avión desde el origen a cierta distancia a lo largo de la normal. Luego apuntas la cámara al origen. Por supuesto, esto supone que tienes un código de proyección de cámara, que se puede hacer con rotaciones o vectores. – Nosredna