三次のベジェ曲線

 空間内に指定された二点間をなめらかな曲線で描く方法に、三次のベジェ曲線があります。
 この方法で、座標データから空間曲線を描くことができます。

 P1とP2の二点間を三次のベジェ曲線で描くには、P1とP2の方向線が必要になります。
 そこで、この二つの方向線の点C1とC2の座標を、空間内に指定した点P0、P1、P2、P3の座標データから計算により求めます。
 P1の方向線は、曲線上の点P1における接線上のベクトルになるように、
P1−P0のベクトルとP2−P1のベクトルとがなす角の二等分線を、C1−P1のベクトルとします。
 P2の方向線は、曲線上の点P2における接線上のベクトルになるように、
P2−P3のベクトルとP1−P2のベクトルとがなす角の二等分線を、C2−P2のベクトルとします。
 P1の方向線の点C1の座標は、C1=P1+(P1-P0)+(b(P2-P1)/a-(P1-P0))/2 になります。
 P2の方向線の点C2の座標は、C2=P2+(P2-P3)+(c(P1-P2)/a-(P2-P3))/2 になります。
 a=‖P2-P1‖=‖P1-P2‖、b=‖P1-P0‖、c=‖P2-P3‖です。

 二つの方向線に別々の倍率を指定してかければ、点C1と点C2がそれぞれの接線上を伸び縮みし、より細かく曲線の曲がりを制御できますが、ここでは、ともに共通の倍率kを指定するものとします。
 そのときの方向線の点C1と点C2の座標は、方向線のベクトルを倍率kでスカラー倍して、
 C1=P1+k{(P1-P0)+(b(P2-P1)/a-(P1-P0))/2}
 C2=P2+k{(P2-P3)+(c(P1-P2)/a-(P2-P3))/2} になります。

 三次のベジェ曲線は、
 P(t)= pow(1-t,3)P1+3tpow(1-t,2)C1+3pow(t,2)(1-t)C2+pow(t,3)P2 (0≦t≦1) になります。

 P1とP2の二点間を三次のベジェ曲線で描くには、P0とP3の座標データが必要になります。
 このことは、配列で指定した座標データの隣り合う二点間を順次、三次のベジェ曲線でつないで空間曲線を描く場合に、始点と終点に制御データが必要になることを示しています。
 空間曲線を描くための制御データは、空間曲線の始点よりも前に曲線があると仮定して、その曲線上の点を使用します。
 また、空間曲線の終点よりも先に曲線があると仮定して、その曲線上の点を使用します。