use of com.revolsys.geometry.geomgraph.Edge in project com.revolsys.open by revolsys.
the class MonotoneChainEdge method computeIntersectsForChain.
public void computeIntersectsForChain(final int chainIndex0, final MonotoneChainEdge mce, final int chainIndex1, final SegmentIntersector si) {
final Edge edge1 = this.edge;
final Edge edge2 = mce.edge;
final LineString line1 = edge1.getLineString();
final LineString line2 = edge2.getLineString();
computeIntersectsForChain(edge1, line1, this.startIndex[chainIndex0], this.startIndex[chainIndex0 + 1], edge2, line2, mce.startIndex[chainIndex1], mce.startIndex[chainIndex1 + 1], si);
}
use of com.revolsys.geometry.geomgraph.Edge in project com.revolsys.open by revolsys.
the class Buffer method buffer.
private static Geometry buffer(final Noder noder, final GeometryFactory precisionModel, final Geometry geometry, final double distance, final BufferParameters parameters) {
final GeometryFactory geometryFactory = geometry.getGeometryFactory();
final OffsetCurveSetBuilder curveSetBuilder = new OffsetCurveSetBuilder(geometry, distance, precisionModel, parameters);
final List<NodedSegmentString> curves = curveSetBuilder.getCurves();
if (curves.size() == 0) {
return geometryFactory.polygon();
} else {
final EdgeList edgeList = new EdgeList();
computeNodedEdges(noder, edgeList, curves);
final PlanarGraph graph = new PlanarGraph(new OverlayNodeFactory());
final List<Edge> edges = edgeList.getEdges();
graph.addEdges(edges);
final List<BufferSubgraph> subgraphList = newSubgraphs(graph);
final PolygonBuilder polyBuilder = new PolygonBuilder(geometryFactory);
buildSubgraphs(subgraphList, polyBuilder);
final List<Polygon> polygons = polyBuilder.getPolygons();
if (polygons.size() == 0) {
return geometryFactory.polygon();
} else {
final Geometry resultGeom = geometryFactory.buildGeometry(polygons);
return resultGeom;
}
}
}
use of com.revolsys.geometry.geomgraph.Edge in project com.revolsys.open by revolsys.
the class Buffer method findStabbedSegments.
/**
* Finds all non-horizontal segments intersecting the stabbing line
* in the input dirEdge.
* The stabbing line is the ray to the right of stabbingRayLeftPt.
*
* @param stabbingRayLeftPt the left-hand origin of the stabbing line
* @param stabbedSegments the current list of {@link DepthSegments} intersecting the stabbing line
*/
private static void findStabbedSegments(final Collection<BufferSubgraph> subgraphs, final Point stabbingRayLeftPt, final DirectedEdge dirEdge, final List<DepthSegment> stabbedSegments) {
final Edge edge = dirEdge.getEdge();
for (int i = 0; i < edge.getVertexCount() - 1; i++) {
final Point p1 = edge.getPoint(i);
LineSegment seg = new LineSegmentDouble(p1, edge.getPoint(i + 1));
double y1 = seg.getY(0);
double y2 = seg.getY(1);
// ensure segment always points upwards
if (y1 > y2) {
seg = seg.reverse();
y1 = seg.getY(0);
y2 = seg.getY(1);
}
final double x1 = seg.getX(0);
final double x2 = seg.getX(1);
// skip segment if it is left of the stabbing line
final double maxx = Math.max(x1, x2);
if (maxx < stabbingRayLeftPt.getX()) {
continue;
}
// the same depth info
if (seg.isHorizontal()) {
continue;
}
// skip if segment is above or below stabbing line
if (stabbingRayLeftPt.getY() < y1 || stabbingRayLeftPt.getY() > y2) {
continue;
}
// skip if stabbing ray is right of the segment
if (CGAlgorithmsDD.orientationIndex(seg.getP0(), seg.getP1(), stabbingRayLeftPt) == CGAlgorithms.RIGHT) {
continue;
}
// stabbing line cuts this segment, so record it
int depth = dirEdge.getDepth(Position.LEFT);
// if segment direction was flipped, use RHS depth instead
if (!seg.getP0().equals(p1)) {
depth = dirEdge.getDepth(Position.RIGHT);
}
final DepthSegment ds = new DepthSegment(seg, depth);
stabbedSegments.add(ds);
}
}
use of com.revolsys.geometry.geomgraph.Edge in project com.revolsys.open by revolsys.
the class LineBuilder method buildLines.
private void buildLines(final int opCode) {
for (final Edge e : this.lineEdgesList) {
final LineString line = this.geometryFactory.lineString(e.getLineString());
this.resultLineList.add(line);
e.setInResult(true);
}
}
use of com.revolsys.geometry.geomgraph.Edge in project com.revolsys.open by revolsys.
the class LineBuilder method collectLineEdge.
/**
* Collect line edges which are in the result.
* Line edges are in the result if they are not part of
* an area boundary, if they are in the result of the overlay operation,
* and if they are not covered by a result area.
*
* @param de the directed edge to test
* @param opCode the overlap operation
* @param edges the list of included line edges
*/
private void collectLineEdge(final DirectedEdge de, final int opCode, final List<Edge> edges) {
final Label label = de.getLabel();
final Edge e = de.getEdge();
// include L edges which are in the result
if (de.isLineEdge()) {
if (!de.isVisited() && OverlayOp.isResultOfOp(label, opCode) && !e.isCovered()) {
// Debug.println("de: " + de.getLabel());
// Debug.println("edge: " + e.getLabel());
edges.add(e);
de.setVisitedEdge(true);
}
}
}
Aggregations