类似于划船划水的代码
Code to resemble a rowing stroke
我正在开发一个显示移动划艇的小程序。下面是一个简单的示例代码(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)
被调用时,它都会根据步伐移动一定距离。
上面的船只是匀速行驶,不现实。真正的划艇在开始划水时会加速,然后在桨叶离开水面后减速。网上有很多图表显示了典型的划船曲线(这里显示的是力,速度看起来很相似):
资料来源:highperformancerowing.net
配速应随时间保持不变,但应在划水过程中发生变化。
将恒定速度变为(至少基本上)类似于更逼真的划船划水的曲线的最佳方法是什么?
注意:关于如何更好地标记这个问题有什么想法吗?是 algorithm-problem?
您可以将这样的曲线转换为速度的多项式方程。
有关如何执行此操作的 description/example 可在以下位置找到:
python numpy/scipy curve fitting
这将向您展示如何获取一组 x,y 坐标(您可以通过检查现有绘图或从实际数据中获得)并创建多项式函数。
如果您对每个 Boat 对象使用相同的曲线,您可以将其硬编码到您的程序中。但是您也可以为每个 Boat 对象设置一个单独的多项式方程,假设每个划船者或船都有不同的配置文件。
您可以对运动微分方程进行简单积分。 (这就是你已经在做的事情,以获得 space 作为时间的函数,速度恒定,x' = x + V.dt
。)
假设一个简单的模型,在行程期间力恒定,在滑行期间没有力,阻力与速度成正比。
因此在行程期间加速度为a = P - D.v
,在滑行(减速)期间加速度为- D.v
。
速度近似为v' = v + a.dt
。
space近似为x' = x + v.dt
。
如果dt
足够小,这个动作应该看起来很逼真。您可以使用更准确的力定律和更好的集成技术来改进模型,例如 Runge-Kutta,但我不确定是否值得这样做。
下面是使用此技术的速度和 space 与时间的示例图。它显示速度振荡快速建立周期性状态,并且 quasi-linear 位移有起伏。
如果您的目标只是想出一些视觉上合理的东西而不是进行完整的物理模拟,您可以简单地在该位置添加一个正弦波。
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 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)
被调用时,它都会根据步伐移动一定距离。
上面的船只是匀速行驶,不现实。真正的划艇在开始划水时会加速,然后在桨叶离开水面后减速。网上有很多图表显示了典型的划船曲线(这里显示的是力,速度看起来很相似):
配速应随时间保持不变,但应在划水过程中发生变化。
将恒定速度变为(至少基本上)类似于更逼真的划船划水的曲线的最佳方法是什么?
注意:关于如何更好地标记这个问题有什么想法吗?是 algorithm-problem?
您可以将这样的曲线转换为速度的多项式方程。
有关如何执行此操作的 description/example 可在以下位置找到:
python numpy/scipy curve fitting
这将向您展示如何获取一组 x,y 坐标(您可以通过检查现有绘图或从实际数据中获得)并创建多项式函数。
如果您对每个 Boat 对象使用相同的曲线,您可以将其硬编码到您的程序中。但是您也可以为每个 Boat 对象设置一个单独的多项式方程,假设每个划船者或船都有不同的配置文件。
您可以对运动微分方程进行简单积分。 (这就是你已经在做的事情,以获得 space 作为时间的函数,速度恒定,x' = x + V.dt
。)
假设一个简单的模型,在行程期间力恒定,在滑行期间没有力,阻力与速度成正比。
因此在行程期间加速度为a = P - D.v
,在滑行(减速)期间加速度为- D.v
。
速度近似为v' = v + a.dt
。
space近似为x' = x + v.dt
。
如果dt
足够小,这个动作应该看起来很逼真。您可以使用更准确的力定律和更好的集成技术来改进模型,例如 Runge-Kutta,但我不确定是否值得这样做。
下面是使用此技术的速度和 space 与时间的示例图。它显示速度振荡快速建立周期性状态,并且 quasi-linear 位移有起伏。
如果您的目标只是想出一些视觉上合理的东西而不是进行完整的物理模拟,您可以简单地在该位置添加一个正弦波。
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
,如果它太高,船可能会倒退并破坏幻觉。