【发布时间】:2010-10-09 13:42:57
【问题描述】:
参考this programming game我目前正在建设中。
alt text http://img12.imageshack.us/img12/2089/shapetransformationf.jpg
为了在 WPF 中翻译画布,我使用了两种形式:TranslateTransform(移动它)和RotateTransform(旋转它)[相同的孩子TransformationGroup]
当画布不旋转(或旋转 90 度,因为它是相同的)时,我可以轻松获取画布的左上角 x,y 坐标,但我面临的问题是左上角(以及另一个3 点)坐标。
这是因为当应用 RotateTransform 时,TranslateTransform 的 X 和 Y 属性没有改变(因此仍然表明正方形的左上角类似于虚线正方形(来自图片)
Canvas 正在从它的中心旋转,这就是它的原点。
那么如何获得旋转后 4 个点的“新”x 和 y 坐标?
[更新]
alt text http://img25.imageshack.us/img25/8676/shaperotationaltransfor.jpg
我找到了一种在旋转后找到 top-left 坐标的方法(正如您从新图像中看到的那样),方法是将 OffsetX 和 OffsetY 从旋转添加到起始 X 和 Y坐标。
但我现在无法确定其余坐标(其他 3 个)。
有了这个旋转的形状,我怎样才能算出剩余 3 个角的 x 和 y 坐标?
[编辑]
第二张图片中的点不是准确和精确的点。我在脑海中做出了估计。
[更新]解决方案:
首先,我要感谢Jason S 的那篇冗长且内容丰富的帖子,他在其中描述了整个过程背后的数学;通过阅读您的帖子并尝试这些价值观,我当然学到了很多东西。
但我现在找到了一个代码 sn-p(感谢EugeneZ 提到了TransformBounds),它完全符合我的要求:
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));
}
参考:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/86350f19-6457-470e-bde9-66e8970f7059/
【问题讨论】:
-
在这里你可以找到最简单的方法stackoverflow.com/a/22511805/2106820