2009-05-21 36 views

Trả lời

8

Giả sử, mà biến đổi CHỈ chứa vòng xoay nó dễ dàng: Chỉ cần lấy acos của phần tử m11.

Nó vẫn hoạt động nếu biến đổi chứa bản dịch, nhưng nếu nó có chứa cắt hoặc mở rộng, bạn sẽ không may mắn. Chúng có thể được tái tạo bằng cách phân hủy ma trận thành ma trận cắt, tỉ lệ và xoay, nhưng kết quả bạn nhận được không phải là những gì bạn đang tìm kiếm.

+0

+1 cho độ chính xác kỹ thuật. Phân rã SVD của phần phi dịch thuật cũng xuất hiện trong tâm trí (thành phần của phép quay, chia tỷ lệ dị hướng dọc theo trục x-y và quay)) –

8

Cách chung đơn giản nhất là chuyển đổi (0,0) và (1,0), sau đó sử dụng hàm lượng giác (arctan) để có được những góc

+0

Đây là cách phù hợp để thực hiện. cảm ơn – sharvey

4

Ma trận chuyển đổi là một triển khai được sử dụng cho đồ họa 3D. Nó đơn giản hóa toán học để tăng tốc độ định hướng vị trí/quay của các điểm/đối tượng. Nó thực sự là rất khó để kéo ra định hướng từ chuyển đổi vì cách nó tích lũy dịch/luân phiên/quy mô liên tiếp.

Đây là đề xuất. Lấy một vector trỏ theo một hướng đơn giản như (1,0,0), và sau đó áp dụng Transform cho nó. Vector kết quả của bạn sẽ được dịch và xoay để cung cấp cho bạn một cái gì đó như thế này: (27.8, 19.2, 77.4). Áp dụng Transform để (0,0,0), để có được một cái gì đó như (26,1, 19,4, 50,8). Bạn có thể sử dụng hai điểm này để tính toán các phép quay đã được áp dụng dựa trên việc biết điểm bắt đầu của chúng là (1,0,0).

Điều này có hữu ích không?

+1

QTransform thực hiện phép biến đổi 2D bằng ma trận 3x3. 3D biến đổi với một ma trận 4x4 là rất giống nhau, nhưng toán học trong trường hợp 2D là một chút đơn giản. Điều đó được nói, tất cả mọi người ngoại trừ Nils dường như đã quên biến đổi cắt như [[1,1,0], [0,1,0], [0,0,1]], trong trường hợp đó chỉ cần đẩy hai điểm qua sẽ không trả lại kết quả mô tả đầy đủ. – ephemient

2

Thông thường, bạn cần có chức năng trig nghịch đảo, nhưng bạn cần chú ý đến sự mơ hồ góc phần tư, và đây là những gì bạn nên sử dụng atan2 (đôi khi được viết là arctan2). Vì vậy, xoay một vector đơn vị [0, 1] thành [x, y] và sau đó sử dụng atan2 (y, x), hoặc nếu ma trận chỉ thực hiện xoay vòng, bạn có thể sử dụng atan2 (m12, m11). (Chúng giống với câu trả lời của Javier và Nils, ngoại trừ chúng không sử dụng atan2.)

1

Tôi đã sử dụng QGraphicsItem chỉ với setRotate và không gặp bất kỳ vấn đề nào, cho đến khi tôi thêm chức năng nhóm xoay. Vấn đề là khi destroyItemGroup được gọi, nó áp dụng vòng xoay như một phép biến đổi cho các mục, và không phải là một vòng quay. Do đó tôi đã phải phục hồi vòng xoay từ đối tượng QTransform này.

sửa chữa của tôi là để thêm các dòng sau vào phương pháp itemChange (tín dụng để trả lời tom10 của):

QVariant MyGraphicItem::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    if(change == ItemTransformChange) 
    { 
     auto transform = value.value<QTransform>(); 
     setRotation(rotation() + qRadiansToDegrees(qAtan2(transform.m12(), transform.m11()))); 
     return QVariant(); 
    } 
    ... 
} 

PS .: Các giải pháp khác với acos và m11() không làm việc. Nó bị treo cho các giá trị nhất định, như được giải thích bởi tom10.

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