예제 #1
0
        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);
        }
예제 #2
0
        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);
        }