private boolean isCCW(GeoPoint a, GeoPoint b, GeoPoint c) {
   Point i = a.toPoint(1.0);
   Point j = b.toPoint(1.0);
   Point k = c.toPoint(1.0);
   Vector cross = Vector.cross(i, j, k).normalize();
   Point l = i.translate(cross);
   double d = Vector.computeDistance(l.x, l.y, l.z);
   return d < 1.0;
 }
  private static Point[] genVertices() {
    Point[] vertices = {
      new Point(0, -0.4, 0),
      new Point(-0.52, -0.4, 0.165),
      new Point(-0.4, -0.4, 0.4),
      new Point(-0.2, -0.4, 0.3),
      new Point(0, -0.4, 0.22),
      new Point(-0.94, -0.225, 0.3), // 6
      new Point(-0.86, -0.225, 0.91),
      new Point(-0.2, -0.225, 0.8),
      new Point(0, -0.225, 0.4),
      new Point(-0.94, 0, 0.3), // 10
      new Point(-0.86, 0, 0.91),
      new Point(-0.2, 0, 0.8),
      new Point(0, 0, 0.4),
      new Point(0, -0.4, -0.22), // 14
      new Point(-0.2, -0.3, -0.6),
      new Point(-0.4, -0.4, -0.2),
      new Point(0, -0.2, -0.8), // 17
      new Point(-0.6, -0.2, -0.6),
      new Point(-0.99, -0.225, -0.06),
      new Point(0, 0, -1), // 20
      new Point(-0.6, 0, -0.6),
      new Point(-0.99, 0, -0.06)
    };

    int length = vertices.length;
    List<Point> allpoints = new ArrayList<Point>(length);
    for (int scaleX = 1; scaleX > -2; scaleX -= 2) {
      for (int scaleY = 1; scaleY > -2; scaleY -= 2) {
        boolean includeZeroY = scaleX == scaleY && scaleX == 1;
        for (Point vertex : vertices) {
          Point p = vertex.scale(new Vector(scaleX, scaleY, 1.0));
          if (includeZeroY || p.y != 0) {
            allpoints.add(p);
          }
        }
      }
    }
    return allpoints.toArray(new Point[allpoints.size()]);
  }