2012-01-31 11 views
5

Mam macierz 3D danych w Matlab, ale chcę wyodrębnić dowolnie obrócony kawałek danych z tej macierzy i zapisać go jako macierz 2D, którą mogę dostęp. Podobny do tego, jak funkcja slice() wyświetla dane pokrojone pod dowolnym kątem, oprócz tego chciałbym również móc przeglądać i modyfikować dane tak, jakby były tablicą.Wyodrębnij dowolnie obróconą płaszczyznę danych z macierzy 3D jako macierz 2D

mam współrzędne obrotu punktu na powierzchni, jak również kąty obrotu (X, Y i osi Z), ja również obliczyć z równania samolotu w postaci:

Ax + By + Cz = D 

i można wyodrębnić macierz 3D zawierającą tylko te dane, które mieszczą się na tej płaszczyźnie, ale nie wiem, jak to przekształcić w prostą tablicę 2D.

Innym sposobem wykonania tej czynności jest obrócenie macierzy źródłowej w kierunku przeciwnym do kąta płaszczyzny, tak aby wyrównać płaszczyznę danych z osią XY i po prostu wyodrębnić tę część macierzy , ale nie wiem, czy obracanie takiej matrycy jest możliwe.

Mam nadzieję, że na to pytanie nie odpowiedziano w żadnym innym miejscu. Przez cały czas googlowałem, ale żaden z problemów nie pasuje do mojego.

Dzięki

+0

Czy potrzebujesz tylko danych, które *** są dokładnie *** na płaszczyźnie (które na ogół będą bardzo małą ilością punktów danych) lub czy chcesz chcieć interpolować dane? – yohai

+0

Chcę zwrócić najbliższe komórki zamiast interpolacji, chociaż interpolacja zostanie rozpatrzona później. –

+0

Aby było jasne, macie macierz z 3 indecjami 'A [i, j, k] = a_ijk' i chcecie utworzyć tablicę 2 indeces 'B [u, v] = b_uv' gdzie' u', 'v' są współrzędne na płaszczyźnie/wycinku świata' i', 'j',' k'? (i wszystkie indeces są liczbami całkowitymi). Czy istnieje również konwencja, w której 'ijk' odpowiada' u = 1' i 'v = 1'? – ja72

Odpowiedz

1

Można przyjrzeć the code here. Myślę, że funkcja jest podobna do tej, którą próbujesz rozwiązać.

The function extracts an arbitrary plane from a volume biorąc pod uwagę rozmiar płaszczyzny, punkt środkowy płaszczyzny i płaszczyznę normalną, tj. [A, B, C].Wyprowadza również indeks wolumetryczny i współrzędne każdego piksela na płaszczyźnie.

0

Aha! Może właśnie to rozwiązałem.

celu wytworzenia wzoru płaszczyzny obrócić wektor normalny (0,0,1), z wykorzystaniem macierzy rotacji, a następnie D. Jeżeli znaleźć również obracać następujących wektorów:

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

i

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

Będę miał gradienty, które oznaczają, jak duże są moje współrzędne wx, y, z, zanim przejdę do następnej kolumny w mojej tablicy lub do następnego wiersza.

będę to mock up ASAP i oznaczyć ją jako odpowiedź czy działa

EDIT: Ok nieznaczne zmiany, kiedy jestem obracając moje wektory Należy również obrócić punkt w przestrzeni 3D, który reprezentuje xyz współrzędne x = 0, y = 0, z = 0 (chociaż obracam się wokół środka struktury, więc to właściwie -sizex/2, -sizey/2, -sizez/2, gdzie rozmiar jest wielkości dane, a następnie po prostu dodaję rozmiar/2 do każdej współrzędnej po obrocie, aby przetłumaczyć ją z powrotem tam, gdzie powinna być).

Teraz, gdy zmieniłem gradient w 3D, gdy zwiększam współrzędną x mojej tablicy 2D i zmianą gradientu, gdy zwiększam współrzędną y, mogę po prostu przechodzić przez wszystkie możliwe współrzędne xiy (wynikowa tablica będzie być 50x50 dla macierzy 50x50x50, nie jestem pewien, co to będzie dla nieregularnych rozmiarów, które będę musiał opracować ostatecznie) w mojej tablicy 2D i obliczyć wynikowe współrzędne 3D na moim samolocie w danych. Moja obrócona wartość narożnika służy jako punkt wyjścia. Brawo!

Właśnie wypracować dobry test dla tego obejmującego wszystkie kąty i wtedy będę zatwierdza to jako odpowiedź

Powiązane problemy