Với tham chiếu đến this programming game Tôi hiện đang xây dựng.WPF: Nhận tọa độ mới sau khi xoay vòng
alt text http://img12.imageshack.us/img12/2089/shapetransformationf.jpg
Để dịch một Canvas trong WPF, tôi đang sử dụng hai hình thức: TranslateTransform
(để di chuyển nó), và RotateTransform
(để xoay nó) [con cái của cùng mộtTransformationGroup
]
Tôi có thể dễ dàng nhận được các tọa độ x, y trên cùng của canvas khi không xoay (hoặc xoay ở 90deg, vì nó sẽ giống nhau), nhưng vấn đề tôi đang gặp phải là ở trên cùng bên trái (và 3 điểm còn lại) tọa độ.
này bởi vì khi một RotateTransform
được áp dụng, các 's X
và Y
tính TranslateTransform
không bị thay đổi (và do đó vẫn chỉ ra rằng phía trên bên trái của hình vuông là giống như các chấm vuông (từ hình ảnh)
các Canvas đang được luân chuyển từ trung tâm của nó, vì vậy đó là nguồn gốc của nó.
vì vậy làm thế nào tôi có thể nhận được "mới" tọa độ x và y của 4 điểm sau vòng xoay?
[UPDATE]
alt text http://img25.imageshack.us/img25/8676/shaperotationaltransfor.jpg
Tôi đã tìm thấy một cách để tìm ra phía trên bên trái phối sau khi vòng xoay (như bạn có thể nhìn thấy từ hình ảnh mới) bằng cách thêm OffsetX và OffsetY từ vòng xoay với các tọa độ X và Y bắt đầu.
Nhưng hiện tại tôi đang gặp khó khăn trong việc tìm ra phần còn lại của tọa độ (3 còn lại).
Với hình dạng xoay này, làm cách nào tôi có thể tìm ra tọa độ x và y của 3 góc còn lại?
[EDIT]
Những điểm trong hình ảnh thứ 2 KHÔNG ĐIỂM CHÍNH XÁC VÀ CHÍNH XÁC. Tôi đã chỉ ra những điểm ước tính trong đầu.
[UPDATE] Giải pháp:
Trước hết, tôi xin cảm ơn Jason S cho rằng bài dài và rất nhiều thông tin, trong đó ông mô tả toán học đằng sau toàn bộ quá trình; Tôi chắc chắn đã học được rất nhiều bằng cách đọc bài viết của bạn và thử các giá trị.
Nhưng bây giờ tôi đã tìm thấy một đoạn mã (nhờ EugeneZ 's nhắc đến TransformBounds
) thực hiện chính xác những gì tôi muốn:
public Rect GetBounds(FrameworkElement of, FrameworkElement from)
{
// Might throw an exception if of and from are not in the same visual tree
GeneralTransform transform = of.TransformToVisual(from);
return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight));
}
tham khảo: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/86350f19-6457-470e-bde9-66e8970f7059/
Ở đây bạn có thể tìm thấy dễ dàng nhất tìm cách http://stackoverflow.com/a/22511805/2106820 –