buffer method

Geometry buffer(
  1. Geometry g,
  2. double distance
)

Implementation

Geometry buffer(Geometry g, double distance) {
  PrecisionModel? precisionModel = workingPrecisionModel;
  if (precisionModel == null)
    precisionModel = g.getPrecisionModel();

  // factory must be the same as the one used by the input
  geomFact = g.getFactory();

  BufferCurveSetBuilder curveSetBuilder = BufferCurveSetBuilder(g, distance, precisionModel, bufParams);
  curveSetBuilder.setInvertOrientation(isInvertOrientation);

  List bufferSegStrList = curveSetBuilder.getCurves();

  // short-circuit test
  if (bufferSegStrList.length <= 0) {
    return createEmptyResultGeometry();
  }

//BufferDebug.runCount++;
//String filename = "run" + BufferDebug.runCount + "_curves";
//System.out.println("saving " + filename);
//BufferDebug.saveEdges(bufferEdgeList, filename);
// DEBUGGING ONLY
//WKTWriter wktWriter = new WKTWriter();
//Debug.println("Rings: " + wktWriter.write(convertSegStrings(bufferSegStrList.iterator())));
//wktWriter.setMaxCoordinatesPerLine(10);
//System.out.println(wktWriter.writeFormatted(convertSegStrings(bufferSegStrList.iterator())));

  computeNodedEdges(bufferSegStrList, precisionModel);
  graph = new PlanarGraph.withFactory(OverlayNodeFactory());
  graph!.addEdges(edgeList.getEdges());

  List subgraphList = createSubgraphs(graph!);
  PolygonBuilder polyBuilder = new PolygonBuilder(geomFact!);
  buildSubgraphs(subgraphList, polyBuilder);
  List<Polygon> resultPolyList = polyBuilder.getPolygons();

  // just in case...
  if (resultPolyList.isEmpty) {
    return createEmptyResultGeometry();
  }

  Geometry resultGeom = geomFact!.buildGeometry(resultPolyList);
  return resultGeom;
}