/// <summary> /// /// </summary> /// <returns></returns> public bool IsInteriorsConnected() { // node the edges, in case holes touch the shell IList splitEdges = new ArrayList(); _geomGraph.ComputeSplitEdges(splitEdges); // form the edges into rings PlanarGraph graph = new PlanarGraph(new OverlayNodeFactory()); graph.AddEdges(splitEdges); SetInteriorEdgesInResult(graph); graph.LinkResultDirectedEdges(); IList edgeRings = BuildEdgeRings(graph.EdgeEnds); /* * Mark all the edges for the edgeRings corresponding to the shells * of the input polygons. Notice only ONE ring gets marked for each shell. */ VisitShellInteriors(_geomGraph.Geometry, graph); /* * If there are any unvisited shell edges * (i.e. a ring which is not a hole and which has the interior * of the parent area on the RHS) * this means that one or more holes must have split the interior of the * polygon into at least two pieces. The polygon is thus invalid. */ return !HasUnvisitedShellEdge(edgeRings); }
/// <summary> /// /// </summary> /// <param name="g"></param> /// <param name="distance"></param> /// <returns></returns> public IGeometry Buffer(IGeometry g, double distance) { PrecisionModel precisionModel = _workingPrecisionModel ?? new PrecisionModel(g.PrecisionModel); // factory must be the same as the one used by the input _geomFact = g.Factory; OffsetCurveBuilder curveBuilder = new OffsetCurveBuilder(precisionModel, _quadrantSegments); curveBuilder.EndCapStyle = _endCapStyle; OffsetCurveSetBuilder curveSetBuilder = new OffsetCurveSetBuilder(g, distance, curveBuilder); IList bufferSegStrList = curveSetBuilder.GetCurves(); // short-circuit test if (bufferSegStrList.Count <= 0) { IGeometry emptyGeom = _geomFact.CreateGeometryCollection(new Geometry[0]); return emptyGeom; } ComputeNodedEdges(bufferSegStrList, precisionModel); _graph = new PlanarGraph(new OverlayNodeFactory()); _graph.AddEdges(_edgeList.Edges); IList subgraphList = CreateSubgraphs(_graph); PolygonBuilder polyBuilder = new PolygonBuilder(_geomFact); BuildSubgraphs(subgraphList, polyBuilder); IList resultPolyList = polyBuilder.Polygons; IGeometry resultGeom = _geomFact.BuildGeometry(resultPolyList); return resultGeom; }