ベジェ曲線を描く命令

色々な命令を作ってきましたが、もっと複雑な曲線はどのように表現すればいいのでしょう?例えば、3点 A, B, C を通るような滑らかな曲線を引きたい時は・・・?

実はベジェ曲線[*1]という名前の曲線があって、この曲線は複数の制御点に沿うような曲線を簡単に描くことができます。但し、あくまで制御点に沿うだけなので、一般に端点以外の制御点を通るとは限りません。

詳しいアルゴリズムは省略しますが、(n+1)個の制御点B_iで構成されるベジェ曲線は次の式で与えられます[*2]:

P(t)=ΣBi*nCi*t^i*(1-t)^(n-i)

意味は分からなくても問題ありませんよf(^^;

分割数とは整数=50

# /* # 用例
点列とは配列=「100,100
150,400
400,100
300,300」をCSV取得
点列へベジェ曲線
# */
●ベジェ曲線({グループ=?母艦}OBJの{配列}Sへ|OBJにSで)
 点列とは配列
 Iとは整数。Nとは整数=Sの要素数-1
 Tとは数値。ΔTとは数値=1/分割数
 Aとは数値。Bとは整数
 点列[0]=S[0]
 Iを0からNまで繰り返す
  B=CHOOSE(N,I)
  T=0
  (分割数)回
   TにΔTを直接足す
   A=B*(T^I)*((1-T)^(N-I))
   点列[回数][0]にS[I][0]*Aを直接足す
   点列[回数][1]にS[I][1]*Aを直接足す
 OBJの点列へ折れ線

●CHOOSE({整数}Nから{整数}Mを)
 結果とは整数=1
 (M)回、結果に(N-回数+1)/回数を直接掛ける
 結果を戻す

●折れ線({グループ=?母艦}OBJの{配列}Sへ|OBJにSで)
 (Sの要素数-1)回
  OBJのS[回数-1][0],S[回数-1][1]からS[回数][0],S[回数][1]へ線

但し、このプログラムは最適化[*3]をしていません。ここではプログラムを分かりやすくするために単純にしておきました。

注釈

*1
Wikipedia/ベジェ曲線に詳しく載っています。複数の点を与えて曲線を描くアルゴリズムは他にもいくつかあって、制御点に重みをつけるもの、与えた点全てを通るようなものなど、色々あります。特にベジェ曲線は、その表式が非常に単純なので、曲線の実装(学習用)でよく扱われます。(実用で使われるのは他の曲線だが)
*2
一応簡単にベジェ曲線の考え方を説明すると、制御点同士を t : (1-t) に内分した点を利用することで制御点に沿うようしています。式の形を見ると確かに内分っぽいですよね。内分っぽいんです。
*3
例えば、組み合わせ数 CHOOSET のべき乗の計算には、まだ工夫をして計算量を減らせる余地があります。