我想绘制一个正在绘制的极曲线(螺旋)的动画。我正在使用 javascript 和 canvas。目前,我正在使用 setInterval 调用绘图函数,该函数绘制从极坐标曲线的参数表示中找到的 x 和 y 坐标(x 和 y 以 theta 表示)。每次调用 draw() 时,我都会将 theta 增加 0.01,从 0 到 2*pi。问题是我希望动画为每次调用绘制相同数量的曲线,以便绘制看起来以均匀的速度进行。每次调用绘制之间的时间不同并不重要;我只需要整个 awing 的速度(以绘制的像素/绘制调用的数量表示)保持不变。换句话说,我需要每次调用绘制时绘制的极坐标图段的弧长相同。我不知道该怎么做。任何帮助/建议将不胜感激。谢谢
最佳答案
设 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)
如果您希望当 z 以恒定速率 1 增加时,速度 s(f(z)) 恒定在 C,则需要求解以下一阶非线性常微分方程:
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 进行二分搜索以添加到 theta 上,并对 p(t) 进行线积分以评估每个猜测移动多远.
关于math - 绘制匀速极坐标曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242401/