private List<? extends PolyLine> clip(final PolyLine subject, final Polygon clipping) { switch (this.clipType) { case AND: return new PolygonClipper(clipping).and(subject); case OR: return new PolygonClipper(clipping).union(subject); case NOT: return new PolygonClipper(clipping).not(subject); case XOR: return new PolygonClipper(clipping).xor(subject); default: throw new CoreException("Invalid Clip Type."); } }
public List<? extends PolyLine> not(final PolyLine subject) { return processResult(getJts(subject).difference(this.jtsClipping)); }
/** * Construct * * @param clipping * The clipping {@link Polygon} */ public PolygonClipper(final Polygon clipping) { this.jtsClipping = getJts(clipping); }
private List<? extends PolyLine> processResult(final Geometry intersections) { final List<PolyLine> result = new ArrayList<>(); if (intersections instanceof GeometryCollection) { final GeometryCollection collection = (GeometryCollection) intersections; final int numGeometries = collection.getNumGeometries(); for (int n = 0; n < numGeometries; n++) { final Geometry geometry = collection.getGeometryN(n); result.addAll(processResult(geometry)); } } else if (intersections instanceof com.vividsolutions.jts.geom.Polygon) { result.add(new JtsPolygonConverter() .backwardConvert((com.vividsolutions.jts.geom.Polygon) intersections)); } else if (intersections instanceof LineString) { result.add(new JtsPolyLineConverter().backwardConvert((LineString) intersections)); } return result; } }
private List<PolyLine> runPolyLineClipping(final PolyLine subject, final BiFunction<Geometry, Geometry, Geometry> application) { final List<PolyLine> result = new ArrayList<>(); for (final com.vividsolutions.jts.geom.Polygon jtsClipping : this.jtsClippings) { result.addAll(processPolyLine( application.apply(PolygonClipper.getJts(subject), jtsClipping))); } return result; } }
private List<? extends PolyLine> clip(final Polygon subject, final Polygon clipping) { switch (this.clipType) { case AND: return toPolygons(new PolygonClipper(clipping).and(subject)); case OR: return toPolygons(new PolygonClipper(clipping).union(subject)); case NOT: return toPolygons(new PolygonClipper(clipping).not(subject)); case XOR: return toPolygons(new PolygonClipper(clipping).xor(subject)); default: throw new CoreException("Invalid Clip Type."); } }
public List<? extends PolyLine> xor(final PolyLine subject) { return processResult(getJts(subject).symDifference(this.jtsClipping)); }
private MultiPolygon runPolygonClipping(final Polygon subject, final BiFunction<Geometry, Geometry, Geometry> application) { MultiPolygon result = new MultiPolygon(new MultiMap<>()); for (final com.vividsolutions.jts.geom.Polygon jtsClipping : this.jtsClippings) { result = result.merge(processMultiPolygon( application.apply(PolygonClipper.getJts(subject), jtsClipping))); } return result; }
public List<? extends PolyLine> and(final PolyLine subject) { return processResult(getJts(subject).intersection(this.jtsClipping)); }
public List<? extends PolyLine> union(final PolyLine subject) { return processResult(getJts(subject).union(this.jtsClipping)); }