public void Build(GeometryGraph geomGraph) { // compute nodes for intersections between previously noded edges ComputeIntersectionNodes(geomGraph, 0); // Copy the labelling for the nodes in the parent Geometry. These override // any labels determined by intersections. CopyNodesAndLabels(geomGraph, 0); //Build EdgeEnds for all intersections. EdgeEndBuilder eeBuilder = new EdgeEndBuilder(); ArrayList eeList = eeBuilder.ComputeEdgeEnds(geomGraph.EdgeIterator); InsertEdgeEnds(eeList); }
public IntersectionMatrix ComputeIM() { IntersectionMatrix im = new IntersectionMatrix(); // since Geometries are finite and embedded in a 2-D space, the EE element must always be 2 im.SetValue(LocationType.Exterior, LocationType.Exterior, 2); // if the Geometries don't overlap there is nothing to do if (!arg[0].Geometry.Bounds.Intersects(arg[1].Geometry.Bounds)) { ComputeDisjointIM(im); return(im); } arg[0].ComputeSelfNodes(li, false); arg[1].ComputeSelfNodes(li, false); // compute intersections between edges of the two input geometries SegmentIntersector intersector = arg[0].ComputeEdgeIntersections(arg[1], li, false); //System.out.println("computeIM: # segment intersection tests: " + intersector.numTests); ComputeIntersectionNodes(0); ComputeIntersectionNodes(1); // Copy the labelling for the nodes in the parent Geometries. These override // any labels determined by intersections between the geometries. CopyNodesAndLabels(0); CopyNodesAndLabels(1); // complete the labelling for any nodes which only have a label for a single geometry LabelIsolatedNodes(); // If a proper intersection was found, we can set a lower bound on the IM. ComputeProperIntersectionIM(intersector, im); // Now process improper intersections // (eg where one or other of the geometries has a vertex at the intersection point) // We need to compute the edge graph at all nodes to determine the IM. // build EdgeEnds for all intersections EdgeEndBuilder eeBuilder = new EdgeEndBuilder(); ArrayList ee0 = eeBuilder.ComputeEdgeEnds(arg[0].EdgeIterator); InsertEdgeEnds(ee0); ArrayList ee1 = eeBuilder.ComputeEdgeEnds(arg[1].EdgeIterator); InsertEdgeEnds(ee1); LabelNodeEdges(); // Compute the labeling for isolated components // Isolated components are components that do not touch any // other components in the graph. // They can be identified by the fact that they will // contain labels containing ONLY a single element, the one // for their parent geometry. // We only need to check components contained in the input graphs, since // isolated components will not have been replaced by new components // formed by intersections. LabelIsolatedEdges(0, 1); LabelIsolatedEdges(1, 0); // update the IM from all components UpdateIM(im); return(im); }