类似划船的代码

2024-09-28 22:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个小程序展示移动的划艇。下面显示了一个简单的示例代码(Python 2.x):

import time
class Boat:
    def __init__(self, pace, spm):
        self.pace = pace  #velocity of the boat in m/s
        self.spm = spm    #strokes per minute
        self.distance = 0 #distance travelled

    def move(self, deltaT):
        self.distance = self.distance + (self.pace * deltaT)

boat1 = Boat(3.33, 20)
while True:
    boat1.move(0.1)
    print boat1.distance
    time.sleep(0.1)

正如你所看到的,船有一个速度和每分钟划船的次数。每次调用move(deltaT)方法时,它都会根据速度移动一定距离。在

上面的船只是以恒定的速度行驶,这是不现实的。一艘真正的划艇在划桨开始时加速,然后在划桨离开水面后减速。网上有许多图表显示了典型的划船曲线(此处显示的力,速度看起来相似):

Rowing Stroke Graph 来源:highperformancerowing.net

随着时间的推移,速度应该是恒定的,但是在划水过程中它应该改变。在

把等速变成曲线的最佳方法是什么(至少基本上)类似于更真实的划船划水?在

注意:关于如何更好地标记这个问题有什么想法吗?是算法问题吗?


Tags: 方法self程序movetimedef曲线速度
3条回答

你可以对运动微分方程进行简单的积分。(这就是你已经在做的,以恒定的速度,将空间作为时间的函数,x' = x + V.dt。)

假设一个简单的模型,在冲程中有一个恒定的力,滑翔时没有力,阻力与速度成正比。在

所以在划水时加速度是a = P - D.v,滑行(减速)时是- D.v。在

速度近似于v' = v + a.dt。在

空间近似于x' = x + v.dt。在

如果dt足够小,则此运动应该看起来很真实。你可以用一个更精确的力定律和更好的积分技术(如龙格库塔)来完善模型,但我不确定它是否值得。在

下面是一个使用这种技术的速度和空间与时间的关系图。它显示速度振荡很快建立了一个周期性的区域,和准线性位移波动。在

enter image description here

如果你的目标是简单地提出一些视觉上合理的东西,而不是做一个完整的物理模拟,你可以简单地添加一个正弦波的位置。在

class Boat:
    def __init__(self, pace, spm, var=0.5):
        self.pace = pace    #average velocity of the boat in m/s
        self.sps = spm/60.0 #strokes per second
        self.var = var      #variation in speed from 0-1
        self.totalT = 0     #total time
        self.distance = 0   #distance traveled

    def move(self, deltaT):
        self.totalT += deltaT
        self.distance = self.pace * (self.totalT + self.var * math.sin(self.totalT * self.sps * 2*math.pi)

你需要小心变化var,如果它太高,船可能会倒退并破坏幻觉。在

你可以把这样的曲线转换成速度的多项式方程。在

有关如何执行此操作的说明/示例,请访问:

python numpy/scipy curve fitting

这将向您展示如何获取一组x,y坐标(可以通过检查现有绘图或从实际数据中获得)并创建多项式函数。在

如果对每个船对象使用相同的曲线,可以将其硬编码到程序中。但是你也可以为每一个船的对象有一个单独的多项式方程,假设每个划船者或船有不同的轮廓。在

相关问题 更多 >