我被要求设计一个名为 Bezier 的递归函数,其参数是给定点的列表,以及必须评估的点。它返回由点列表的控制点定义的贝塞尔曲线中的点。
这是我所做的算法:
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) ]
我如何知道我的功能是否正确?
看起来正确;您可以在某些点集上尝试,看看行为是否符合您的预期(即,对于沿 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])
由于各种原因而遭遇失败。