知っている:
制御点 a と d (2D 3 次ベジエ曲線の始点と終点)
勾配 a->b、c->d、および b->c (b、c は他のコントロール ポイント)
ベジエ曲線の中間点の位置。
さて、この情報が与えられた場合、制御点 b と c の位置を求める式は何でしょうか?
この質問が古いことは知っていますが、正しいまたは完全な回答が提供されていないため、解決策を考えてみました。David の計算にはいくつかの誤りが含まれており、これらの誤りが修正されたとしても、彼の解法は不完全であることに注意してください。
まず、 ベクトル を定義T0
し、3 つの勾配を使用しますT1
。T2
T0 = ( b - a ) / u0
T1 = ( c - b ) / u1
T2 = ( d - c ) / u2
コントロール ポイントの各ペア間の方向と距離の両方がわかっている場合は、倍率 と は必要ありu0
ませu1
んu2
。傾きしか分からないのでu0
、は未知u1
のu2
スカラー量です。また、勾配が定義されているためu0
、u1
とは非ゼロであると仮定します。u2
これらの方程式をいくつかの異なる方法で書き直して、他のコントロール ポイントに関して各コントロール ポイントの式を取得できます。例えば:
b = a + T0*u0
c = b + T1*u1
d = c + T2*u2
この質問は、3 次ベジエ曲線の「中間点」があることも示しています。これは、曲線のパラメーター範囲の中間点にポイントがあることを意味します。この点を次のように呼びますp
。
p = ( a + 3*b + 3*c + d ) / 8
左辺を未知数で書き換えると、次のようになります。
b + c = ( 8*p - a - d ) / 3
以前の表現を使用して、さまざまな方法でb
andを置き換えることができるようになりました。平行ベクトル、またはc
がある場合、あいまいさが生じることがわかります。考慮すべき 4 つのケースがあります。T0
T1
T2
ケース 1:T0
平行でないT1
and を代入b = a + T0*u0
して とをc = a + T0*u0 + T1*u1
解く:u0
u1
2*T0*u0 + T1*u1 = ( 8*p - 7*a - d ) / 3
T0
とT1
はベクトルであるため、これは 2 つの方程式と 2 つの未知数です。および に代入u0
してu1
戻って、欠落しているコントロール ポイント および を取得b = a + T0*u0
します。c = a + T0*u0 + T1*u1
b
c
ケース 2:T1
平行でないT2
and を代入c = d - T2*u2
して とをb = d - T2*u2 - T1*u1
解く:u1
u2
T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3
ケース 3:T0
平行ではないT2
and を代入b = a + T0*u0
して とをc = d - T2*u2
解く:u0
u2
T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3
ケース 4:T0
とT1
がT2
すべて平行
この場合a
、b
、 、c
およびd
はすべて同一線上にありT0
、 、 、T1
およびT2
はすべてスケール ファクタ内に相当します。一意の解を得るには十分な情報がありません。簡単な解決策の 1 つは、次のようにb
設定して選択することですu0 = 1
。
b = a + T0
(a + T0) + c = ( 8*p - a - d ) / 3
c = ( 8*p - 4*a - d - 3*T0 ) / 3
無数の解が存在します。本質的に、ピッキングが をb
定義するc
か、ピッキングc
が を定義しますb
。
3D への拡張
p
質問は特に平面ベジエ曲線について尋ねましたが、この問題を非平面 3D キュービック ベジエ曲線に拡張する場合、ポイントは必要ないことに注意するのは興味深いと思います。u0
この場合、 、u1
、についてこの方程式を簡単に解くことができますu2
。
T0*u0 + T1*u1 + T2*u2 = d - a
これは 3 つの方程式 (ベクトルは 3D) と 3 つの未知数 ( u0
、u1
およびu2
) です。b = a + T0*u0
andc = b + T1*u1
またはにc = d - T2*u2
代入するb
と、 and が得られc
ます。
あなたの傾きが正規化されているとしましょう、そしていくつかのu、vのためにあなたは持っています
u * slope(a->b)+a = b, v * slope(c->d)+d = c
a、d、およびq:=(a+b+c+d)/8
(曲線の中間点)の値を知っているのでc = 8(q-a-d-b)
あなたが得る最後のものに上記の方程式を差し込む
v * slope(c->d)+d = 8(q-a-d-a-u * slope(a->b))
これは、2つの変数(u、v)の2つの方程式(2次元ベクトル方程式)です。
3番目のスロープは必要ありません。