code: def Cylinder(pos=(0, 0, 0), r=1, height=1, axis=(0, 0, 1), c="teal", alpha=1, res=24):
      
  
      if utils.isSequence(pos[0]):  # assume user is passing pos=[base, top]
          base = np.array(pos[0])
          top = np.array(pos[1])
          pos = (base + top) / 2
          height = np.linalg.norm(top - base)
          axis = top - base
          axis = utils.versor(axis)
      else:
          axis = utils.versor(axis)
          base = pos - axis * height / 2
          top = pos + axis * height / 2
  
      cyl = vtk.vtkCylinderSource()
      cyl.SetResolution(res)
      cyl.SetRadius(r)
      cyl.SetHeight(height)
      cyl.Update()
  
      theta = np.arccos(axis[2])
      phi = np.arctan2(axis[1], axis[0])
      t = vtk.vtkTransform()
      t.PostMultiply()
      t.RotateX(90)  # put it along Z
      t.RotateY(theta * 57.3)
      t.RotateZ(phi * 57.3)
      tf = vtk.vtkTransformPolyDataFilter()
      tf.SetInputData(cyl.GetOutput())
      tf.SetTransform(t)
      tf.Update()
      pd = tf.GetOutput()
  
      actor = Actor(pd, c, alpha)
      actor.GetProperty().SetInterpolationToPhong()
      actor.SetPosition(pos)
      actor.base = base + pos
      actor.top = top + pos
      settings.collectable_actors.append(actor)
      return actor
docs: Build a cylinder of specified height and radius `r`, centered at `pos`.
  
      If `pos` is a list of 2 Points, e.g. `pos=[v1,v2]`, build a cylinder with base
      centered at `v1` and top at `v2`.
      
      |Cylinder|