グラフ化された極曲線 (らせん) のアニメーションを描きたいと思います。私はJavaScriptとキャンバスを使用しています。現在、setInterval を使用して描画関数を呼び出しています。この関数は、極曲線のパラメトリック表現 (シータに関する x と y) から見つかった x 座標と y 座標をグラフ化します。draw() を呼び出すたびに、シータを 0 から 2*pi まで 0.01 ずつインクリメントしています。問題は、描画が均一な速度で進行しているように見えるように、描画の呼び出しごとにアニメーションで同じ量の曲線を描画することです。draw の各呼び出し間の時間が異なっていても問題ありません。速度 (描画されるピクセル数 / 描画する呼び出しの数) が awing 全体で一定である必要があるだけです。つまり、draw の呼び出しごとに描画される極座標グラフのセグメントの弧の長さが同じである必要があります。どうすればいいのかわかりません。どんな助け/提案も大歓迎です。ありがとう
2 に答える
f(z) を、質問で参照しているシータ変数とします。これは、あなたが持っているものと非常によく似ているはずの2つのパラメトリック方程式です:
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)) は、f(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)) = 長さ(p'(f(z))) = 長さ([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)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 で一定にする場合は、次の 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 を計算できます。しかし、この微分方程式には閉形式の解がありません。
つまり、各ステップでシータをどれだけ増やすべきかを推測し、デルタで二分探索を行ってシータに追加し、p(t) の線積分を行って、各推測がどれだけ移動するかを評価する必要があります。
より簡単な方法 - パラメータを、ステップの弧の長さに比例する setInterval に変更します。そうすれば、弧の長さの方程式を逆にする必要はありません。間隔が大きくなり始めた場合は、ステップ サイズを調整できますが、おおよその調整は可能です。