code: def GetClosestPoint(self, p):
      
      assert(len(self._points) > 0)
      closest_point = self._points[0]
      closest_i = 0
  
      for i in range(0, len(self._points) - 1):
        (a, b) = (self._points[i], self._points[i+1])
        cur_closest_point = GetClosestPoint(p, a, b)
        if p.Angle(cur_closest_point) < p.Angle(closest_point):
          closest_point = cur_closest_point.Normalize()
          closest_i = i
  
      return (closest_point, closest_i)
docs: Returns (closest_p, closest_i), where closest_p is the closest point
      to p on the piecewise linear curve represented by the polyline,
      and closest_i is the index of the point on the polyline just before
      the polyline segment that contains closest_p.