private static void removeInitialIntermediatePoints() {
// remove the (possible) initial collinear points in hull except the
// farthest one from the anchor point
boolean collinear = true;
while (hull.size() > 1 && collinear) {
Position pos1 = hull.first();
Position pos2 = hull.after(pos1);
Point2D p1 = (Point2D)pos1.element();
Point2D p2 = (Point2D)pos2.element();
if (geomTester.leftRightTurn(anchorPoint,p1,p2) ==
GeomTester2D.COLLINEAR)
if (geomTester.closest(anchorPoint,p1,p2) == p1)
hull.remove(pos1);
else
hull.remove(pos2);
else
collinear = false;
}
}
private static void scan() {
// Graham's scan
Position first = hull.first();
Position last = hull.last();
Position prev = hull.first();
Position curr = hull.after(prev);
do {
Position next = hull.after(curr);
Point2D prevPoint = (Point2D)prev.element();
Point2D currPoint = (Point2D)curr.element();
Point2D nextPoint = (Point2D)next.element();
if (geomTester.leftRightTurn(prevPoint,currPoint,nextPoint) ==
GeomTester2D.LEFT_TURN)
prev = curr;
else {
hull.remove(curr);
prev = hull.before(prev);
}
curr = hull.after(prev);
}
while (curr != last);
}
}