code: def __generate_spline(self, x, y, closed=False, steps=20):
          
  
          if closed:
              x = x.tolist()
              x.insert(0, x[-1])
              x.append(x[1])
              x.append(x[2])
  
              y = y.tolist()
              y.insert(0, y[-1])
              y.append(y[1])
              y.append(y[2])
  
          points = np.vstack((x,y)).T
  
          curve = []
  
          if not closed:
              curve.append(points[0])
  
          for j in range(1, len(points)-2):
              for s in range(steps):
                  t = 1. * s / steps
                  p0, p1, p2, p3 = points[j-1], points[j], points[j+1], points[j+2]
                  pnew = 0.5 *((2 * p1) + (-p0 + p2) * t + (2*p0 - 5*p1 + 4*p2 - p3) * t**2 + (-p0 + 3*p1- 3*p2 + p3) * t**3)
                  curve.append(pnew)
  
          if not closed:
              curve.append(points[-1])
  
          curve = np.array(curve)
          return curve[:, 0], curve[:, 1]
docs: catmullrom spline
          http://www.mvps.org/directx/articles/catmull/