WPF中的数学:在平移后获取新的x,y坐标

4

关于我正在构建的编程游戏,我希望您能协助翻译以下内容。

我正在使用WPF来动画化画布,并且我正在使用BeginAnimation方法在另一个画布上移动画布。

使用BeginAnimation,我需要指定x和y的FromTo坐标,我是这样使用的:

//X 
Animator_Body_X.From = Translate_Body.X; //Current x-coordinate
Animator_Body_X.To = //The end X-coordinate
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

//Y
Animator_Body_Y.From = Translate_Body.Y; //Current y-coordinate
Animator_Body_Y.To = //The end Y-coordinate
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);

现在需要使用给定的角度来翻译画布,我可以从方法中获取该角度。因此我的问题是,给定画布当前旋转的角度(0-359),起始x和y坐标(画布当前所在位置)以及距离(以像素为单位),如何计算结束坐标?也就是画布最终要被翻译到哪里。在上面的图像中,我画了一个示例,展示了我想要实现的内容。假设画布(实线边框框)当前的头部(角度)为130度,并且需要沿着该角度向下移动(即取决于它当前朝向的位置)200像素...画布的新坐标将是什么(它将停止动画:虚线边框框)?我如何计算它将停止的这些新坐标? [更新]解决方案:
感谢AndyCameron的帮助,现在它终于按照预期工作了。
以下是可用的代码:
double headingRadians = Heading * (Math.PI / 180);

Animator_Body_X.From = Translate_Body.X;
Animator_Body_X.To = Math.Sin(headingRadians) * pix + Translate_Body.X;
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

Animator_Body_Y.From = Translate_Body.Y;
Animator_Body_Y.To = ((Math.Cos(headingRadians) * pix) * -1) + Translate_Body.Y;
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);
4个回答

3
假设您从12点钟方向顺时针旋转,您的新x坐标将为:
sin(130) * 200 = 153 + original x-coordinate

您的新y坐标将会是:

cos(130) * 200 = -129 + original y-coordinate (assuming negative 'y' is down)

如下所示,需要注意的是,在C#中,例如sincos使用弧度而不是角度 - 首先乘以Math.PI/180将值转换为弧度。

它几乎可以工作了,使用你的方程式。 但是它向后移动,而不是向前。我应该在方程式中改变什么? - Andreas Grech
1
是的 - 起始点。如果您向下移动页面时“y”坐标变大,则可能需要将cos(130)* 200的结果乘以-1。 - Andy Mikula

2
你可以使用cossin来计算x和y坐标的移动量。这是基于单位圆的。

单位圆的角度从右侧开始,逆时针方向旋转。因此,在单位圆中,130度的角度实际上是320度。

actualAngle = 90 - 130 = -40 
(which is the same as 320 degrees when used in sin/cos)

另外需要注意的是,cossin函数使用的是弧度而非角度。
angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)

它几乎可以工作了,但是y坐标上升而不是下降。我应该从方程中改变什么? - Andreas Grech
还有,我如何推导出正确的单位圆角度?就像你从130推导出320一样。也就是说,我应该使用什么公式? - Andreas Grech

1

我将详细说明如何在不使用数学的情况下完成以下操作:

请注意,我没有尝试我所说的话,因此可能存在一些错误。

我将称您正在移动的正方形为“可视B”,

我将称正方形所在的容器为“可视A”。

现在,您希望能够将B从B原点移动到B',并从A原点检索B'坐标。

如果您的平移是(200,0),则B'相对于B原点的坐标为(200,0)。 您希望从A原点获得这些坐标。所以您需要执行以下操作。

var transform = B.TransformToVisual(A);
var pointFromAOrigin  = transform.Transform(new Point(200,0));

pointFromAOrigin 反映您想要的内容。


0

如果您有来自Visual A原点的对象坐标,并且想要从Visual B原点获取对象坐标,请查看TransformToVisual

   var transformation = A.TransformToVisual(B);

如果需要,您可以将GeneralTransform转换为Transform。 然后,您可以使用GeneralTransform对象的Transform方法。


但在这种情况下,B不存在,因为画布没有移动到另一个对象。 但感谢提到TransformToVisual; 我不知道它,我会用它做其他事情。 - Andreas Grech
在这种情况下,B是您正在移动的对象,其在画布上的坐标为(300,400)。 - Nicolas Dorier
抱歉,我的意思是B是你的Windows,而A是正方形(你称之为Canvas)。请看我的其他回答。 - Nicolas Dorier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接