我正在做一个小程序展示移动的划艇。下面显示了一个简单的示例代码(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)
方法时,它都会根据速度移动一定距离。在
上面的船只是以恒定的速度行驶,这是不现实的。一艘真正的划艇在划桨开始时加速,然后在划桨离开水面后减速。网上有许多图表显示了典型的划船曲线(此处显示的力,速度看起来相似):
随着时间的推移,速度应该是恒定的,但是在划水过程中它应该改变。在
把等速变成曲线的最佳方法是什么(至少基本上)类似于更真实的划船划水?在
注意:关于如何更好地标记这个问题有什么想法吗?是算法问题吗?
你可以对运动微分方程进行简单的积分。(这就是你已经在做的,以恒定的速度,将空间作为时间的函数,
x' = x + V.dt
。)假设一个简单的模型,在冲程中有一个恒定的力,滑翔时没有力,阻力与速度成正比。在
所以在划水时加速度是
a = P - D.v
,滑行(减速)时是- D.v
。在速度近似于
v' = v + a.dt
。在空间近似于
x' = x + v.dt
。在如果
dt
足够小,则此运动应该看起来很真实。你可以用一个更精确的力定律和更好的积分技术(如龙格库塔)来完善模型,但我不确定它是否值得。在下面是一个使用这种技术的速度和空间与时间的关系图。它显示速度振荡很快建立了一个周期性的区域,和准线性位移波动。在
如果你的目标是简单地提出一些视觉上合理的东西,而不是做一个完整的物理模拟,你可以简单地添加一个正弦波的位置。在
你需要小心变化
var
,如果它太高,船可能会倒退并破坏幻觉。在你可以把这样的曲线转换成速度的多项式方程。在
有关如何执行此操作的说明/示例,请访问:
python numpy/scipy curve fitting
这将向您展示如何获取一组x,y坐标(可以通过检查现有绘图或从实际数据中获得)并创建多项式函数。在
如果对每个船对象使用相同的曲线,可以将其硬编码到程序中。但是你也可以为每一个船的对象有一个单独的多项式方程,假设每个划船者或船有不同的轮廓。在
相关问题 更多 >
编程相关推荐