math - 绘制匀速极坐标曲线

标签 math animation graph polar-coordinates

我想绘制一个正在绘制的极曲线(螺旋)的动画。我正在使用 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/

相关文章:

algorithm - 将数字减少到 1 的最小步骤数

c++ - 如何计算指数/幂值(多少次幂),即 C++ 中的 'n'?

javascript - 基于滚动的动画: how to create them

javascript - 普通JS : delay click event to add animation

algorithm - Kruskal 算法的变体

javascript - 在网络中绘制斐波那契数错误

iphone - 对象旋转不正确 - iPhone 应用程序

android - 如何在recyclerview上设置动画

java - 将CSV数据转换为图形数据

excel - 在Excel中使用宏设置图表格式