/// <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(); }
/// <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(); }
/// <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); }