n次ベジエ曲線

#***************************/
# n次ベジエ曲線           */
#      coded by Y.Suganuma */
#***************************/

#******************************/
# n次ベジエ曲線              */
#      n : 次数               */
#      B : 多角形の頂点座標   */
#      t : 計算したい点の位置 */
#      return : 座標          */
#      coded by Y.Suganuma    */
#******************************/
def Bezier(n, b, t)
					# 初期設定
	p = [0.0, 0.0]
					# 計算
	for i in 0 ... n+1
		j     = brend(n, i, t)
		p[0] += b[i][0] * j
		p[1] += b[i][1] * j
	end

	return p
end

#******************************/
# ベジエ基底関数              */
#      n,i : 次数             */
#      t : 計算したい点の位置 */
#      return : 結果          */
#******************************/
def brend(n, i, t)
	x = 1.0
	y = 1.0
	ni = kaijo(i) * kaijo(n-i)
	ni = kaijo(n) / ni

	for i1 in 1 ... i+1
		x *= t
	end
	t = 1.0 - t
	for i1 in 1 ... n-i+1
		y *= t
	end

	return ni * x * y
end

#****************/
# nの階乗の計算 */
#****************/
def kaijo(n)
	k = 1.0

	if n > 1
		for i1 in 2 ... n+1
			k *= i1
		end
	end

	return k
end

					# 設定
step = 0.05
n    = 3
b    = [[1.0, 1.0], [2.0, 3.0], [4.0, 3.0], [3.0, 1.0]]
					# 実行と出力
t    = 0.0
for i1 in 0 ... 21
	p = Bezier(n, b, t)
	printf("%f %f %f\n", t, p[0], p[1])
	t += step
end