我被要求设计一个名为Bezier的递归函数,其中参数是给定的点列表,以及必须评估的点t。它返回由点列表的控制点定义的贝塞尔曲线中的点。
这是我所做的算法:
def Bezier(point_list, t):
if len(point_list)==1:
return point_list[0]
else:
P1=Bezier(point_list[0:-1],t)
P2=Bezier(point_list[1:],t)
P=(1-t)*P1 + t*P2
return P
这是给出的分数列表:
point_list=[ (0,0), (10,-1), (13,5), (-7,8), (2,2) ]
我怎么知道我的功能是否正确?
答案 0 :(得分:2)
看起来不错;您可以在某些点上尝试它,看看行为是否符合您的预期(即对于沿x = 0,y = 0或x = y的控制点,所有结果点应该沿着同一条线放置)。
你也可以利用镜像;即对于所有t,Bezier([a, b, c], t) == Bezier([c, b, a], 1.-t)
。如果您的结果没有显示此行为,那么您的功能可能不正确。
如果我尝试运行代码,我会得到一个TypeError,试图将一个元组乘以一个浮点数;您可能需要扩展该代码,即
def Bezier(point_list, t):
if len(point_list)==1:
return point_list[0]
else:
P1=Bezier(point_list[0:-1], t)
P2=Bezier(point_list[1:], t)
nt = 1. - t
return (nt * P1[0] + t * P2[0], nt * P1[1] + t * P2[1])