De Casteljau算法忽略了一个控制点

时间:2014-02-07 17:50:33

标签: python algorithm interpolation bezier

我编写了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

1 个答案:

答案 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