【问题标题】:Graphing a polar curve with uniform speed以匀速绘制极坐标曲线
【发布时间】:2013-08-14 21:12:26
【问题描述】:

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

【问题讨论】:

  • 你有一个你正在绘制的特定螺旋吗?它的方程式是什么?

标签: math animation graph polar-coordinates


【解决方案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 和线积分,以评估每个猜测移动的距离.

【讨论】:

  • 你在做length(p`(t))的时候用的是什么?长度公式从何而来?
  • 这只是 2-vector 的标准长度。 [x, y] 的长度为 sqrt(x^2 + y^2)。
  • 那不是只会让与原点的距离以恒定的速度增加吗?我希望螺旋的弧长不断增加,而不是绘制的矢量的长度。此外,在执行 x^2 + y^2 时,您是否不必对 x 和 y 都执行类似 a^2 + 2ab + b^2 之类的操作,而不仅仅是对每个项进行平方?
  • 看一下我刚刚添加的图片。我的数学实际上有些偏差,但很接近。
  • 很抱歉,我无法理解 s(t) 如何表示螺旋的长度,而不仅仅是向量的长度。另外,我假设您的数学问题可能出在您执行 sqrt(x^2 + y^2); 时。您只是将 x 和 y 中的每个项平方。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2021-10-21
    相关资源
    最近更新 更多