2 つの制御点を持つ 3 次ベジエがあります。開始点と制御点は既知です。コントロール、開始点、終了点を指定して、曲線のすべての点を取得する必要があります。私が達成したいのは、1から曲線の長さまでの値iを指定すると、その位置の各ポイントのXとYとアルファ(角度)を取得することです。そのための適切な参照または作業コードが見つかりません。私はジャバスクリプトを使用しています。
2 に答える
私の理解が正しければ、すべての点でベジエの位置と勾配 (曲線の接線) を決定しようとしています。
始点が (ax, ay)、終点が (dx, dy)、制御点が (bx, by) および (cx, cy) であるとします。
ポジションは簡単。まず、混合関数を計算します。これらは、曲線上の制御点の「効果」を制御します。
B0_t = (1-t)^3
B1_t = 3 * t * (1-t)^2
B2_t = 3 * t^2 * (1-t)
B3_t = t^3
t が 0 のときに B0_t が 1 になることに注意してください (その他はすべてゼロです)。また、t が 1 の場合 (その他はすべてゼロ)、B3_t は 1 です。したがって、曲線は (ax, ay) で始まり、(dx, dy) で終わります。
任意の中間点 (px_t、py_t) は、次のように指定されます (ループ内で t を 0 から 1 に少しずつ変化させます)。
px_t = (B0_t * ax) + (B1_t * bx) + (B2_t * cx) + (B3_t * dx)
py_t = (B0_t * ay) + (B1_t * by) + (B2_t * cy) + (B3_t * dy)
スロープもやりやすいです。https://stackoverflow.com/a/4091430/1384030に記載されている方法を使用する
B0_dt = -3(1-t)^2
B1_dt = 3(1-t)^2 -6t(1-t)
B2_dt = - 3t^2 + 6t(1-t)
B3_dt = 3t^2
したがって、x と y の変化率は次のようになります。
px_dt = (B0_dt * ax) + (B1_dt * bx) + (B2_dt * cx) + (B3_dt * dx)
py_dt = (B0_dt * ay) + (B1_dt * by) + (B2_dt * cy) + (B3_dt * dy)
次にMath.atan2(py_dt,px_dt)
、角度 (ラジアン) を取得するために使用します。
De Casteljau アルゴリズムは数値的に安定しています。ここでは、ポイントを計算する直前のステップとして、接線 (したがって、接線角度) を計算するという追加の利点があります。
ただし、 lengthではなく、パラメーター値に従って機能します。曲線のレンダリングの一部として、値ではなくパラメータでポイントを計算することをお勧めします。パラメータの範囲は、曲線の始点と終点に対応する になります。[0 ... 1]
0
1