python - 类似于划船划水的代码

标签 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)

如您所见,船的速度和行数与每分钟的划水次数有关。每次调用 move(deltaT) 方法时,它都会根据步调移动一定距离。

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

Rowing Stroke Graph 来源:highperformancerowing.net

配速应随时间保持不变,但应在划水过程中发生变化。

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

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

最佳答案

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

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 - 类似于划船划水的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27786146/

相关文章:

python - 类型错误 : 'itertools.combinations' object is not subscriptable

c# - C# 中的 3D 样条插值(曲面插值)

从平板电脑输入绘制平滑的线条

python - 模块未找到错误 : No module named 'ffmpeg' on Spyder although ffmpeg is installed on Anaconda navigator

python - 如何在 Python 中获取类引用的具体名称(例如 "<module_name>"."<class_name">)?

python - 尝试用 pyqtgraph 做一个简单的撤消方法

r - 使用 ggmaps 创建黑白 map

python - 使用极坐标法追踪相位、轴和地球方向的椭圆轨道

python - Bokeh 中轴类型日期时间的矩形散点图

svg - 是否有 SVG API 允许在生成后获取 Bezier 和 Spline 点坐标?