Estrarre il piano dei dati ruotato arbitrariamente dall’array 3D come array 2D

Ho una matrice 3D di dati in MATLAB, ma voglio estrarre una porzione di dati ruotata arbitrariamente da quella matrice e memorizzarla come una matrice 2D, alla quale posso accedere. Simile al modo in cui la funzione slice () visualizza i dati tagliati con qualsiasi angolazione, tranne che mi piacerebbe anche poter visualizzare e modificare i dati come se si trattasse di un array.

Ho le coordinate del punto di rotazione del piano così come gli angoli di rotazione (negli assi x, yez), ho anche calcolato l’equazione del piano nella forma:

Ax + By + Cz = D 

e può estrarre una matrice 3D contenente solo i dati che cadono su quel piano, ma non so come convertirla in un semplice array 2D.

Un altro modo per farlo sarebbe quello di ruotare in qualche modo la matrice sorgente nella direzione opposta dell’angolo del piano, in modo da allineare il piano dei dati con l’asse XY, e semplicemente estrarre quella parte della matrice, ma io faccio non so se è ansible ruotare una matrice del genere.

Spero che non sia stata data una risposta altrove, ho cercato su google tutto il giorno, ma nessuno dei problemi sembra corrispondere esattamente al mio.

    Grazie

    Puoi dare un’occhiata al codice qui . Penso che la funzione sia simile a quello che stai cercando di risolvere.

    La funzione estrae un piano arbitrario da un volume data la dimensione del piano, il punto centrale del piano e il piano normale, cioè [A, B, C]. Emette anche l’indice volumetrico e le coordinate di ciascun pixel sul piano.

    Aha! Potrei averlo risolto da solo.

    Per produrre l’equazione del piano, ruoto un vettore normale di (0,0,1) usando le matrici di rotazione e poi trovo D. Se ruoterò anche i seguenti vettori:

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

    e

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

    Avrò i gradienti che indicano quanto debbano cambiare le mie coordinate in x, y, z prima di passare alla colonna successiva nel mio array, o alla riga successiva.

    Mi prenderò in giro il più presto ansible e segnerò come risposta se funziona

    EDIT: Ok leggera alterazione, quando sto ruotando i miei vettori dovrei anche ruotare il punto nello spazio 3D che rappresenta le coordinate xyz di x = 0, y = 0, z = 0 (anche se sto ruotando attorno al centro del struttura, quindi in realtà è -sizex / 2, -sizey / 2, -sizez / 2, dove la dimensione è la dimensione dei dati, e quindi aggiungo semplicemente la dimensione / 2 a ciascuna coordinata dopo le rotazioni per tradurla nuovamente dove dovrebbe essere).

    Ora che ho il cambiamento del gradiente in 3D mentre aumento la coordinata x del mio array 2D e il gradiente cambia mentre aumento la coordinata y, posso semplicemente scorrere tutte le possibili coordinate xey (l’array risultante sarà 50×50 per un Array 50x50x50, non sono sicuro di quale sarà per le dimensioni irregolari, che alla fine avrò bisogno di elaborare) nel mio array 2D e calcolerò le coordinate 3D risultanti sul mio piano nei dati. Il mio valore di angolo ruotato funge da punto di partenza. Evviva!

    Devo solo elaborare un buon test per questo che comprende tutti gli angoli e quindi approverò questo come una risposta