private IntersectionsBinaryTree Intersect(MarkGeometryLine line, LineEquation equation) { if (!equation.PassesThroughRect(Boundary)) { return(null); } // using binary tree to sort points relative to the line's starting point var intersections = new IntersectionsBinaryTree(line.StartPoint); if (ChildrenExists) { IntersectionsBinaryTree childIntersections; if ((childIntersections = NorthWest.Intersect(line)) != null) { intersections.InsertRange(childIntersections); } if ((childIntersections = NorthEast.Intersect(line)) != null) { intersections.InsertRange(childIntersections); } if ((childIntersections = SouthWest.Intersect(line)) != null) { intersections.InsertRange(childIntersections); } if ((childIntersections = SouthEast.Intersect(line)) != null) { intersections.InsertRange(childIntersections); } } MarkGeometryPoint intersection; for (int i = 0; i < Segments.Count; i++) { if (( intersection = GeometricArithmeticModule.CalculateIntersection2D( line, Segments[i] )) != null ) { intersections.Insert(intersection); } } return(intersections); }
private static void TestQuadTree() { var _slicer = new MSTLSlicer(); _slicer.Load(@"C:\MSOLV\STLs\Ice Cream Type 2.stl"); //_slicer.Load(@"C:\MSOLV\STLs\tray.stl"); var slices = _slicer.Slice(); IEnumerable <MVertex> contour = slices[7][0].ToVertices().Concat(slices[5][0].ToVertices()); //IEnumerable<MVertex> contour = slices[5][1].ToVertices(); var reference = ToPath(contour); var intersectingLine = new MarkGeometryLine( reference.Extents.MinimumPoint, reference.Extents.MaximumPoint ); List <MarkGeometryPoint> controlResults = new List <MarkGeometryPoint>(); List <MarkGeometryPoint> quadTreeResults = new List <MarkGeometryPoint>(); var lines = ToLines(contour); var contourQuadTree = new ContourQuadTree(contour); Console.WriteLine( PerformanceHelper.Compare( () => { // setup up controlResults.Clear(); MarkGeometryPoint intersection; for (int i = 0; i < lines.Count; i++) { if (( intersection = GeometricArithmeticModule.CalculateIntersection2D( intersectingLine, lines[i] )) != null ) { controlResults.Add(intersection); } } }, () => { // setup up quadTreeResults.Clear(); quadTreeResults = contourQuadTree.Intersect(intersectingLine).ToList(); }, tagA: "Lines (Control)", tagB: "Quad Tree" ) ); Println("Control", controlResults); Println("Quad Tree Intersections", quadTreeResults); contourQuadTree.SaveImage(@"C:\Users\Chibuike.Okpaluba\Downloads\quad_tree_v2.png"); }