Esempio n. 1
0
        /// <summary>
        /// Creates from the set of lines using copies.
        /// </summary> 
        /// <param name="Lines">The line set.</param> 
	    public void Create(C2DLineBaseSet Lines)
        {
            Lines.MakeValueCopy(Lines);

            this.MakeLineRects();
            this.MakeBoundingRect();
        }
Esempio n. 2
0
        /// <summary>
        /// Creates directly from a set of lines by extracting them from the set provided.
        /// </summary> 
        /// <param name="NewLines">The line set.</param> 
	    public void CreateDirect( C2DLineBaseSet NewLines)
        {
            Lines.Clear();
            Lines.ExtractAllOf(NewLines);

            this.MakeLineRects();
            this.MakeBoundingRect();
        }
        /// <summary>
        /// Returns true if there are crossing lines.
        /// </summary>
        public bool HasCrossingLines()
        {
	        C2DLineBaseSet Lines = new C2DLineBaseSet();

            Lines.InsertRange(0, _Rim.Lines);

	        for (int i = 0; i < _Holes.Count; i++)
	        {
		        Lines.InsertRange( 0, _Holes[i].Lines);
	        }

	        return Lines.HasCrossingLines();
        }
Esempio n. 4
0
        /// <summary>
        /// Returns the routes (collection of lines and sublines) either inside or outside another
        /// Given the intersection points.
        /// </summary>
        /// <param name="IntPts">The intersection points of this with the other polygon.</param>
        /// <param name="IntIndexes">The corresponding line indexes.</param>
        /// <param name="Routes">Output. The routes to get the result.</param>
        /// <param name="bStartInside">True if this polygon starts inside the other.</param>
        /// <param name="bRoutesInside">True if we require routes of this polygon inside the other.</param>    
        public void GetRoutes(C2DPointSet IntPts, List<int> IntIndexes,
            C2DLineBaseSetSet Routes, bool bStartInside, bool bRoutesInside)
        {
            
	        // Make sure the intersection indexes and points are the same size.
	        if (IntIndexes.Count != IntPts.Count )
	        {
		        Debug.Assert(false);
		        return;
	        }
	        // Set up a new collection of routes.
	        C2DLineBaseSetSet NewRoutes = new C2DLineBaseSetSet();
	        // If the polygon has no points then return.
	        if ( _Lines.Count < 1) 
		        return;
	        // Sort the intersections by index so we can go through them in order.
            IntPts.SortByIndex( IntIndexes );   
            
            // Set the inside / outside flag to the same as the start inside / outside flag.
	        bool bInside = bStartInside;
	        // If we are inside and want route inside or outside and want routes outside then add a new route.
	        if (bInside == bRoutesInside)
	        {
		        NewRoutes.Add(new C2DLineBaseSet());
	        }

	        // The current index of the intersects.
	        int usCurrentIntIndex = 0;

	        // cycle through the lines on the polygon.
	        for (int i = 0 ; i < Lines.Count ; i++)
	        {
		        // Set up a list of intersection points on this line only.
		        C2DPointSet IntsOnLine = new C2DPointSet();
		        // Cycle through all intersections on this line (leaving the usCurrentIntIndex at the next intersected line).
		        while ( usCurrentIntIndex < IntIndexes.Count && IntIndexes[usCurrentIntIndex] == i)
		        {
			        // Add a copy of the points on this line that are intersections
			        IntsOnLine.AddCopy( IntPts[ usCurrentIntIndex ] );
			        usCurrentIntIndex++;
		        }

		        // If the line in question intersects the other poly then we have left / entered.
		        if ( IntsOnLine.Count > 0 )
		        {
			        C2DLineBaseSet SubLines = new C2DLineBaseSet();
			        Lines[i].GetSubLines( IntsOnLine, SubLines );

			        while (SubLines.Count > 1)
			        {
				        if (bInside == bRoutesInside)
				        {
					        // We have 1. Left and want route in. OR 2. Entered and want routes out.
					        NewRoutes[NewRoutes.Count - 1].Add( SubLines.ExtractAt(0) );
					        bInside = true ^ bRoutesInside;
				        }
				        else
				        {
					        NewRoutes.Add(new C2DLineBaseSet());
					        bInside = false ^ bRoutesInside;
					        SubLines.RemoveAt(0);
				        }
			        }
			        if (bInside == bRoutesInside)
				        NewRoutes[NewRoutes.Count - 1].Add( SubLines.ExtractAt(SubLines.Count - 1 ) );
			        else
				        SubLines.RemoveAt(SubLines.Count - 1);
		        }
		        // Otherwise, if we are e.g. inside and want routes in the keep adding the end poitn of the line.
		        else if (bInside == bRoutesInside)
		        {
			        NewRoutes[NewRoutes.Count - 1].AddCopy(  Lines[i] );
		        }

	        }
	        // Put all the new routes into the provided collection.
	        Routes.ExtractAllOf(NewRoutes);
        }