docs: def find_visible(hull, observer, background):
      '''Given an observer location, find the first and last visible
         points in the hull
         
         The observer at "observer" is looking at the hull whose most distant
         vertex from the observer is "background. Find the vertices that are
         the furthest distance from the line between observer and background.
         These will be the start and ends in the vertex chain of vertices
         visible by the observer.
         '''
      pt_background = hull[background,:]
      vector = pt_background - observer
      i = background
      dmax = 0
      while True:
          i_next = (i+1) % hull.shape[0]
          pt_next = hull[i_next,:]
          d = -np.cross(vector, pt_next-pt_background)
          if d < dmax or i_next == background:
              i_min = i
              break
          dmax = d
          i = i_next
      dmax = 0
      i = background
      while True:
          i_next = (i+hull.shape[0]-1) % hull.shape[0]
          pt_next = hull[i_next,:]
          d = np.cross(vector, pt_next-pt_background)
          if d < dmax or i_next == background:
              i_max = i
              break
          dmax = d
          i = i_next
      return (i_min, i_max)