public IGeometry Buffer(IGeometry g, double distance) { IPrecisionModel precisionModel = _workingPrecisionModel; if (precisionModel == null) precisionModel = g.PrecisionModel; // factory must be the same as the one used by the input _geomFact = g.Factory; OffsetCurveBuilder curveBuilder = new OffsetCurveBuilder(precisionModel, _bufParams); OffsetCurveSetBuilder curveSetBuilder = new OffsetCurveSetBuilder(g, distance, curveBuilder); var bufferSegStrList = curveSetBuilder.GetCurves(); // short-circuit test if (bufferSegStrList.Count <= 0) { return CreateEmptyResultGeometry(); } ComputeNodedEdges(bufferSegStrList, precisionModel); _graph = new PlanarGraph(new OverlayNodeFactory()); _graph.AddEdges(_edgeList.Edges); IEnumerable<BufferSubgraph> subgraphList = CreateSubgraphs(_graph); PolygonBuilder polyBuilder = new PolygonBuilder(_geomFact); BuildSubgraphs(subgraphList, polyBuilder); var resultPolyList = polyBuilder.Polygons; // just in case... if (resultPolyList.Count <= 0) { return CreateEmptyResultGeometry(); } IGeometry resultGeom = _geomFact.BuildGeometry(resultPolyList); return resultGeom; }
/// <summary> /// /// </summary> /// <param name="inputGeom"></param> /// <param name="distance"></param> /// <param name="curveBuilder"></param> public OffsetCurveSetBuilder(IGeometry inputGeom, double distance, OffsetCurveBuilder curveBuilder) { _inputGeom = inputGeom; _distance = distance; _curveBuilder = curveBuilder; }