final GraphicsContext CTX = CANVAS.getGraphicsContext2D();
final Bounds BOUNDS = SHAPE.getLayoutBounds();
final Point2D CENTER = new Point2D(BOUNDS.getWidth() / 2, BOUNDS.getHeight() / 2);
final double RADIUS = Math.sqrt(BOUNDS.getWidth() * BOUNDS.getWidth() + BOUNDS.getHeight() * BOUNDS.getHeight()) / 2;
final double ANGLE_STEP = 0.1;
final GradientLookup COLOR_LOOKUP = new GradientLookup(STOPS);
CTX.translate(CENTER.getX(), CENTER.getY());
CTX.rotate(-90 + ROTATION_OFFSET);
CTX.translate(-CENTER.getX(), -CENTER.getY());
for (int i = 0, size = STOPS.length - 1; i < size; i++) {
for (double angle = STOPS[i].getOffset() * 360; Double.compare(angle,STOPS[i + 1].getOffset() * 360) <= 0; angle += 0.1) {
CTX.beginPath();
CTX.moveTo(CENTER.getX() - RADIUS, CENTER.getY() - RADIUS);
CTX.setFill(COLOR_LOOKUP.getColorAt(angle / 360));
if (RADIUS > 0) {
CTX.fillArc(CENTER.getX() - RADIUS, CENTER.getY() - RADIUS, 2 * RADIUS, 2 * RADIUS, angle, ANGLE_STEP, ArcType.ROUND);
} else {
CTX.moveTo(CENTER.getX() - RADIUS, CENTER.getY() - RADIUS);
}