我有一个Java程序,它根据正弦函数asin(bx)
移动一个对象。
通过将x参数更改为时间间隔x速度,对象以一定速度移动。但是,这仅沿x轴以恒定速度移动对象。
我想要做的是沿着函数的曲线以恒定的切向速度移动对象。有人可以帮帮我吗?感谢。
答案 0 :(得分:4)
作为x的函数的arc length on a sine curve是第二类的椭圆积分。要在移动特定距离(或具有给定速度的特定时间)后确定x坐标,您需要反转此椭圆积分。这不是一个基本功能。
有些方法可以近似椭圆积分的倒数,这比你想象的要简单得多。您可以将诸如Simpson's rule的良好数值积分算法与牛顿方法或二分搜索相结合,以找到弧长(x)= kt的数字根。这是否过于昂贵,取决于您需要的准确程度以及更新频率。如果您估计一个周期的长度一次,然后在一个周期内减小t mod弧长,则误差将显着减小。
您可能尝试的另一种方法是使用与正弦曲线不同的曲线,并使用更易处理的弧长参数化。不幸的是,很少有这些,这就是为什么微积分书中的弧长练习一遍又一遍地重复相同类型的曲线。另一种可能性是接受一个不恒定的速度但不会超过或低于指定常数的速度,这可以通过一些傅立叶分析得到。
另一种方法是将弧长参数化识别为二维常微分方程的解。一阶数值近似(Euler方法)可能就足够了,我认为Leandro Caniglia的回答表明了这一点。如果您发现舍入错误太大,则可以使用更高阶的方法,例如Runge-Kutta。
答案 1 :(得分:3)
假设您有一个函数f(x)
来描述xy
平面中的曲线。问题在于沿着该曲线以恒定速度S
移动一个点(即,以恒定的切向速度,如你所说的那样。)
所以,让我们立即开始t
和x
位置。该点具有坐标(x, f(x))
。稍后,比如说,t + dt
点已移至(x + dx, f(x + dx))
。
这两个地点之间的距离是:
dist = sqrt((x + dx - dx) 2 +(f(x + dx) - f(x)) 2 )= sqrt(dx < sup> 2 +(f(x + dx) - f(x)) 2 )
现在,让我们向右分解dx。我们得到:
dist = sqrt(1 + f&#39;(x) 2 )dx
其中f&#39;(x)是导数(f(x + dx)-f(x))/ dx。
如果我们现在除以经过的时间dt得到
dist / dt = sqrt(1 + f&#39;(x) 2 )dx / dt。
但是dist / dt是点沿曲线移动的速度,所以它是常数S.然后
S = sqrt(1 + f&#39;(x) 2 )dx / dt
解决dx
dx = S / sqrt(1 + f&#39;(x) 2 )dt
它为您提供了在dt单位时间之后移动点的x坐标的程度。