我编写了De Casteljau算法的实现来创建Bezier曲线。我的问题是函数忽略了第二个控制点,它确实计算了某种曲线,但它不正确。
def DeCasteljau(CNTRL_P, t):
ReP = points.point()
Ret = points.point()
n = len(CNTRL_P)
k = 0
tmp = 0
while k < n:
tmp = (((1 - t)**((n-1) - k)) * (t**k))
ReP.addP(CNTRL_P[k])
#ReP.Prnt()
ReP.mulP(tmp)
Ret.addP(ReP)
ReP.Clr() #ReP => (0,0)
tmp = 0
k = k + 1
return Ret
例如:CNTRL_P = [P0,P1,P2] 它忽略了P1
class point():
def __init__(self, X = 0, Y = 0):
self.x = X
self.y = Y
def addP(self, P1):
self.x = self.x + (P1.getX())
self.y = self.y + (P1.getY())
def subP(self, C = 0, D = 0):
self.x = self.x - C
self.y = self.y - D
def mulP(self, C):
self.x = self.x * C
self.y = self.y * C
def getX(self):
a = self.x
return a
def getY(self):
a = self.y
return a
def Prnt(self):
print "X:", self.x,"Y:", self.y
def Clr(self):
self.x = 0
self.y = 0
答案 0 :(得分:1)
实施看起来很糟糕。递归在哪里?
这会给你带来更好的效果吗?
def DeCasteljau2(CNTRL_P, t):
tmp_points = CNTRL_P[:]
while len(tmp_points) > 1:
for k in range(len(tmp_points)-1):
ReP = point()
ReP2 = point()
ReP.addP(tmp_points[k])
ReP2.addP(tmp_points[k+1])
ReP.mulP((1-t))
ReP2.mulP(t)
ReP.addP(ReP2)
tmp_points[k] = ReP
tmp_points.pop()
return tmp_points[0]
这是每次迭代后的结果:
P0 | P1 | P2
P0 *(1-t)+ P1 * t | P1 *(1-t)+ P2
(P0 *(1-t)+ P1 * t)*(1-t)+(P1 *(1-t)+ P2)* t
你重复算法,直到你只剩下1点。下一个解决方案中的每个点P(n)
都是上一个解决方案中P(n) * (1-t) + p(n+1) * t
的结果。在每次迭代时,最后一个点都被丢弃,因为没有下一个点可以相乘并加上。
维基百科可能比我更好地解释:link