2012-05-22 13 views
15

Tôi muốn làm một số bản vẽ 2D và do đó muốn thực hiện một số phép biến đổi ma trận. Với nền toán học ánh sáng của tôi, tôi đang cố gắng để hiểu làm thế nào để làm như vậy trong C# (bất kỳ ngôn ngữ oop nào khác sẽ làm điều đó rõ ràng).Tại sao các phép biến đổi 2D cần ma trận 3x3?

Tất cả những gì tôi đọc giải thích rằng chúng tôi cần làm việc với các ma trận 3x3 để có thể đối phó với các bản dịch. Bởi vì bạn không thể tạo bản dịch với phép nhân. Nhưng điều này là với phép nhân của các ma trận mà chúng ta tạo ra các phép biến đổi của chúng ta. Vì vậy, chúng tôi làm việc với một cái gì đó như:

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

Tôi hiểu ý nghĩa của cột thứ ba, nhưng tại sao chúng ta cần hàng thứ ba? Trong một ma trận nhận dạng cũng như trong một vòng quay, quy mô hoặc xoay hàng cuối cùng là như nhau. Có những hoạt động mà tôi chưa đạt được mà sẽ cần đến nó? Có phải vì một số ngôn ngữ (Java) hoạt động tốt hơn với các mảng "kích thước bình phương" không? Nếu vậy tôi có thể sử dụng 3 cột và 2 hàng trong C# (kể từ khi mảng lởm chởm hoạt động tốt hoặc tốt hơn).

Ví dụ, đối với một dịch xoay + Tôi có một ma trận như thế này

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

Không cần của hàng cuối cùng.

+1

Bắt đầu đọc của bạn tại http://en.wikipedia.org/wiki/Translation_(geometry), sau đó theo một trong các liên kết đến http://en.wikipedia.org/wiki/Homogeneous_coordinates –

+1

@HighPerformanceMark Tôi ở đây cố gắng giải thích điểm nào của những khái niệm này mà tôi không hiểu. Có, đây là 2 tài liệu đầu tiên tôi bắt đầu đọc. –

Trả lời

26

này là với phép nhân của các ma trận mà chúng ta tạo ra sự biến đổi của chúng tôi

Đây là lý do tại sao chúng tôi muốn các ma trận vuông.

Giả sử chúng tôi đã làm những gì bạn đề xuất và sử dụng ma trận 2x3 cho các phép biến đổi của chúng tôi.

Sau đó, vòng xoay sẽ

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

và một bản dịch sẽ

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

và chúng tôi có thể thực hiện một trong hai phép quay hoặc bản dịch bằng cách nhân ma trận của chúng tôi bằng một vector cột đại diện cho quan điểm:

(x) 
M (y) 
    (0) 

để nhận câu trả lời đúng.

Tuy nhiên - cách chúng tôi sẽ chuyển đổi soạn chuyển đổi? Thật vậy, đối với ví dụ "dịch xoay vòng + tôi có ma trận như thế này", làm cách nào bạn nhận được ma trận đó? Chắc chắn, trong trường hợp này bạn chỉ có thể viết nó ra, nhưng nói chung?Vâng, bạn biết câu trả lời:

này là với phép nhân của các ma trận mà chúng ta tạo ra sự biến đổi của chúng tôi

Vì vậy, nó phải có khả năng nhân hai ma trận chuyển đổi để cung cấp cho một ma trận chuyển đổi. Và các quy tắc của phép nhân ma trận cho thấy điều này:

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

không phải là phép nhân ma trận hợp lệ. Chúng ta cần các ma trận có thể được nhân lên để các phép biến đổi của chúng ta có thể tổng hợp được. Vì vậy, chúng tôi có thêm hàng.


Bây giờ, cách tôi đã trình bày ở đây là trong thực tế hoàn toàn ngược từ việc trình bày toán học tiêu chuẩn, trong đó biến đổi quen thuộc của luân chuyển và dịch những trường hợp chỉ đặc biệt của toàn bộ sức mạnh của phối hợp biến đổi đồng nhất về mặt phẳng chiếu xạ - nhưng tôi nghĩ nó sẽ làm cho bạn thấy lý do tại sao chúng ta cần thêm hàng đó - để tạo hình vuông ma trận, và do đó có thể được nhân với các ma trận như thế.

+0

Uuh đó là điểm tôi chưa thấy! Cảm ơn bạn AakashM. Cảm ơn đã dành thời gian để phát hiện ra lỗ hổng trong suy nghĩ của tôi. –

+0

+1 câu trả lời tuyệt vời. – Doug

+0

Và phép tính thực tế cho bản dịch của '(tx, ty)' trông giống như '[x y 1] x [1 0 0; 0 1 0; tx ty 1] = [x + tx y + ty 1] '. – Gerard

5

Câu trả lời là Tọa độ đồng nhất. Để kết hợp xoay và dịch trong một thao tác, cần thêm một chiều kích thước so với mô hình yêu cầu. Đối với những thứ phẳng, đây là 3 thành phần và cho những thứ không gian, đây là 4 thành phần. Các toán tử lấy 3 thành phần và trả về 3 thành phần đòi hỏi ma trận 3x3.

+0

Nhưng mục đích của {0,0,1} hàng trong 2D là gì? Chúng ta có thể tính toán các bản dịch cũng như chuyển đổi tuyến tính mà không có nó. (Nếu tôi hiểu chính xác) –

+0

Như tôi đã nói, hàng thứ 3 là cần thiết để tạo ra kết quả 3 thành phần. Có thể thành phần thứ ba không phải lúc nào cũng bằng '1' và hàng thứ 3 không phải là' [0 0 1] 'trong các phép biến đổi affine khác. – ja72

+0

Tôi không nghĩ về thực tế là chúng ta cần điều này cho các hoạt động ma trận; đó là "ràng buộc toán học" mà tôi không lường trước được. (Xin lỗi vì chậm) –