我想绘制一幅绘制极坐标曲线(螺旋线)的动画。我使用的是javascript和canvas。目前,我使用setInterval来调用绘制函数,该函数绘制了从极坐标曲线的参数表示(以θ表示的x和y)找到的x和y坐标。我将θ增加0.01,从0增加到2 * pi,每次调用draw()一次。问题是我希望动画为每个绘制调用绘制相同数量的曲线,以便绘图看起来以均匀的速度前进。如果每次抽签之间的时间不同,则无关紧要;我只需要速度(根据绘制的像素数/绘制的调用数)对整个awing保持不变。换句话说,我需要绘制每个调用绘制的极坐标图段的弧长是相同的。我不知道该怎么做。任何帮助/ sugestions将不胜感激。感谢
答案 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。这样您就不必尝试反转弧长方程。如果间隔开始变得太大,您可以调整步长,但是您可以大致这样做。