参考我目前正在制作的this programming game。
我使用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为单位),我该怎么办计算结束坐标?即最终将画布转换为。
alt text http://img244.imageshack.us/img244/4794/canvastranspositionmi5.jpg
在上图中,我画了一个我想要实现的例子。
假设画布(实心边框)的当前标题(角度)为130度,并且需要将其转换(沿着该角度的路径;即取决于它当前面对的位置)200像素。 ..什么是画布的新坐标(它将停止动画:虚线边框)?如何计算它将停止的新坐标?
[更新]解决方案:
这是工作代码:
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);
答案 0 :(得分:3)
假设您从12点顺时针旋转,则新的x坐标将为:
sin(130) * 200 = 153 + original x-coordinate
你的新y坐标将是
cos(130) * 200 = -129 + original y-coordinate (assuming negative 'y' is down)
如下所示,请注意,在C#中,sin
和cos
采用弧度而非度数 - 乘以Math.PI/180
以获得弧度值。
答案 1 :(得分:2)
您可以使用cos
和sin
来计算x和y坐标中的移动量。这基于unit circle。
单位圆的角度从右侧开始,逆时针方向。所以在单位圆中你的130度角实际上是320度。
actualAngle = 90 - 130 = -40
(which is the same as 320 degrees when used in sin/cos)
另一点需要注意的是cos
和sin
函数使用的是radians而不是度。
angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)
答案 2 :(得分:0)
查看TransformToVisual如果你有来自Visual A原点的对象坐标,你想要从Visual B原点得到对象的坐标,那么你可以
var transformation = A.TransformToVisual(B);
如果需要,您可以将转换从GeneralTransform转换为Transform。 然后,您可以使用GeneralTransform对象的Transform方法。
答案 3 :(得分:0)
我将详细说明如何在不使用数学的情况下做到:
请注意,我不会尝试我所说的,所以也许会有一些错误。
我将调用你正在移动Visual 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反映了你想要的东西。