Extraiga un plano de datos girado arbitrariamente de una matriz 3D como una matriz 2D

Tengo una matriz de datos 3D en matlab, pero quiero extraer una porción de datos rotada arbitrariamente de esa matriz y almacenarla como una matriz 2D, a la que puedo acceder. Similar a cómo la función slice () muestra los datos cortados en cualquier ángulo, excepto que también me gustaría poder ver y modificar los datos como si fuera una matriz.

Tengo las coordenadas del punto de pivote del plano así como los ángulos de rotación (en los ejes x, y y z), también he calculado la ecuación del plano en la forma:

Ax + By + Cz = D

y puedo extraer una matriz 3D que contiene solo los datos que caen en ese plano, pero no sé cómo convertir eso en una matriz 2D simple.

Otra forma de hacerlo sería rotar de alguna manera la matriz de origen en la dirección opuesta al ángulo del plano, para alinear el plano de datos con el eje XY, y simplemente extraer esa parte de la matriz, pero lo hago No sé si es posible rotar una matriz como esa.

Espero que esto no haya sido respondido en otra parte, lo he estado buscando en Google todo el día, pero ninguno de los problemas parece coincidir exactamente con el mío.

Muchas Gracias

preguntado el 31 de enero de 12 a las 16:01

¿Necesitas solo los datos que caen? exactamente en el plano (que en general será una cantidad muy pequeña de puntos de datos) o desea interpolar los datos? -

Quiero devolver las celdas más cercanas en lugar de la interpolación, aunque la interpolación se considerará más adelante:

Para que quede claro, tienes una matriz con 3 indeces. A[i,j,k]=a_ijk y quieres crear una matriz de 2 indeces B[u,v]=b_uv dónde u,v son coordenadas en un plano / corte del i,j,k ¿mundo? (y todas las sangrías son enteros) Además, ¿existe alguna convención sobre la cual ijk corresponde a u=1 y v=1 ? -

2 Respuestas

Puede echar un vistazo a el código aquí. Creo que la función es similar a la que intentas resolver.

La La función extrae un plano arbitrario de un volumen. dado el tamaño del plano, el punto central del plano y el plano normal, es decir, [A, B, C]. También genera el índice volumétrico y las coordenadas de cada píxel en el plano.

Respondido 01 Feb 12, 19:02

¡Ajá! Puede que lo haya resuelto yo mismo.

Para producir la ecuación del plano, giro un vector normal de (0,0,1) usando matrices de rotación y luego encuentro D. Si también giro los siguientes vectores:

(1,0,0) //step in the x direction of our 2D array

y

(0,1,0) //step in the y direction of our 2D array

Tendré los gradientes que denotan cuánto deben cambiar mis coordenadas en x, y, z antes de pasar a la siguiente columna de mi matriz, o a la siguiente fila.

Me burlaré de esto lo antes posible y lo marcaré como la respuesta si funciona

EDITAR: Ok, ligera alteración, cuando estoy rotando mis vectores también debería rotar el punto en el espacio 3D que representa las coordenadas xyz de x = 0, y = 0, z = 0 (aunque estoy rotando alrededor del centro de la estructura, por lo que en realidad es -sizex / 2, -sizey / 2, -sizez / 2, donde size es el tamaño de los datos, y luego simplemente agrego size / 2 a cada coordenada después de las rotaciones para trasladarlo a donde está debiera ser).

Ahora que tengo el cambio de gradiente en 3D a medida que aumento la coordenada x de mi matriz 2D y el cambio de gradiente a medida que aumento la coordenada y, simplemente puedo recorrer todas las coordenadas xey posibles (la matriz resultante será 50x50 para un Matriz 50x50x50, no estoy seguro de qué será para tamaños irregulares, que tendré que resolver eventualmente) en mi matriz 2D y calcular las coordenadas 3D resultantes en mi plano en los datos. Mi valor de esquina girado sirve como punto de partida. ¡Hurra!

Solo tengo que hacer una buena prueba para esto que abarque todos los ángulos y luego aprobaré esto como una respuesta.

Respondido el 31 de enero de 12 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.