Exemplo n.º 1
0
		} // private void LabelIntersectionNodes( int argIndex )

		/// <summary>
		/// If the Geometries are disjoint, we need to enter their dimension and
		/// boundary dimension in the Ext rows in the IM.
		/// </summary>
		/// <param name="im"></param>
		private void ComputeDisjointIM( IntersectionMatrix im )
		{
			Geometry ga = _arg[0].Geometry;
			if ( !ga.IsEmpty() ) 
			{
				im.Set( Location.Interior, Location.Exterior, ga.GetDimension() );
				im.Set( Location.Boundary, Location.Exterior, ga.GetBoundaryDimension() );
			}
			Geometry gb = _arg[1].Geometry;
			if ( !gb.IsEmpty() ) 
			{
				im.Set( Location.Exterior, Location.Interior, gb.GetDimension() );
				im.Set( Location.Exterior, Location.Boundary, gb.GetBoundaryDimension() );
			}
		} // private void ComputeDisjointIM( IntersectionMatrix im )
Exemplo n.º 2
0
		} // public bool HasDuplicateRings()

		/// <summary>
		/// Computes the Intersection matrix for the geometries.
		/// </summary>
		/// <returns></returns>
		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.Set( Location.Exterior, Location.Exterior, 2);

			// if the Geometries don't overlap there is nothing to do
			if ( !_arg[0].Geometry.GetEnvelopeInternal().Intersects( 
				  _arg[1].Geometry.GetEnvelopeInternal() ) ) 
			{
				ComputeDisjointIM( im );
				return im;
			}

			_arg[0].ComputeSelfNodes( _li );
			_arg[1].ComputeSelfNodes( _li );

			// compute intersections between edges of the two input geometries
			SegmentIntersector intersector = _arg[0].ComputeEdgeIntersections( _arg[1], _li, false );
			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 geometrys 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].Edges );
			InsertEdgeEnds( ee0 );
			ArrayList ee1 = eeBuilder.ComputeEdgeEnds( _arg[1].Edges );
			InsertEdgeEnds( ee1 );

			//Trace.WriteLine("==== NodeList ===");
			//Trace.WriteLine( _nodes.ToString() );

			LabelNodeEdges();

			 // Compute the labeling for isolated components
			 // <br>
			 // 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.
			//Trace.WriteLine("Graph A isolated edges - ");
			LabelIsolatedEdges(0, 1);
			//Trace.WriteLine("Graph B isolated edges - ");
			LabelIsolatedEdges(1, 0);

			// update the IM from all components
			UpdateIM( im );
			return im;
		} // public IntersectionMatrix ComputeIM()