代码类似于划船冲程

MOn*_*DaR 6 python plot spline smoothing

我正在研究一个显示移动划艇的小程序.以下显示了一个简单的示例代码(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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,船只有一个步速和每分钟行数.每次move(deltaT)调用该方法时,它都会根据速度移动一定距离.

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

划船冲程图 资料来源:highperformancerowing.net

速度应该随着时间的推移而保持不变,但它应该在中风期间发生变化.

将恒定速度改变为曲线的最佳方法是什么(至少基本上)类似于更逼真的划船冲程?

注意:有关如何更好地标记此问题的任何想法?这是算法问题吗?

Mar*_*som 2

如果您的目标只是想出一些视觉上合理的东西,而不是进行完整的物理模拟,您可以简单地向该位置添加正弦波。

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)
Run Code Online (Sandbox Code Playgroud)

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