WPF:在旋转后获取新坐标
关于我目前正在建设的 要在WPF中翻译画布,我使用两种形式:WPF:在旋转后获取新坐标,wpf,math,transform,Wpf,Math,Transform,关于我目前正在建设的 要在WPF中翻译画布,我使用两种形式:TranslateTransform(移动它)和RotateTransform(旋转它)[同一个转换组的子项] 当画布未旋转(或旋转90度,因为它将是相同的)时,我可以轻松获得画布的左上角x,y坐标,但我面临的问题是获取左上角(和其他3个点)坐标 这是因为当应用RotateTransform时,TranslateTransform的X和Y属性没有改变(因此仍然指示正方形的左上角类似于点正方形(从图像中) 画布正在从其中心旋转,因此这是
TranslateTransform
(移动它)和RotateTransform
(旋转它)[同一个转换组的子项
]
当画布未旋转(或旋转90度,因为它将是相同的)时,我可以轻松获得画布的左上角x,y坐标,但我面临的问题是获取左上角(和其他3个点)坐标
这是因为当应用RotateTransform
时,TranslateTransform
的X
和Y
属性没有改变(因此仍然指示正方形的左上角类似于点正方形(从图像中)
画布正在从其中心旋转,因此这是其原点
因此如何在旋转后获得4个点的“新”x和y坐标
[更新]
我找到了一种方法,通过将旋转中的偏移量X和偏移量添加到起始X和Y坐标,找到旋转后左上方的坐标
但我现在很难计算出其余的坐标(其他3个)
使用此旋转形状,如何计算其余3个角的x和y坐标?
[编辑]
第二张图中的点不是精确的点。我在头脑中估计了这些点
[更新]解决方案:
首先,我要感谢他在那篇冗长且内容丰富的帖子中描述了整个过程背后的数学原理;通过阅读你的帖子并尝试这些价值观,我当然学到了很多
但我现在发现了一个代码片段(感谢您提到的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));
}
参考资料:我不确定,但这就是您要寻找的-笛卡尔坐标系中点的旋转:
您可以对具有相同变换的点使用Transform.Transform()方法,以获得应用这些变换的新点。如果我正确理解您的问题:
given:
shape has corner (x1,y1), center (xc,yc)
rotated shape has corner (x1',y1') after being rotated about center
desired:
how to map any point of the shape (x,y) -> (x',y') by that same rotation
以下是相关方程式:
(x'-xc) = Kc*(x-xc) - Ks*(y-yc)
(y'-yc) = Ks*(x-xc) + Kc*(y-yc)
其中,Kc=cos(theta)
和Ks=sin(theta)
和theta
是逆时针旋转的角度。(为了验证:如果theta=0,则保持坐标不变,否则如果xc=yc=0,则将(1,0)映射到(cos(theta),sin(theta))和(0,1)映射到(-sin(theta),cos(theta))。注意:这适用于坐标系,其中(x,y)=(1,1)在右上象限。对于右下象限,θ是顺时针旋转的角度,而不是逆时针旋转的角度。)
如果你知道矩形的坐标与x-y轴对齐,那么xc就是两个x坐标的平均值,yc就是两个y坐标的平均值。(在你的情况下,它是xc=75,yc=85。)
如果你知道θ,你现在有足够的信息来计算新的坐标。
如果你不知道θ,你可以解Kc,Ks。下面是你例子的相关计算:
(62-75) = Kc*(50-75) - Ks*(50-85)
(40-85) = Ks*(50-75) + Kc*(50-85)
-13 = -25*Kc + 35*Ks = -25*Kc + 35*Ks
-45 = -25*Ks - 35*Kc = -35*Kc - 25*Ks
这是一个可以解决的问题(读者练习:在MATLAB中:
[-25 35;-35 -25]\[-13;-45]
在这种情况下,Kc=1.027,Ks=0.3622是没有意义的(对于纯旋转,K2=Kc2+Ks2应该等于1;在这种情况下,K=1.089)因此,它不是围绕矩形中心的纯旋转,这是您的图纸所示。它似乎也不是围绕原点的纯旋转。要进行检查,请使用毕达哥拉斯定理比较旋转前后与旋转中心的距离,d2=deltax2+deltay2。(对于围绕xc=75,yc=85的旋转,之前的距离是43.01,之后的距离是46.84,比率是K=1.089;对于围绕原点的旋转,之前的距离是70.71,之后的距离是73.78,比率是1.043。我可以相信坐标舍入到整数会产生1.01或更小的比率,但这显然大于舍入误差)
所以这里缺少一些信息。你是如何得到数字(62,40)的
然而,这是旋转背后数学的基本要点
编辑:啊哈,我没有意识到它们是估计值。(虽然非常接近现实!)看看GeneralTransform.TransformBounds()方法。我使用这个方法:
Point newPoint = rotateTransform.Transform(new Point(oldX, oldY));
其中rotateTransform是我工作和设置角度的实例…等等。将查看它。谢谢。Transform()接受一个点变量。该点的x和y应该是什么?根据更新的问题,Transform()方法将完全满足您对任何点(包括正方形的其他角点)的需要。“可以使用Transform.Transform()”使用与应用于对象相同的变换(即,在本例中,使用具有旋转和平移变换的TransformGroup实例)通过将起始X和Y坐标添加到从旋转矩阵中检索到的偏移量X和偏移量Y,我得到了这些数字。因此,如果偏移量X为12,“未旋转”形状的X为50,则新的X(旋转后)是62。Y坐标的情况也一样,只是为了澄清:我在图像中放置的点不是真实的点,甚至偏移量也不是真实的;我只是为图像制作了它们。我认为这些值是一个粗略的估计,他以插图为例。哦,好的。这是一个非常好的估计,那么,你保持了大约百分之一的半径r在其预旋转值的10%以内。:)在这里您可以找到最简单的方法