Code
public static List<Point2D> flatteningStepsOnRightSide(
List<Point2D> list, double arc) {
int sz = list.size();
for (int i = 0; i < sz; i++) {
int i1 = (i + 1) % sz;
int i2 = (i + 2) % sz;
int i3 = (i + 3) % sz;
Point2D pt0 = list.get(i);
Point2D pt1 = list.get(i1);
Point2D pt2 = list.get(i2);
Point2D pt3 = list.get(i3);
double dx1 = pt2.getX() - pt1.getX();
if (Math.abs(dx1) > 1.0e-1 && Math.abs(dx1) < arc) {
double max = Math.max(pt0.getX(), pt2.getX());
replace(list, i, max, pt0.getY());
replace(list, i1, max, pt1.getY());
replace(list, i2, max, pt2.getY());
replace(list, i3, max, pt3.getY());
}
}
return list;
}
private static void replace(List<Point2D> list, int i, double x, double y) {
list.remove(i);
list.add(i, new Point2D.Double(x, y));
}
/**
* Rounding the corners of a Rectilinear Polygon.
*/
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 = signum(cur.getX() - prv.getX(), arc);
double dy0 = signum(cur.getY() - prv.getY(), arc);
double dx1 = signum(nxt.getX() - cur.getX(), arc);
double dy1 = signum(nxt.getY() - cur.getY(), arc);
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;
}
private static double signum(double v, double arc) {
return Math.abs(v) < arc ? 0d : Math.signum(v);
}
References
No comments:
Post a Comment