2

我想绘制绘制极坐标曲线(螺旋)的动画。我正在使用 javascript 和画布。目前,我正在使用 setInterval 调用一个绘图函数,该函数绘制从极曲线的参数表示中找到的 x 和 y 坐标(x 和 y 以 theta 表示)。我将 theta 增加 0.01,从 0 到 2*pi,每次调用 draw() 一次。问题是我希望动画为每次绘制调用绘制相同数量的曲线,以便绘制看起来以均匀的速度进行。每次调用draw之间的时间是否不同都没有关系;我只需要整个 awing 的速度(以绘制的像素/绘制的调用数为单位)保持不变。换句话说,我需要为每次绘制调用绘制的极坐标图段的弧长相同。我不知道该怎么做。任何帮助/建议将不胜感激。谢谢

4

2 回答 2

1

让 f(z) 成为您在问题中所指的 theta 变量。这里有两个参数方程应该与你所拥有的非常相似:

x(f(z)) = f(z)cos(f(z))
y(f(z)) = f(z)sin(f(z))

我们可以将 f(z) 处的位置 p(f(z)) 定义为

p(f(z)) = [x(f(z)), y(f(z))]

f(z) 处的速度 s(f(z)) 是 p 在 f(z) 处的导数的长度。

x'(f(z)) = f'(z)cos(f(z)) - f(z)f'(z)sin(f(z))
y'(f(z)) = f'( z)sin(f(z)) + f(z)f'(z)cos(f(z))

s(f(z)) = 长度(p'(f(z))) = 长度([x'(f(z)), y'(f(z))])

= 长度([f'(z)cos(f(z)) - f(z)f'(z)sin(f(z)), f'(z)sin(f(z)) + f(z )f'(z)cos(f(z))])

= sqrt([f'(z)cos(f(z))] 2 + [f(z)f'(z)sin(f(z))] 2 + [f'(z)sin(f(z) ))] 2 + [f(z)f'(z)cos(f(z))] 2 )

= sqrt(f'(z) + [f(z)f'(z)] 2 )

如果您希望速度 s(f(z)) 在 C 处保持恒定,因为 z 以 1 的恒定速率增加,您需要求解这个一阶非线性常微分方程:

s(f(z)) = sqrt(f'(z) + [f(z)f'(z)] 2 ) = C

http://www.wolframalpha.com/input/?i=sqrt%28f%27%28z%29+%2B+%5Bf%28z%29f%27%28z%29%5D%5E2%29+%3D+C

解决这个问题会给你一个函数 theta = f(z),当你不断增加 z 时,你可以用它来计算 theta。然而,这个微分方程没有封闭形式的解。

换句话说,你必须猜测你应该在每一步增加多少 theta,对 delta 进行二进制搜索以添加到 p(t) 上的 theta 和线积分,以评估每个猜测移动的距离。

于 2013-08-14T21:30:18.617 回答
1

更简单的方法 - 将参数更改为与步进弧长成比例的 setInterval。这样您就不必尝试反转弧长方程。如果间隔开始变得太大,您可以调整步长,但也可以大致调整。

于 2013-08-16T04:35:26.457 回答