如何以恒定速度沿着正弦函数移动
How to move along sinus function at constant speed
我有一个 Java 程序可以根据正弦函数 asin(bx)
移动物体。
物体以一定的速度运动,通过改变x参数的时间间隔x速度。但是,这只会沿 x 轴以恒定速度移动对象。
我要做的是沿着函数的曲线以恒定的切线速度移动物体。有人可以帮我吗?谢谢
假设您有一个函数 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(dx2 + (f(x+dx) - f(x))2)
现在,我们分解出右边的 dx。我们得到:
dist = sqrt(1 + f'(x)2) dx
其中 f'(x) 是导数 (f(x+dx) - f(x)) /dx。
如果我们现在除以经过的时间 dt,我们得到
dist/dt = sqrt(1 + f'(x)2) dx/dt.
但是dist/dt是点沿曲线移动的速度,所以是常数S。那么
S = sqrt(1 + f'(x)2) dx/dt
求解 dx
dx = S / sqrt(1 + f'(x)2) dt
它给出了在 dt 个时间单位后必须将点的 x 坐标移动多少。
作为x的函数的arc length on a sine curve是第二类椭圆积分。要在移动特定距离(或以给定速度移动特定时间)后确定 x 坐标,您需要反转此椭圆积分。这不是基本功能。
有一些方法可以近似计算椭圆积分的逆,这些方法比您预期的要简单得多。您可以将良好的数值积分算法(例如 Simpson's rule)与牛顿法或二进制搜索相结合,以找到弧长 (x) = kt 的数值根。这在计算上是否过于昂贵取决于您需要它的准确性以及您需要多久更新一次。如果你估算一次一个周期的长度,然后在一个周期上减少 t mod 个弧长,误差会大大减少。
您可能会尝试的另一种方法是使用与正弦曲线不同的曲线,该曲线具有更易于处理的弧长参数化。不幸的是,这样的曲线很少,这就是为什么微积分书籍中的弧长练习一遍又一遍地重复相同类型的曲线。另一种可能性是接受一个不恒定但不会超过或低于指定常数太多的速度,您可以通过一些傅立叶分析获得该速度。
另一种方法是将弧长参数化识别为二维常微分方程的解。一阶数值近似(欧拉方法)可能就足够了,我认为这就是 Leandro Caniglia 的回答所暗示的。如果发现四舍五入误差太大,可以使用高阶的方法如Runge-Kutta.
我有一个 Java 程序可以根据正弦函数 asin(bx)
移动物体。
物体以一定的速度运动,通过改变x参数的时间间隔x速度。但是,这只会沿 x 轴以恒定速度移动对象。
我要做的是沿着函数的曲线以恒定的切线速度移动物体。有人可以帮我吗?谢谢
假设您有一个函数 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(dx2 + (f(x+dx) - f(x))2)
现在,我们分解出右边的 dx。我们得到:
dist = sqrt(1 + f'(x)2) dx
其中 f'(x) 是导数 (f(x+dx) - f(x)) /dx。
如果我们现在除以经过的时间 dt,我们得到
dist/dt = sqrt(1 + f'(x)2) dx/dt.
但是dist/dt是点沿曲线移动的速度,所以是常数S。那么
S = sqrt(1 + f'(x)2) dx/dt
求解 dx
dx = S / sqrt(1 + f'(x)2) dt
它给出了在 dt 个时间单位后必须将点的 x 坐标移动多少。
作为x的函数的arc length on a sine curve是第二类椭圆积分。要在移动特定距离(或以给定速度移动特定时间)后确定 x 坐标,您需要反转此椭圆积分。这不是基本功能。
有一些方法可以近似计算椭圆积分的逆,这些方法比您预期的要简单得多。您可以将良好的数值积分算法(例如 Simpson's rule)与牛顿法或二进制搜索相结合,以找到弧长 (x) = kt 的数值根。这在计算上是否过于昂贵取决于您需要它的准确性以及您需要多久更新一次。如果你估算一次一个周期的长度,然后在一个周期上减少 t mod 个弧长,误差会大大减少。
您可能会尝试的另一种方法是使用与正弦曲线不同的曲线,该曲线具有更易于处理的弧长参数化。不幸的是,这样的曲线很少,这就是为什么微积分书籍中的弧长练习一遍又一遍地重复相同类型的曲线。另一种可能性是接受一个不恒定但不会超过或低于指定常数太多的速度,您可以通过一些傅立叶分析获得该速度。
另一种方法是将弧长参数化识别为二维常微分方程的解。一阶数值近似(欧拉方法)可能就足够了,我认为这就是 Leandro Caniglia 的回答所暗示的。如果发现四舍五入误差太大,可以使用高阶的方法如Runge-Kutta.