code: def thinPlateSpline(actor, sourcePts, targetPts, userFunctions=(None, None)):
      
      ns = len(sourcePts)
      ptsou = vtk.vtkPoints()
      ptsou.SetNumberOfPoints(ns)
      for i in range(ns):
          ptsou.SetPoint(i, sourcePts[i])
  
      nt = len(sourcePts)
      if ns != nt:
          vc.printc("~times thinPlateSpline Error: #source != #target points", ns, nt, c=1)
          exit()
  
      pttar = vtk.vtkPoints()
      pttar.SetNumberOfPoints(nt)
      for i in range(ns):
          pttar.SetPoint(i, targetPts[i])
  
      transform = vtk.vtkThinPlateSplineTransform()
      transform.SetBasisToR()
      if userFunctions[0]:
          transform.SetBasisFunction(userFunctions[0])
          transform.SetBasisDerivative(userFunctions[1])
      transform.SetSigma(1)
      transform.SetSourceLandmarks(ptsou)
      transform.SetTargetLandmarks(pttar)
  
      tfa = transformFilter(actor.polydata(), transform)
      tfa.info["transform"] = transform
      return tfa
docs: `Thin Plate Spline` transformations describe a nonlinear warp transform defined by a set
      of source and target landmarks. Any point on the mesh close to a source landmark will
      be moved to a place close to the corresponding target landmark.
      The points in between are interpolated smoothly using Bookstein's Thin Plate Spline algorithm.
  
      Transformation object is saved in ``actor.info['transform']``.
  
      :param userFunctions: You must supply both the function
          and its derivative with respect to r.
  
      .. hint:: |thinplate| |thinplate.py|_
  
          |thinplate_grid| |thinplate_grid.py|_
  
          |thinplate_morphing| |thinplate_morphing.py|_
  
          |interpolateField| |interpolateField.py|_