nurbscircle.py

#
# Dessiner un cercle avec des NURBS
# Vincent Legat - 2022
# Ecole Polytechnique de Louvain
#

from numpy import *
import matplotlib 
import matplotlib.pyplot as plt 


# =========================================================================


def b(t,T,i,p):
  if p == 0:
    return (T[i] <= t)*(t < T[i+1])
  else:
    u  = 0.0 if T[i+p ]  == T[i]   else (t-T[i])/(T[i+p]- T[i]) * b(t,T,i,p-1)
    u += 0.0 if T[i+p+1] == T[i+1] else (T[i+p+1]-t)/(T[i+p+1]-T[i+1]) * b(t,T,i+1,p-1)
    return u
  
  
# ============================= mainProgram ===============================


T = [0,0,0,1,1,2,2,3,3,4]   
a = sqrt(3)
X = [1,0,1/2,1,3/2,2,1]
Y = [0,0,a/2,a,a/2,0,0]
W = [1,0.5,1,0.5,1,0.5,1]

p = 2
n = len(T)-1
W = array(W)
t = arange(T[p],T[n-p],0.001)
B = zeros((n-p,len(t)))
for i in range(0,n-p):
  B[i,:] = b(t,T,i,p)
w = W @ B
x = W * X @ B / w
y = W * Y @ B / w

matplotlib.rcParams['toolbar'] = 'None'
matplotlib.rcParams['lines.linewidth'] = 1
plt.figure('Un joli cercle')
plt.axis('off')
plt.axis('equal')
plt.plot(X,Y,'--g')
plt.plot(X,Y,'or',markersize=5)
plt.plot(x,y,'-b')
plt.show()