code: def Arrow(startPoint, endPoint, s=None, c="r", alpha=1, res=12):
      
      axis = np.array(endPoint) - np.array(startPoint)
      length = np.linalg.norm(axis)
      if length:
          axis = axis / length
      theta = np.arccos(axis[2])
      phi = np.arctan2(axis[1], axis[0])
      arr = vtk.vtkArrowSource()
      arr.SetShaftResolution(res)
      arr.SetTipResolution(res)
      if s:
          sz = 0.02
          arr.SetTipRadius(sz)
          arr.SetShaftRadius(sz / 1.75)
          arr.SetTipLength(sz * 15)
      arr.Update()
      t = vtk.vtkTransform()
      t.RotateZ(phi * 57.3)
      t.RotateY(theta * 57.3)
      t.RotateY(-90)  # put it along Z
      if s:
          sz = 800.0 * s
          t.Scale(length, sz, sz)
      else:
          t.Scale(length, length, length)
      tf = vtk.vtkTransformPolyDataFilter()
      tf.SetInputData(arr.GetOutput())
      tf.SetTransform(t)
      tf.Update()
  
      actor = Actor(tf.GetOutput(), c, alpha)
      actor.GetProperty().SetInterpolationToPhong()
      actor.SetPosition(startPoint)
      actor.DragableOff()
      actor.PickableOff()
      actor.base = np.array(startPoint)
      actor.top = np.array(endPoint)
      settings.collectable_actors.append(actor)
      return actor
docs: Build a 3D arrow from `startPoint` to `endPoint` of section size `s`,
      expressed as the fraction of the window size.
      
      .. note:: If ``s=None`` the arrow is scaled proportionally to its length,
                otherwise it represents the fraction of the window size.
                
      |OrientedArrow|