我如何移动在设备上下文python中绘制的对象

时间:2020-03-06 14:39:26  来源:igfitidea点击:

我已经使用python在设备上下文中绘制了图像,并且想要垂直或者水平地平滑/动画化它。

我应该使用什么算法?在哪里可以找到有关此类python任务的信息?

解决方案

一旦在设备上下文中绘制了对象,它就会停留在该位置。如果要移动它,则需要重画它。

我们可以保持固定的背景,并且仅在可移动元素每次移动时才重新绘制它们。基本上就是这样。

为了使对象在直线上平滑移动,我们必须执行以下操作(我尚未准备好程序,因此只能给我们一个想法):

  • 选择起点和终点:点A(x1,y1)和B(x2,y2)
  • 选择对象应在多长时间内将位置从A更改为B(例如10秒)。
  • 使用设置为一定间隔(例如2秒)的计时器
  • 计算对象应在每个计时器间隔内更改的增量X和Y。在这种情况下dx =(x2-x1)* 2/10和dy =(y2-y1)* 2/10
  • 在计时器回调中,使用dx和dy递增当前对象的位置,然后重绘图像

那就是算法。

我建议我们也来看看PyGame。也许我们可以使用它,并且它也包含一些教程。

为了使对象在起始坐标((x1,y1))和目标坐标((x2,y2))之间平滑移动,我们需要先问自己,要到达目标的时间应该多长。假设我们希望对象以" t"个时间单位(可能是几秒钟,几小时等)到达那里。一旦确定了这一点,那么就可以轻松地计算每单位时间的位移:

dx = (x2-x1)/t
dy = (y2-y1)/t

现在,我们只需要在每个单位时间向对象的位置((x,y),最初是(x1,y1))添加(dx,dy),并在对象达到以下阈值距离时停止目的地。这是为了说明除法误差会累积的事实,因此,如果进行了相等性检查,例如:

(x,y)==(x2,y2)

这不可能是真的。

请注意,上述方法为我们提供恒定的速度,直线运动。我们可能希望使用某种稍微复杂些的公式来使对象呈现加速,保持巡航速度然后减速的外观。以下公式可能会有用:

v(t) = u(t) + t*a(t)
x(t) = v(t) + t*v(t)

这仅仅是Euler的方法,对于动画目的应该足够了。