知っている:
制御点 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
以前の表現を使用して、さまざまな方法でbandを置き換えることができるようになりました。平行ベクトル、またはcがある場合、あいまいさが生じることがわかります。考慮すべき 4 つのケースがあります。T0T1T2
ケース 1:T0平行でないT1
and を代入b = a + T0*u0して とをc = a + T0*u0 + T1*u1解く:u0u1
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*u1bc
ケース 2:T1平行でないT2
and を代入c = d - T2*u2して とをb = d - T2*u2 - T1*u1解く:u1u2
T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3
ケース 3:T0平行ではないT2
and を代入b = a + T0*u0して とをc = d - T2*u2解く:u0u2
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*u0andc = 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番目のスロープは必要ありません。