private LineSegmentInt inflateSegment(LineSegmentInt seg) { if (isOnGrid(seg.getP1()) || isOnGrid(seg.getP2())) { return new LineSegmentInt(inflatePoint2DInt(seg.getP1()), inflatePoint2DInt(seg.getP2())); } for (InflateData x : inflateX) { seg = seg.inflateXAlpha(x); } for (InflateData y : inflateY) { seg = seg.inflateYAlpha(y); } return seg; }
public List<LineSegmentInt> inflate(Collection<LineSegmentInt> segments) { final List<LineSegmentInt> result = new ArrayList<LineSegmentInt>(); LineSegmentInt last = null; final Collection<LineSegmentInt> cutSegments = cutSegments(segments); for (LineSegmentInt seg : inflateSegmentCollection(cutSegments)) { if (last != null && last.getP2().equals(seg.getP1()) == false) { result.add(new LineSegmentInt(last.getP2(), seg.getP1())); } result.add(seg); last = seg; } return result; }
Collection<Point2DInt> cutPoints(LineSegmentInt original) { // Log.println("original=" + original); // Log.println("inflateX=" + inflateX); // Log.println("inflateY=" + inflateY); final SortedSet<Point2DInt> result = new TreeSet<Point2DInt>(new Point2DIntComparatorDistance(original.getP1())); if (original.isHorizontal() == false) { for (InflateData x : inflateX) { final LineSegmentInt vertical = new LineSegmentInt(x.getPos(), original.getMinY(), x.getPos(), original.getMaxY()); final Point2DInt inter = original.getSegIntersection(vertical); if (inter != null) { result.add(inter); } } } if (original.isVertical() == false) { for (InflateData y : inflateY) { final LineSegmentInt horizontal = new LineSegmentInt(original.getMinX(), y.getPos(), original.getMaxX(), y.getPos()); final Point2DInt inter = original.getSegIntersection(horizontal); if (inter != null) { result.add(inter); } } } return result; }
Collection<LineSegmentInt> cutSegments(LineSegmentInt original) { final List<LineSegmentInt> result = new ArrayList<LineSegmentInt>(); Point2DInt cur = original.getP1(); final Collection<Point2DInt> cutPoints = cutPoints(original); for (Point2DInt inter : cutPoints) { if (cur.equals(inter)) { continue; } result.add(new LineSegmentInt(cur, inter)); cur = inter; } if (cur.equals(original.getP2()) == false) { result.add(new LineSegmentInt(cur, original.getP2())); } return result; }