4

参考我目前正在构建的这个编程游戏。

我正在使用 WPF 为画布设置动画,并且正在使用该BeginAnimation方法在另一个画布上转换(移动)画布。

使用 BeginAnimation,我需要指定 x 和 y 的From坐标To,这就是我使用的方法,如下所示:

//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坐标(画布当前所在的位置)和距离(以px为单位),我如何计算结束坐标?即画布最终将被翻译到的地方。

替代文字 http://img244.imageshack.us/img244/4794/canvastranspositionmi5.jpg

在上图中,我绘制了一个我想要实现的示例。

假设画布(实线框)的当前航向(角度)为 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

4 回答 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首先获得以弧度表示的值。

于 2009-02-10T22:17:57.563 回答
2

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

单位圆的角度从右侧开始,逆时针方向。所以在单位圆中,你的 130 度角实际上是 320 度。

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

另一件需要注意的是cosandsin函数使用的是弧度而不是度数。

angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)
于 2009-02-10T22:55:07.273 回答
1

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

请注意,我不会尝试我所说的,所以也许有一些错误。

我将你正在移动的方格称为 Visual B,

我将方形 Visual 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 反映了你想要什么。

于 2009-02-10T23:17:53.177 回答
0

如果您有来自 Visual A 原点的对象坐标并且想要来自 Visual B 原点的对象坐标,请查看TransformToVisual ,然后执行

   var transformation = A.TransformToVisual(B);

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

于 2009-02-10T22:33:59.617 回答