以均匀的速度绘制极坐标曲线

时间:2013-08-14 21:12:26

标签: math animation graph polar-coordinates

我想绘制一幅绘制极坐标曲线(螺旋线)的动画。我使用的是javascript和canvas。目前,我使用setInterval来调用绘制函数,该函数绘制了从极坐标曲线的参数表示(以θ表示的x和y)找到的x和y坐标。我将θ增加0.01,从0增加到2 * pi,每次调用draw()一次。问题是我希望动画为每个绘制调用绘制相同数量的曲线,以便绘图看起来以均匀的速度前进。如果每次抽签之间的时间不同,则无关紧要;我只需要速度(根据绘制的像素数/绘制的调用数)对整个awing保持不变。换句话说,我需要绘制每个调用绘制的极坐标图段的弧长是相同的。我不知道该怎么做。任何帮助/ sugestions将不胜感激。感谢

2 个答案:

答案 0 :(得分: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(z)处p的导数的长度。

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))= length(p'(f(z)))= length([x'(f(z)),y'(f(z))])

= length([f'(z)cos(f(z)) - f(z)f'(z)sin(f(z)),f'(z)sin(f(z))+ F(z)的F'(z)的余弦(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的数量,在delta上进行二进制搜索以在p(t)上添加到θ和线积分以评估每个猜测的移动距离

答案 1 :(得分:1)

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