2013-02-28 32 views

Trả lời

44

Dịch (tx, ty) có thể được viết dưới dạng ma trận:

1 0 tx 
0 1 ty 
0 0 1 

Scale (sx, sy) có thể được viết dưới dạng ma trận:

sx 0 0 
0 sy 0 
0 0 1 

Rotate (một) có thể được viết dưới dạng ma trận:

cos(a) -sin(a) 0 
sin(a) cos(a) 0 
0  0  1 

Xoay (a, cx, c y) là sự kết hợp của một bản dịch bằng (-cx, cy), vòng xoay cảng gồm một mức độ và bản dịch trở lại (cx, cy), mang đến cho:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy 
0  0  1 

Nếu bạn chỉ cần nhân này với bản dịch ma trận bạn nhận được:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx + tx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy + ty 
0  0  1 

nào tương ứng với SVG chuyển đổi ma trận:

(cos(a), sin(a), -sin(a), cos(a), -cx × cos(a) + cy × sin(a) + cx + tx, -cx × sin(a) - cy × cos(a) + cy + ty).

Trong trường hợp của bạn là: matrix(0.866, -0.5 0.5 0.866 8.84 58.35).

Nếu bạn bao gồm quy mô (sx, sy) biến đổi, ma trận là:

(sx × cos(a), sy × sin(a), -sx × sin(a), sy × cos(a), (-cx × cos(a) + cy × sin(a) + cx) × sx + tx, (-cx × sin(a) - cy × cos(a) + cy) × sy + ty)

Lưu ý rằng điều này giả định bạn đang làm biến đổi theo thứ tự bạn đã viết cho họ.

+0

bạn có thể vui lòng xây dựng một, cx, cy, tx và ty không? để tôi có thể dùng thử. –

+0

Trong ví dụ của bạn a = -30 (độ), cx = 10, cy = 25, tx = 20, ty = 50 (sx = 1, sy = 1).Nói chung, vòng quay được cho là xoay (a, cx, cy) và bản dịch là dịch (tx, ty). –

+0

Xin lỗi nhưng trong 'Xoay (a, cx, cy)' thì dấu chấm đại diện cho '-cx.cos (a)' là gì? Đến từ một nền JavaScript tôi không hiểu ý nghĩa của việc áp dụng cos/sin cho một đối tượng trực tiếp, không có Math.cos(). –

7

Đầu tiên lấy phần tử g bằng cách sử dụng document.getElementById nếu nó có thuộc tính id hoặc một số phương pháp thích hợp khác, sau đó gọi consolidate ví dụ:

var g = document.getElementById("<whatever the id is>"); 
g.transform.baseVal.consolidate(); 
+1

Tôi đang cố gắng đạt được điều này với Mục tiêu C/iOS. là có bất kỳ phương pháp chung để có được ma trận? –

+0

Mặc dù Peters trả lời giải thích lý thuyết và cách bạn tính toán ma trận theo cách thủ công, tôi nghĩ rằng câu trả lời của Roberts phải được chấp nhận. el.transform.baseVal.consolidate() là những gì bạn nên sử dụng. Không cần phải tái tạo lại bánh xe. – Manfred

+0

@Manfred OP không thể sử dụng nó như được giải thích trong bình luận của mình cho câu trả lời của tôi vậy tại sao trên trái đất anh ta sẽ chấp nhận nó? –

Các vấn đề liên quan