List<Line2D.Double> inflateSegmentCollection(Collection<Line2D.Double> segments) { final List<Line2D.Double> result = new ArrayList<Line2D.Double>(); for (Line2D.Double seg : segments) { final AffineTransform at = getAffineTransformAt(new Point2D.Double((seg.x1 + seg.x2) / 2, (seg.y1 + seg.y2) / 2)); result.add(new Line2D.Double(at.transform(seg.getP1(), null), at.transform(seg.getP2(), null))); } return result; }
public void addLineSegment(Line2D.Double seg) { if (seg.getP1().equals(center)) { angles.add(convertAngle(getAngle(seg))); } else if (seg.getP2().equals(center)) { angles.add(convertAngle(getOppositeAngle(seg))); } else { throw new IllegalArgumentException(); } assert betweenZeroAndTwoPi(); }
public void draw(Graphics2D g2d) { close(); if (debug) { g2d.setColor(Color.GREEN); drawDebug(g2d); } g2d.setColor(Color.BLUE); final List<Point2D.Double> centers = new ArrayList<Point2D.Double>(); for (Line2D.Double l : lines) { centers.add(GeomUtils.getCenter(l)); } g2d.draw(new Line2D.Double(lines.get(0).getP1(), centers.get(0))); g2d.draw(new Line2D.Double(centers.get(centers.size() - 1), end)); for (int i = 0; i < lines.size() - 1; i++) { final Point2D c1 = centers.get(i); final Point2D c2 = centers.get(i + 1); final Point2D ctrl = lines.get(i).getP2(); assert ctrl.equals(lines.get(i + 1).getP1()); final QuadCurve2D.Double quad = new QuadCurve2D.Double(c1.getX(), c1.getY(), ctrl.getX(), ctrl.getY(), c2 .getX(), c2.getY()); g2d.draw(quad); } if (debug) { for (Point2D.Double c : centers) { GeomUtils.fillPoint2D(g2d, c); } } }
Collection<Point2D.Double> cutPoints(Line2D.Double original) { final SortedSet<Point2D.Double> result = new TreeSet<Point2D.Double>(new Point2DComparatorDistance(original .getP1())); if (GeomUtils.isHorizontal(original) == false) { for (InflateData2 x : inflateX) { final Line2D.Double vertical = new Line2D.Double(x.getPos(), GeomUtils.getMinY(original), x.getPos(), GeomUtils.getMaxY(original)); final Point2D.Double inter = GeomUtils.getSegIntersection(original, vertical); if (inter != null) { result.add(inter); } } } if (GeomUtils.isVertical(original) == false) { for (InflateData2 y : inflateY) { final Line2D.Double horizontal = new Line2D.Double(GeomUtils.getMinX(original), y.getPos(), GeomUtils .getMaxX(original), y.getPos()); final Point2D.Double inter = GeomUtils.getSegIntersection(original, horizontal); if (inter != null) { result.add(inter); } } } return result; }
static public Point2D.Double getSegIntersection(Line2D.Double line1, Line2D.Double line2) { final double u; if (isVertical(line2)) { u = getIntersectionVertical(line1, line2.getP1().getX()); } else if (isHorizontal(line2)) { u = getIntersectionHorizontal(line1, line2.getP1().getY()); } else { throw new UnsupportedOperationException(); } if (java.lang.Double.isNaN(u) || u < 0 || u > 1) { return null; } final Point2D.Double result = getPoint2D(line1, u); if (isBetween(result, line2.getP1(), line2.getP2())) { return result; } return null; }
private Line2D.Double change(Line2D.Double line, Point2D p1, Point2D p2) { if (line.getP1().equals(p1) == false && line.getP2().equals(p2) == false) { return line; } final double dx = line.x2 - line.x1; final double dy = line.y2 - line.y1; if (line.getP1().equals(p1)) { p1 = new Point2D.Double(line.x1 + dx / 10, line.y1 + dy / 10); } else { p1 = line.getP1(); } if (line.getP2().equals(p2)) { p2 = new Point2D.Double(line.x2 - dx / 10, line.y2 - dy / 10); } else { p2 = line.getP2(); } return new Line2D.Double(p1, p2); }
Collection<Line2D.Double> cutSegments(Line2D.Double original) { final List<Line2D.Double> result = new ArrayList<Line2D.Double>(); Point2D.Double cur = (Point2D.Double) original.getP1(); final Collection<Point2D.Double> cutPoints = cutPoints(original); for (Point2D.Double inter : cutPoints) { if (cur.equals(inter)) { continue; } result.add(new Line2D.Double(cur, inter)); cur = inter; } if (cur.equals(original.getP2()) == false) { result.add(new Line2D.Double(cur, original.getP2())); } return result; }
static public boolean isHorizontal(Line2D.Double seg) { return seg.getP1().getY() == seg.getP2().getY(); }
private static Line2D.Double inverse(Line2D.Double line) { return new Line2D.Double(line.getP2(), line.getP1()); }
static public boolean isVertical(Line2D.Double seg) { return seg.getP1().getX() == seg.getP2().getX(); }
public List<Line2D.Double> inflate(Collection<Line2D.Double> segments) { final Collection<Line2D.Double> cutSegments = cutSegments(segments); Line2D.Double last = null; final List<Line2D.Double> inflated = inflateSegmentCollection(cutSegments); final List<Line2D.Double> result = new ArrayList<Line2D.Double>(); for (Line2D.Double seg : inflated) { if (last != null && last.getP2().equals(seg.getP1()) == false) { result.add(new Line2D.Double(last.getP2(), seg.getP1())); } result.add(seg); last = seg; } return result; }
private void drawDebug(Graphics2D g2d) { for (Line2D.Double l : lines) { g2d.draw(l); GeomUtils.fillPoint2D(g2d, l.getP1()); GeomUtils.fillPoint2D(g2d, l.getP2()); } }
public void addLineSegment(Line2D.Double seg) { if (seg.getP1().equals(center)) { angles.add(convertAngle(getAngle(seg))); } else if (seg.getP2().equals(center)) { angles.add(convertAngle(getOppositeAngle(seg))); } else { throw new IllegalArgumentException(); } assert betweenZeroAndTwoPi(); }