/// <summary> /// /// </summary> /// <returns></returns> public virtual 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. Note 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> /// Add a set of edges and nodes, which form a graph. /// The graph is assumed to contain one or more polygons, /// possibly with holes. /// </summary> /// <param name="dirEdges"></param> /// <param name="nodes"></param> public void Add(IList dirEdges, IList nodes) { PlanarGraph.LinkResultDirectedEdges(nodes); IList maxEdgeRings = BuildMaximalEdgeRings(dirEdges); IList freeHoleList = new ArrayList(); IList edgeRings = BuildMinimalEdgeRings(maxEdgeRings, shellList, freeHoleList); SortShellsAndHoles(edgeRings, shellList, freeHoleList); PlaceFreeHoles(shellList, freeHoleList); //Assert: every hole on freeHoleList has a shell assigned to it }
/// <summary> /// Add a set of edges and nodes, which form a graph. /// The graph is assumed to contain one or more polygons, /// possibly with holes. /// </summary> /// <param name="dirEdges"></param> /// <param name="nodes"></param> public void Add(IList <EdgeEnd> dirEdges, IList <Node> nodes) { PlanarGraph.LinkResultDirectedEdges(nodes); var maxEdgeRings = BuildMaximalEdgeRings(dirEdges); var freeHoleList = new List <EdgeRing>(); var edgeRings = BuildMinimalEdgeRings(maxEdgeRings, _shellList, freeHoleList); SortShellsAndHoles(edgeRings, _shellList, freeHoleList); PlaceFreeHoles(_shellList, freeHoleList); //Assert: every hole on freeHoleList has a shell assigned to it }