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; }
public Point2DInt[] intersect(LineSegmentInt seg) { if (seg.side(this) != 0) { return new Point2DInt[0]; } // Log.println("THIS=" + this); // Log.println("LineSegment=" + seg); final Point2DInt corners[] = getCorners(); final LineSegmentInt seg1 = new LineSegmentInt(corners[0], corners[1]); final LineSegmentInt seg2 = new LineSegmentInt(corners[1], corners[2]); final LineSegmentInt seg3 = new LineSegmentInt(corners[2], corners[3]); final LineSegmentInt seg4 = new LineSegmentInt(corners[3], corners[0]); final Point2DInt i1 = seg.getSegIntersection(seg1); Point2DInt i2 = seg.getSegIntersection(seg2); Point2DInt i3 = seg.getSegIntersection(seg3); Point2DInt i4 = seg.getSegIntersection(seg4); // Log.println("i1="+i1); // Log.println("i2="+i2); // Log.println("i3="+i3); // Log.println("i4="+i4); if (i2 != null && i2.equals(i1)) { i2 = null; } if (i3 != null && (i3.equals(i1) || i3.equals(i2))) { i3 = null; } if (i4 != null && (i4.equals(i1) || i4.equals(i2) || i4.equals(i3))) { i4 = null; } final int nb = countNotNull(i1, i2, i3, i4); assert nb >= 0 && nb <= 3 : nb; int i = 0; final Point2DInt result[] = new Point2DInt[nb]; if (i1 != null) { result[i++] = i1; } if (i2 != null) { result[i++] = i2; } if (i3 != null) { result[i++] = i3; } if (i4 != null) { result[i++] = i4; } assert i == nb; assert getCornersOfOneSide(seg, 0).length + getCornersOfOneSide(seg, 1).length + getCornersOfOneSide(seg, -1).length == 4; 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; }
public Point2DInt[] getCornersOfOneSide(LineSegmentInt seg, int sgn) { final Point2DInt[] corners = getCorners(); final double sgn0 = seg.side(corners[0]); final double sgn1 = seg.side(corners[1]); final double sgn2 = seg.side(corners[2]); final double sgn3 = seg.side(corners[3]); int nb = 0; if (Math.signum(sgn0) == sgn) { nb++; } if (Math.signum(sgn1) == sgn) { nb++; } if (Math.signum(sgn2) == sgn) { nb++; } if (Math.signum(sgn3) == sgn) { nb++; } final Point2DInt[] result = new Point2DInt[nb]; int i = 0; if (Math.signum(sgn0) == sgn) { result[i++] = corners[0]; } if (Math.signum(sgn1) == sgn) { result[i++] = corners[1]; } if (Math.signum(sgn2) == sgn) { result[i++] = corners[2]; } if (Math.signum(sgn3) == sgn) { result[i++] = corners[3]; } assert nb == i; return result; }
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; }