2012-05-22 14 views
15

Chcę wykonać rysunek 2D, a tym samym chcę zaimplementować niektóre przekształcenia macierzy. Przy moim lekkim tle matematyki próbuję zrozumieć, jak to zrobić w języku C# (jakikolwiek inny język oop oczywiście to zrobi).Dlaczego transformacje 2D wymagają macierzy 3x3?

Wszystko, co czytam, wyjaśnia, że ​​musimy pracować z macierzami 3x3, aby móc poradzić sobie z tłumaczeniami. Ponieważ nie można dokonać tłumaczenia za pomocą multiplikacji. Ale dzieje się tak w przypadku multiplikacji macierzy, w których tworzymy nasze transformacje. Więc pracujemy z czymś takim:

{ x1, x2, tx } 
{ y1, y2, ty } 
{ 0, 0, 1 } 

Rozumiem średnią z trzeciej kolumny, ale dlaczego musimy trzeci wiersz? W macierzy tożsamości, jak również w obrocie, skali lub obrocie ostatni wiersz jest taki sam. Czy są operacje, których jeszcze nie osiągnąłem, które będą potrzebne? Czy to dlatego, że niektóre języki (Java) działają lepiej w przypadku macierzy "kwadratów wymiarów"? Jeśli tak, mogę użyć 3 kolumn i 2 wierszy w C# (ponieważ poszarpane tablice działają równie dobrze lub lepiej).

Na przykład na tłumaczeniu rotacja + mam matrycę jak ten

{ cos(rot)*x1, (-sin(rot))*x2, tx } 
{ sin(rot)*y1, cos(rot)*y2, ty } 
{ 0,   0,    1 } 

bez konieczności ostatnim rzędzie.

+1

Zacznij czytać pod adresem http://en.wikipedia.org/wiki/Translation_(geometry), a następnie podążaj jednym z linków do http://en.wikipedia.org/wiki/Homogeneous_coordinates –

+1

@HighPerformanceMark Jestem tutaj próbując wyjaśnić, który punkt tych pojęć nie rozumiem. Tak, to są 2 pierwsze dokumenty, z którymi zacząłem czytać. –

Odpowiedz

26

to z mnożenia matryc, które tworzymy naszą transformacje

Ten dlatego chcemy macierzy kwadratowych.

Załóżmy, że zrobiliśmy to, co proponujemy, i użyliśmy macierzy 2x3 dla naszych transformacji.

Następnie obrót będzie

(x1, x2, 0) 
(y1, y2, 0) 

i tłumaczenia będzie

(1, 0, tx) 
(0, 1, ty) 

i można było przeprowadzić zarówno ruchów i tłumaczenia przez pomnożenie naszego matrycy przez kolumny wektor reprezentujący punkt:

(x) 
M (y) 
    (0) 

, aby uzyskać prawidłowe odpowiedzi.

Jednak - jak byśmy poszli o komponowaniu transformacji? Rzeczywiście, dla twojego "na obrót + tłumaczenie mam przykład tego macierzy", jak dostałeś się do do tej macierzy? Oczywiście, w tym przypadku możesz to napisać, ale ogólnie?Cóż, znasz odpowiedź:

to jest z mnożenia matryc, które tworzymy naszą transformacje

Więc musi być możliwe do pomnożyć dwie macierze transformacji dać inną macierz transformacji. Reguły mnożenia macierzy pokazują, że:

(. . .) (. . .) 
(. . .) (. . .) = ??? 

nie jest prawidłowym multiplikowaniem macierzy. Potrzebujemy macierzy, które można mnożyć, aby nasze transformacje mogły być składane. Mamy więc ten dodatkowy rząd.


Teraz, tak ja to tutaj wyrażone jest w rzeczywistości całkowicie do tyłu od standardowej prezentacji matematycznej, w której znane transformacje rotacji i translacji są tylko szczególne przypadki pełnej mocy współrzędne jednorodne na przemian płaszczyzna projekcyjna - ale myślę, że zrobi to, aby pokazać wam, dlaczego potrzebujemy tego dodatkowego rzędu - aby utworzyć kwadrat macierzy, a tym samym można go pomnożyć z podobnymi macierzami.

+0

Uuh to punkt, którego jeszcze nie widziałem! Dzięki, AakashM. Dziękuję, że poświęciłem czas na dostrzeżenie dziury w moim myśleniu. –

+0

+1 wspaniała odpowiedź. – Doug

+0

A rzeczywiste obliczenia dla tłumaczenia '(tx, ty)' wygląda następująco '[x y 1] x [1 0 0; 0 1 0; tx ty 1] = [x + tx y + ty 1] '. – Gerard

5

Odpowiedzią jest jednorodne współrzędne. Aby połączyć rotację i tłumaczenie w jednej operacji, potrzebny jest dodatkowy wymiar, niż wymaga tego model. W przypadku rzeczy planarnych są to 3 komponenty, a dla rzeczy przestrzennych 4 komponenty. Operatorzy pobierają 3 komponenty i zwracają 3 komponenty wymagające macierzy 3x3.

+0

Ale jaki jest cel rzędu {0,0,1} w 2D? Możemy bez tego obliczyć tłumaczenia, a także transformację liniową. (Jeśli dobrze zrozumiałem) –

+0

Jak już powiedziałem, trzeci wiersz jest potrzebny do uzyskania wyniku 3-składnikowego. Możliwe, że trzeci komponent nie zawsze jest równy "1", a trzeci wiersz nie jest "[0 0 1]" w innych transformacjach afinicznych. – ja72

+0

Nie myślałem o tym, że potrzebujemy tego do operacji macierzowych; to "przymus matematyczny", którego nie przewidziałem. (Przepraszam za bycie wolnym) –

Powiązane problemy