ConvexHullGenerator2D generator = new MonotoneChain(true, 1e-6);
ConvexHull2D hull = generator.generate(points); //AklToussaintHeuristic.reducePoints(points));
PNode hullNode = new PNode();
for (Vector2D vertex : hull.getVertices()) {
final PPath node = PPath.createEllipse(vertex.getX() - 1, vertex.getY() - 1, 2, 2);
node.addAttribute("tooltip", vertex);
node.setPaint(Color.red);
node.setStrokePaint(Color.red);
hullNode.addChild(node);
}
for (Segment line : hull.getLineSegments()) {
final PPath node = PPath.createLine(line.getStart().getX(), line.getStart().getY(),
line.getEnd().getX(), line.getEnd().getY());
node.setPickable(false);
node.setPaint(Color.red);
node.setStrokePaint(Color.red);
hullNode.addChild(node);
}
canvas.getLayer().addChild(hullNode);
Encloser<Euclidean2D, Vector2D> encloser =
new WelzlEncloser<Euclidean2D, Vector2D>(1e-10, new DiskGenerator());
EnclosingBall<Euclidean2D, Vector2D> ball = encloser.enclose(points);
final double radius = ball.getRadius();
PPath ballCenter =
PPath.createEllipse(ball.getCenter().getX() - 1, ball.getCenter().getY() - 1, 2, 2);
ballCenter.setStrokePaint(Color.blue);
ballCenter.setPaint(Color.blue);
canvas.getLayer().addChild(0, ballCenter);
PPath ballNode =
PPath.createEllipse(ball.getCenter().getX() - radius, ball.getCenter().getY() - radius,
radius * 2, radius * 2);
ballNode.setTransparency(1.0f);
ballNode.setStrokePaint(Color.blue);
canvas.getLayer().addChild(0, ballNode);
}