C# WPF:移动速度(平移)随距离变化
关于我目前正在建设的 我编写了以下方法,根据画布的当前角度将画布移动(平移)到特定距离:C# WPF:移动速度(平移)随距离变化,c#,wpf,math,canvas,physics,C#,Wpf,Math,Canvas,Physics,关于我目前正在建设的 我编写了以下方法,根据画布的当前角度将画布移动(平移)到特定距离: private void MoveBot(double pix, MoveDirection dir) { if (dir == MoveDirection.Forward) { Animator_Body_X.To = Math.Sin(HeadingRadians) * pix; Animator_Body_Y.To
private void MoveBot(double pix, MoveDirection dir)
{
if (dir == MoveDirection.Forward)
{
Animator_Body_X.To = Math.Sin(HeadingRadians) * pix;
Animator_Body_Y.To = ((Math.Cos(HeadingRadians) * pix) * -1);
}
else
{
Animator_Body_X.To = ((Math.Sin(HeadingRadians) * pix) * -1);
Animator_Body_Y.To = Math.Cos(HeadingRadians) * pix;
}
Animator_Body_X.To += Translate_Body.X;
Animator_Body_Y.To += Translate_Body.Y;
Animator_Body_X.From = Translate_Body.X;
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);
Animator_Body_Y.From = Translate_Body.Y;
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);
TriggerCallback();
}
它接受的参数之一是平移时应覆盖的像素数
关于上述代码,Animator\u Body\u X
和Animator\u Body\u Y
类型为DoubleAnimation
,然后应用于机器人的TranslateTransform
对象:Translate\u Body
我面临的问题是,机器人(一块帆布)根据输入的距离以不同的速度移动。因此,距离越远,机器人移动得越快!因此,如果输入的距离为
20
,则机器人移动相当缓慢,但如果输入的距离为800
,则机器人会从屏幕上弹出
我需要使该速度恒定,与输入的距离无关。
我想我需要根据输入的距离调整一些Animator_Body_X
和Animator_Body_Y
属性,但我不知道具体调整什么(我想还需要做一些数学计算)
这是一个你可能想看一看来解决这个问题的例子。你使用DoubleAnimation有什么原因吗?DoubleAnimation设计用于在特定时间段内,根据需要,在该时间段的开始/结束时使用线性插值加速/减速,从a到B取一个值(这就是为什么它在更长距离内“更快”……它在同一时间内必须走得更远!)。从外观上看,你想做的是根据物体所面对的方向,在每个“帧”之间移动固定距离的物体?那似乎不适合我
您可以根据距离计算动画的长度,因此距离越长,动画长度越长,则项目始终以相同的“速度”移动。对我来说,自己移动物品更有意义。您可以根据角度标准计算对象速度,然后在每个“帧”中,您可以根据该速度手动将项目移动到所需的位置。使用此方法,如果需要,您还可以轻松地将摩擦力等应用于速度。您需要做的数学是:速度*时间=距离 因此,要保持速度恒定,必须更改动画的持续时间:
double pixelsPerSecond = 5;
animation.Duration = TimeSpan.FromSeconds(distance/pixelsPerSecond);
顺便说一句,我不认为动画是移动机器人的最佳解决方案。Nir,你建议用什么代替动画?类似于使用分派器增加滴答声?也许,我在模拟方面有经验(但不是在WPF下),如果你想让运动看起来“自然”,就必须正确处理一些棘手的细节。在Win32中,我们使用了WM_PAINT循环,我认为WPF等效于CompositionTarget.Rendering(小心,触碰会影响性能)