docs: public List<Point2D> apply(PointFeature feature) {
  
          List<Point2D> points = feature.getPoints();
  
          if (points.size() < 4) {
              return points;
          }
  
          Point2D pointOnHull = points.get(getIndexOfLeftMostPoint(points)); // leftmost point in shape
  
          List<Point2D> hull = new ArrayList<Point2D>();
  
          int i = 0;
  
          Point2D endpoint = points.get(0); // initial endpoint for a candidate edge on the hull
  
          do {
  
              hull.add(pointOnHull);
  
              endpoint = points.get(0);
  
              for (int j = 1; j < points.size(); j++) {
                  if (endpoint == pointOnHull || isLeftOfLine(points.get(j), hull.get(i), endpoint)) {
                      endpoint = points.get(j); // found greater left turn, update endpoint
                  }
              }
              i++;
              pointOnHull = endpoint;
  
          } while (endpoint != hull.get(0));
  
  		/* i is now equal to the number of points of the hull.
  		 * need to make correctly sized hull array now.
  		 */
          List<Point2D> hullToReturn = new ArrayList<Point2D>();
  
          for (int k = 0; k < i; k++) {
              hullToReturn.add(hull.get(k));
          }
  
          return hullToReturn;
      }