1
$\begingroup$

I am using the de boors algorithm to generate B splines in python. However I am getting spikes in the final figure. I do not understand why this happens. I am posting my code here for reference

def knot_values(n,k):
      t = np.zeros((1,n+k+1))
      for i in range(0,n+k+1):
            if i<k:
               t[0][i] = 0
            if i>=k and i<=n:
               t[0][i] = i-k+1
            if i>n:
               t[0][i] = n-k+2

      return t

def basis_spline(u,t,i,k):
    if k==1:
        if u>=t[0][i] and u<=t[0][i+1]:
             sol = 1
        else:
             sol = 0
    else:
        a = (u - t[0][i])*basis_spline(u,t,i,k-1)
        b = t[0][i+k-1] - t[0][i]
        c = (t[0][i+k] - u)*basis_spline(u,t,i+1,k-1)
        d = t[0][i+k] - t[0][i+1]       
        if b == 0:
            temp1 = 0
        else:
            temp1 = a/b

        if d == 0:
            temp2 = 0
        else:
            temp2 = c/d    


        sol = (temp1) + (temp2)

    return sol

def curve_generator(n,k,ctrl_x,ctrl_y):

    t = knot_values(n,k)
    print(t)
    u = np.arange(t[0][k-1],t[0][n+1],0.001);
    length = u.shape;

    x = np.zeros((1,length[0]));
    y = np.zeros((1,length[0]));

    for i in range(0,n+1):
        for j in range(0,length[0]): 
            x[0][j] = x[0][j] + basis_spline(u[j],t,i,k)*ctrl_x[i];
            y[0][j] = y[0][j] + basis_spline(u[j],t,i,k)*ctrl_y[i];

    return x,y 

    n = 6
    k = 3
    ctrl_x = np.array([0,3,6,9,10,12,15])
    ctrl_y = np.array([0,4,2,3,7,8,5])

    [x,y] = curve_generator(n,k,ctrl_x,ctrl_y)

    n = x.shape
    a = [0]*n[1]
    b = [0]*n[1]
    for i in range(0,n[1]):
        a[i] = x[0][i]
        b[i] = y[0][i]

    plt.plot(a,b)
    plt.show()

enter image description here

$\endgroup$
  • 3
    $\begingroup$ Don't post the same question again to add new details. Instead, use the edit button when necessary. $\endgroup$ – Dan Hulme May 13 '18 at 10:02
2
$\begingroup$

In line 15 use the half-open interval, i.e.,

if u>=t[0][i] and u<t[0][i+1]:

Otherwise, at knot values, you evaluate two basis functions at the k=1 basis when you only want one. This causes the wrong evaluation of the basis function at the knot values and therefore the spikes.

| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.