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(小心,触碰会影响性能)