2012-05-22 5 views
15

일부 2D 드로잉을하고 싶기 때문에 일부 매트릭스 변형을 구현하려고합니다. 내 가벼운 수학 배경으로 나는 C#에서 그렇게하는 법을 이해하려고 노력하고있다. (다른 모든 언어는 분명히 그것을 할 것이다.)왜 2D 변환에는 3x3 행렬이 필요합니까?

필자가 읽은 것은 번역에 대처할 수 있도록 3x3 행렬로 작업해야한다고 설명했습니다. 왜냐하면 곱셈을 사용하여 번역을 할 수 없기 때문입니다. 그러나 이것은 우리가 변환을 만드는 행렬의 곱셈과 함께합니다. 그래서 우리는 다음과 같이 작업합니다 :

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

제 3 열의 의미는 알지만 세 번째 행이 필요한 이유는 무엇입니까? 항등 행렬뿐만 아니라 회전, 축척 또는 회전에서도 마지막 행은 동일합니다. 아직 도달하지 못한 작업이 필요합니까? 일부 언어 (Java)가 "제곱 된 차원"배열을 사용하면 더 잘 수행됩니까? 그렇다면 C#에서 3 열 및 2 행을 사용할 수 있습니다 (가변 배열은 잘 작동하므로 더 좋음).

예를 들어, 회전 + 번역을 위해 나는이

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

마지막 행의 필요 없음 같은 매트릭스를 가지고있다.

+1

http://en.wikipedia.org/wiki/Translation_(geometry)에서 읽기를 시작한 다음 http://en.wikipedia.org/wiki/Homogeneous_coordinates –

+1

의 링크 중 하나를 따르십시오. @HighPerformanceMark 여기 있습니다 이 개념들의 어느 부분을 내가 이해하지 못하는지를 설명하려 노력했다. 네, 저는이 책을 읽고 시작한 2 권의 첫 번째 문서입니다. –

답변

26

이것은 우리가 우리의 변환

우리가 정사각형 행렬을 원하는 이유 인을 만들 행렬의 곱셈에 있습니다.

우리가 제안한 것을 수행하고 변환에 2x3 행렬을 사용한다고 가정 해 보겠습니다.

그런 다음 회전은

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

것와 번역

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

것 그리고 우리는 점을 나타내는 열 벡터에 의해 우리의 행렬을 곱하여하거나 회전하거나 번역을 수행 할 수 있습니다 :

(x) 
M (y) 
    (0) 

정답을 얻으려면.

그러나는 - 우리가 어떻게에 대한 변환을 구성 갈 것이라고? 실제로 "회전 + 변환을 위해이 매트릭스가 있습니다"예제에서 어떻게 했습니까 그 행렬은입니까? 물론,이 경우 그냥 쓸 수는 있지만 일반적으로?

그래서 또 다른 변환 행렬을 제공 곱셈이 변환 행렬을 할 수 있어야 우리가 우리의 변환을 생성 행렬의 곱셈 함께 : 글쎄, 당신은 답을 알고있다. 행렬 곱셈의 규칙은 다음과 같이 나타냅니다.

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

은 유효한 행렬 곱셈이 아닙니다. 우리는 변환이 가능하도록 곱해질 수있는 행렬이 필요합니다. 그래서 우리는 여분의 행을 가지고 있습니다. 이제


, 나는 여기를 표명 한 방법은 사실상 회전과 번역의 친숙한 변환 균일 좌표 변환의 전체 전력의 단지 특별한 경우가되는 표준 수학 프리젠 테이션, 완전히 역방향 사영 비행기 - 그러나 우리는 왜 우리가 그 여분의 행이 필요한지를 보여주기 위해 행렬을 사각형으로 만들고 따라서 같은 행렬로 곱할 수 있다고 생각합니다.

+0

Uuh 그것이 내가 아직 보지 못했던 지점입니다! 감사합니다 AakashM. 내 생각에 구멍을내어 주셔서 감사합니다. –

+0

+1 좋은 답변입니다. – Doug

+0

그리고'(tx, ty)'의 번역에 대한 실제 계산은'[x y 1] x [1 0 0; 0 1 0; tx ty 1] = [x + tx y + ty 1]이다. – Gerard

5

답변은 동질적인 좌표입니다. 하나의 작업으로 회전과 변환을 결합하려면 모델에 필요한 것보다 한 차원 더 차원이 필요합니다. 평평한 것의 경우 이것은 3 개의 구성 요소이고 공간적 인 경우 4 개의 구성 요소입니다. 연산자는 3 개의 구성 요소를 사용하고 3x3 행렬을 필요로하는 3 개의 구성 요소를 반환합니다.

+0

그러나 2D에서 {0,0,1} 행의 목적은 무엇입니까? 변환없이 선형 변환뿐만 아니라 변환도 계산할 수 있습니다. (정확하게 이해했다면) –

+0

내가 말했듯이, 3 행은 3 가지 구성 요소 결과를 산출하는 데 필요합니다. 다른 아핀 변환에서 세 번째 구성 요소가 항상 '1'이 아니고 세 번째 행이 '[0 0 1]'이 아닐 수도 있습니다. – ja72

+0

필자는 행렬 연산에이 점이 필요하다고 생각하지 않았습니다. 그건 내가 예상하지 못한 "수학적 제약"입니다. (천천히있어 죄송합니다) –