public Point2D getStartPoint() { return beziers.get(0).getP1(); }
private void addCurve(CubicCurve2D.Double peace) { final Rectangle2D bounds = peace.getBounds2D(); final double flat = peace.getFlatness(); if (flat < 10) { lines.add(new Line2D.Double(peace.getP1(), peace.getP2())); lenght += Math.sqrt(bounds.getWidth() * bounds.getWidth() + bounds.getHeight() * bounds.getHeight()); return; } final CubicCurve2D.Double left = new CubicCurve2D.Double(); final CubicCurve2D.Double right = new CubicCurve2D.Double(); peace.subdivide(left, right); addCurve(left); addCurve(right); }
public MyCurve(CubicCurve2D.Double curve) { this.curve = curve; addCurve(curve); if (lenght <= 0) { throw new IllegalStateException(); } for (Line2D.Double line : lines) { linesForInters.add(change(line, curve.getP1(), curve.getP2())); } }
public LineSegmentDouble(CubicCurve2D.Double curve) { this(curve.getP1(), curve.getP2()); }
public MyCurve(CubicCurve2D.Double curve) { this.curve = curve; addCurve(curve); if (lenght <= 0) { throw new IllegalStateException(); } for (Line2D.Double line : lines) { linesForInters.add(change(line, curve.getP1(), curve.getP2())); } }
private void drawCubic(double x, double y, CubicCurve2D.Double bez) { drawPointInternal(x, y, bez.getP1()); drawPointInternal(x, y, bez.getP2()); if (bez.getP1().distance(bez.getP2()) > quanta) { final CubicCurve2D.Double part1 = new CubicCurve2D.Double(); final CubicCurve2D.Double part2 = new CubicCurve2D.Double(); bez.subdivide(part1, part2); drawCubic(x, y, part1); drawCubic(x, y, part2); } }
public DotPath getMirrored(DotPath path) { DotPath result = new DotPath(); for (CubicCurve2D.Double bez : path.getBeziers()) { result = result.addCurve(getMirrored(bez.getP1()), getMirrored(bez.getCtrlP1()), getMirrored(bez.getCtrlP2()), getMirrored(bez.getP2())); } return result; }
static public double getEndingAngle(final CubicCurve2D.Double left) { if (left.getCtrlP2().equals(left.getP2())) { return getAngle(left.getP1(), left.getP2()); } return getAngle(left.getCtrlP2(), left.getP2()); }
static private boolean contains(CubicCurve2D.Double cubic, Rectangle2D... rects) { for (Rectangle2D r : rects) { if (r.contains(cubic.getP1()) && r.contains(cubic.getP2())) { return true; } } return false; }
int idx = 0; while (idx + 1 < this.beziers.size() && clusterPosition.contains(this.beziers.get(idx).getP2())) { if (clusterPosition.contains(this.beziers.get(idx).getP1()) == false) { throw new IllegalStateException(); assert clusterPosition.contains(this.beziers.get(idx).getP1()); assert clusterPosition.contains(this.beziers.get(idx).getP2()) == false; CubicCurve2D current = this.beziers.get(idx); final CubicCurve2D.Double part2 = new CubicCurve2D.Double(); current.subdivide(part1, part2); assert part1.getP2().equals(part2.getP1()); if (clusterPosition.contains(part1.getP2())) { current = part2; result.beziers.add(current); } else { if (clusterPosition.contains(current.getP1())) { assert clusterPosition.contains(current.getP1()) == false; assert clusterPosition.contains(current.getP2()); for (int k = 0; k < 8; k++) { final CubicCurve2D.Double part2 = new CubicCurve2D.Double(); current.subdivide(part1, part2); assert part1.getP2().equals(part2.getP1()); if (clusterPosition.contains(part1.getP2())) { current = part1;
public PointAndAngle getMiddle() { Point2D result = null; double angle = 0; for (CubicCurve2D.Double bez : beziers) { final CubicCurve2D.Double left = new CubicCurve2D.Double(); final CubicCurve2D.Double right = new CubicCurve2D.Double(); bez.subdivide(left, right); final Point2D p1 = left.getP1(); final Point2D p2 = left.getP2(); final Point2D p3 = right.getP1(); final Point2D p4 = right.getP2(); if (result == null || getCost(p1) < getCost(result)) { result = p1; angle = BezierUtils.getStartingAngle(left); } if (getCost(p2) < getCost(result)) { result = p2; angle = BezierUtils.getEndingAngle(left); } if (getCost(p3) < getCost(result)) { result = p3; angle = BezierUtils.getStartingAngle(right); } if (getCost(p4) < getCost(result)) { result = p4; angle = BezierUtils.getEndingAngle(right); } } return new PointAndAngle(result, angle); }
public PointDirected getIntersection(CubicCurve2D.Double bez) { if (contains(bez.x1, bez.y1) == contains(bez.x2, bez.y2)) { return null; } final double dist = bez.getP1().distance(bez.getP2()); if (dist < 2) { final double angle = BezierUtils.getStartingAngle(bez); return new PointDirected(bez.getP1(), angle); } final CubicCurve2D.Double left = new CubicCurve2D.Double(); final CubicCurve2D.Double right = new CubicCurve2D.Double(); bez.subdivide(left, right); final PointDirected int1 = getIntersection(left); if (int1 != null) { return int1; } final PointDirected int2 = getIntersection(right); if (int2 != null) { return int2; } throw new IllegalStateException(); }
public LineSegmentDouble(CubicCurve2D.Double curve) { this(curve.getP1(), curve.getP2()); }
public Map<Point2D, Double> somePoints() { final Map<Point2D, Double> result = new HashMap<Point2D, Double>(); for (CubicCurve2D.Double bez : beziers) { final CubicCurve2D.Double left = new CubicCurve2D.Double(); final CubicCurve2D.Double right = new CubicCurve2D.Double(); bez.subdivide(left, right); result.put(left.getP1(), BezierUtils.getStartingAngle(left)); result.put(left.getP2(), BezierUtils.getEndingAngle(left)); result.put(right.getP1(), BezierUtils.getStartingAngle(right)); result.put(right.getP2(), BezierUtils.getEndingAngle(right)); } return result; }
private void drawCubic(double x, double y, CubicCurve2D.Double bez) { drawPointInternal(x, y, bez.getP1()); drawPointInternal(x, y, bez.getP2()); if (bez.getP1().distance(bez.getP2()) > quanta) { final CubicCurve2D.Double part1 = new CubicCurve2D.Double(); final CubicCurve2D.Double part2 = new CubicCurve2D.Double(); bez.subdivide(part1, part2); drawCubic(x, y, part1); drawCubic(x, y, part2); } }
static private boolean contains(CubicCurve2D.Double cubic, Rectangle2D... rects) { for (Rectangle2D r : rects) { if (r.contains(cubic.getP1()) && r.contains(cubic.getP2())) { return true; } } return false; }
static public double getEndingAngle(final CubicCurve2D.Double left) { if (left.getCtrlP2().equals(left.getP2())) { return getAngle(left.getP1(), left.getP2()); } return getAngle(left.getCtrlP2(), left.getP2()); }
public DotPath getMirrored(DotPath path) { DotPath result = new DotPath(); for (CubicCurve2D.Double bez : path.getBeziers()) { result = result.addCurve(getMirrored(bez.getP1()), getMirrored(bez.getCtrlP1()), getMirrored(bez.getCtrlP2()), getMirrored(bez.getP2())); } return result; }