Code
public static Path2D convertRoundedPath(List<Point2D> list, double arc) {
double kappa = 4d * (Math.sqrt(2d) - 1d) / 3d; // = 0.55228...;
double akv = arc - arc * kappa;
int sz = list.size();
Point2D pt0 = list.get(0);
Path2D path = new Path2D.Double();
path.moveTo(pt0.getX() + arc, pt0.getY());
for (int i = 0; i < sz; i++) {
Point2D prv = list.get((i - 1 + sz) % sz);
Point2D cur = list.get(i);
Point2D nxt = list.get((i + 1) % sz);
double dx0 = Math.signum(cur.getX() - prv.getX());
double dy0 = Math.signum(cur.getY() - prv.getY());
double dx1 = Math.signum(nxt.getX() - cur.getX());
double dy1 = Math.signum(nxt.getY() - cur.getY());
path.curveTo(
cur.getX() - dx0 * akv, cur.getY() - dy0 * akv,
cur.getX() + dx1 * akv, cur.getY() + dy1 * akv,
cur.getX() + dx1 * arc, cur.getY() + dy1 * arc);
path.lineTo(nxt.getX() - dx1 * arc, nxt.getY() - dy1 * arc);
}
path.closePath();
return path;
}
References