5

知っている:

  • 制御点 a と d (2D 3 次ベジエ曲線の始点と終点)

  • 勾配 a->b、c->d、および b->c (b、c は他のコントロール ポイント)

  • ベジエ曲線の中間点の位置。

さて、この情報が与えられた場合、制御点 b と c の位置を求める式は何でしょうか?

4

2 に答える 2

2

この質問が古いことは知っていますが、正しいまたは完全な回答が提供されていないため、解決策を考えてみました。David の計算にはいくつかの誤りが含まれており、これらの誤りが修正されたとしても、彼の解法は不完全であることに注意してください。

まず、 ベクトル を定義T0し、3 つの勾配を使用しますT1T2

T0 = ( b - a ) / u0
T1 = ( c - b ) / u1
T2 = ( d - c ) / u2

コントロール ポイントの各ペア間の方向距離の両方がわかっている場合は、倍率 と は必要ありu0ませu1u2。傾きしか分からないのでu0、は未知u1u2スカラー量です。また、勾配が定義されているためu0u1とは非ゼロであると仮定します。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

T0T1はベクトルであるため、これは 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:T0T1T2すべて平行

この場合ab、 、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 つの未知数 ( u0u1およびu2) です。b = a + T0*u0andc = b + T1*u1またはにc = d - T2*u2代入するbと、 and が得られcます。

于 2009-07-07T18:02:45.263 に答える
1

あなたの傾きが正規化されているとしましょう、そしていくつかの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番目のスロープは必要ありません。

于 2009-01-01T13:39:58.537 に答える