n次ベジエ曲線

# -*- coding: UTF-8 -*-
from math import *
import numpy as np

###############################
# n次ベジエ曲線
#      n : 次数
#      B : 多角形の頂点座標
#      t : 計算したい点の位置
#      return : 座標
#      coded by Y.Suganuma
################################

def Bezier(n, B, t) :

			# 初期設定
	P = np.array([0, 0,], np.float)
			# 計算
	for i in range(0, n+1) :
		J     = brend(n, i, t)
		P[0] += B[i][0] * J
		P[1] += B[i][1] * J

	return P

##############################
# ベジエ基底関数
#      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 range(1, i+1) :
		x *= t
	t = 1.0 - t
	for i1 in range(1, n-i+1) :
		y *= t

	return (ni * x * y)

################
# nの階乗の計算
################

def kaijo(n) :

	k = 1.0
	if n > 1 :
		for i1 in range(2, n+1) :
			k *= i1
	return k

----------------------------------

# -*- coding: UTF-8 -*-
import numpy as np
from math import *
from function import Bezier, brend, kaijo

############################
# n次ベジエ曲線
#      coded by Y.Suganuma
############################
			# 設定
step = 0.05
n    = 3
B    = np.array([[1, 1], [2, 3], [4, 3], [3, 1]], np.float)
t    = 0.0
			# 実行と出力
for i1 in range(0, 21) :
	P = Bezier(n, B, t)
	print(t, P[0], P[1])
	t += step