public void Octree_removePoints_PointCountOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int j = 0; j <= 10; j++)
            {
                for (int i = 0; i <= 10; i++)
                {
                    vectorList.Add(new Vector3(i * 1.0, j * 1.0, 2.0));
                }
            }
            Vector3     searchPt = new Vector3(3, 3, 2);
            BoundingBox box      = new BoundingBox(1.5, 1.5, 1.5, 4.5, 4.5, 2.5);

            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            List <SurfacePoint> allPointList = Octree.GetAllPoints();
            int totalCount = allPointList.Count;

            Assert.AreEqual(11 * 11, totalCount, "total Count");
            List <SurfacePoint> pointList = Octree.GetPointsInsideBox(box);
            int ptCount = pointList.Count;

            Assert.AreEqual(9, ptCount, "pointsInBox Count");
            Octree.Remove(pointList);
            List <SurfacePoint> someRemovedPointsList = Octree.GetAllPoints();
            int newTotalCount = someRemovedPointsList.Count;

            Assert.AreEqual(121 - 9, newTotalCount, "new total");
        }
        public void Octree_cutPointsInBox_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int j = 0; j <= 10; j++)
            {
                for (int i = 0; i <= 10; i++)
                {
                    vectorList.Add(new Vector3(i * 1.0, j * 1.0, 2.0));
                }
            }

            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            List <SurfacePoint> initialList = Octree.GetAllPoints();
            int initalCount = initialList.Count;

            Assert.AreEqual(121, initalCount, "initial count");
            Vector3             searchPt  = new Vector3(3, 3, 2);
            BoundingBox         box       = new BoundingBox(1.5, 1.5, 1.5, 4.5, 4.5, 2.5);
            List <SurfacePoint> pointList = Octree.CutPointsInsideBox(box);
            int ptCount = pointList.Count;

            Assert.AreEqual(9, ptCount, "cut count");
            List <SurfacePoint> remainderList = Octree.GetAllPoints();
            int remCount = remainderList.Count;

            Assert.AreEqual(121 - 9, remCount, "remainder count");
        }
        public void Octree_getPointsInBox_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int j = 0; j <= 10; j++)
            {
                for (int i = 0; i <= 10; i++)
                {
                    vectorList.Add(new Vector3(i * 1.0, j * 1.0, 2.0));
                }
            }

            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3     searchPt = new Vector3(3, 3, 2);
            BoundingBox box      = new BoundingBox(1.5, 1.5, 1.5, 4.5, 4.5, 2.5);


            List <SurfacePoint> pointList = Octree.GetPointsInsideBox(box);
            int ptCount = pointList.Count;

            Assert.AreEqual(9, ptCount);
            string fileName = "pointsInsideBoxList.txt";

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName))
                foreach (SurfacePoint pt in pointList)
                {
                    sw.WriteLine(pt.Position.X.ToString() + "," + pt.Position.Y.ToString() + "," + pt.Position.Z.ToString());
                }
        }
        public void OctreeBuilder_buildFromSTLFile_octreeOK()
        {
            string  fileName            = "Tbinary.STL";
            StlFile stlFile             = StlFileParser.Open(fileName);
            double  minPointSpacing     = .005;
            Octree <AbmachPoint> octree = OctreeBuilder <AbmachPoint> .Build(stlFile, minPointSpacing);

            List <AbmachPoint> points = octree.GetAllPoints();

            Assert.AreNotEqual(0, points.Count);
        }
        public void Octree_getNeighbors_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 10; i++)
            {
                for (int j = 0; j <= 10; j++)
                {
                    vectorList.Add(new Vector3(i * 1.0, j * 1.0, 2.0));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3             searchPt = new Vector3(3.1, 3.1, 2);
            List <SurfacePoint> points   = Octree.GetNeighbors(searchPt);

            Assert.AreNotEqual(0, points.Count);
        }
        public void Octree_planarPoints_getNearestPts_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int j = 0; j <= 10; j++)
            {
                for (int i = 0; i <= 10; i++)
                {
                    vectorList.Add(new Vector3(i * 1.0, j * 1.0, 2.0));
                }
            }

            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3             searchPt  = new Vector3(3, 3, 2);
            int                 searchQty = 5;
            List <SurfacePoint> pointList = Octree.GetKNearestPoints(searchPt, searchQty);


            double        dMin      = double.MaxValue;
            double        dMax      = double.MinValue;
            List <double> distances = new List <double>();
            string        fileName  = "octreeNearestPointTestList.txt";

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName))
                foreach (SurfacePoint pt in pointList)
                {
                    double d = searchPt.DistanceTo(pt.Position);
                    distances.Add(d);
                    if (d < dMin)
                    {
                        dMin = d;
                    }
                    if (d > dMax)
                    {
                        dMax = d;
                    }
                    sw.WriteLine(pt.Position.X.ToString() + "," + pt.Position.Y.ToString() + "," + pt.Position.Z.ToString());
                }


            Assert.AreEqual(9, pointList.Count);
        }
        public void OctreeBuild_GetAllPoints_CountOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 10; i++)
            {
                for (int j = 0; j <= 10; j++)
                {
                    for (int k = 0; k <= 10; k++)
                    {
                        vectorList.Add(new Vector3(i * 1.0, j * 1.0, k * 1.0));
                    }
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            var pointList = Octree.GetAllPoints();

            Assert.AreEqual(vectorList.Count, pointList.Count);
        }
        public void Octree_getNearestPoint_pointOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 100; i++)
            {
                for (int j = 0; j <= 100; j++)
                {
                    vectorList.Add(new Vector3(i * .1, j * .1, 1.0));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3      searchPoint = new Vector3(5, 6, 6);
            SurfacePoint resultPt    = Octree.GetPointAt(searchPoint);

            Assert.AreEqual(5.0, resultPt.Position.X, .01);
            Assert.AreEqual(6.0, resultPt.Position.Y, .01);
            Assert.AreEqual(1.0, resultPt.Position.Z, .01);
        }
        public void OctreeBuild_buildFromPtList_originOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 10; i++)
            {
                for (int j = 0; j <= 10; j++)
                {
                    for (int k = 0; k <= 10; k++)
                    {
                        vectorList.Add(new Vector3(i * 1.0, j * 1.0, k * 1.0));
                    }
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);


            Assert.AreEqual(0, Octree.Origin.X, .001);
            Assert.AreEqual(0, Octree.Origin.Y, .001);
            Assert.AreEqual(0, Octree.Origin.Z, .001);
        }
        public void Octree_getNormal_normalOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 100; i++)
            {
                for (int j = 0; j <= 100; j++)
                {
                    vectorList.Add(new Vector3(i * .1, j * .1, i * .1));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            var     pt     = new SurfacePoint(new Vector3(5, 5, 1));
            Vector3 normal = Octree.GetNormalAt(pt.Position);

            normal.Normalize();
            Assert.AreEqual(-.707, normal.X, .01);
            Assert.AreEqual(0.0, normal.Y, .01);
            Assert.AreEqual(.707, normal.Z, .01);
        }
        public void Octree_getpointsInboxfromSearchBox_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 100; i++)
            {
                for (int j = 0; j <= 100; j++)
                {
                    vectorList.Add(new Vector3(i * .1, j * .1, 1.0));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3             searchPoint  = new Vector3(5, 6, 3);
            Vector3             direction    = new Vector3(0, 0, 1);
            Ray                 ray          = new Ray(searchPoint, direction);
            double              searchRadius = Octree.MeshSize * 3;
            var                 searchBox    = BoundingBoxBuilder.GetSearchCylinder(Octree.BoundingBox, searchPoint, direction, searchRadius);
            List <SurfacePoint> points       = Octree.GetPointsInsideBox(searchBox);

            Assert.AreNotEqual(0, points.Count);
        }
        public void Octree_getIntersection_pointOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 100; i++)
            {
                for (int j = 0; j <= 100; j++)
                {
                    vectorList.Add(new Vector3(i * .1, j * .1, 1.0));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3            searchPoint = new Vector3(5, 6, 3);
            Vector3            direction   = new Vector3(0, 0, -1);
            Ray                ray         = new Ray(searchPoint, direction);
            IntersectionRecord ir          = Octree.GetIntersection(ray);

            Assert.IsTrue(ir.Intersects);
            Assert.AreEqual(5.0, ir.X, .01);
            Assert.AreEqual(6.0, ir.Y, .01);
            Assert.AreEqual(1.0, ir.Z, .01);
        }
        public void Octree_buildFromLineList_pointsOK()
        {
            List <Line> lines = new List <Line>();

            for (int i = 0; i <= 10; i++)
            {
                Line l = new Line(i, Math.Sin(Math.PI * i / 5), 0, i + 1, Math.Sin(Math.PI * (i + 1) / 5), 0);

                lines.Add(l);
            }
            Line acrossV = new Line(0, 0, 0, 0, 0, 10);
            Octree <SurfacePoint> octree = OctreeBuilder <SurfacePoint> .Build(lines, acrossV, .1);

            List <Vector3>   positions   = octree.GetAllPositions();
            List <DwgEntity> dwgEntities = new List <DwgEntity>();

            foreach (Vector3 p in positions)
            {
                dwgEntities.Add((DwgEntity)p);
            }
            DwgConverterLib.DxfFileBuilder.Save(dwgEntities, "dxfFileName.dxf");
            Assert.AreEqual(12625, positions.Count);
        }
        public void Run(CancellationToken ct, IProgress <int> progress)
        {
            try
            {
                double searchRadius = jetRadius + surface.MeshSize;

                int           pcount    = path.Count * runInfo.Runs * runInfo.Iterations;
                int           count     = 0;
                List <string> pointlist = new List <string>();
                pointlist.Add("run,Nx,Ny,Nz,x,z,pointradius,jetfactor,incidentangle,slopefactor");

                double spFactor      = spacingFactor();
                double testJetRadius = jetRadius + surface.MeshSize;
                for (int iteration = 1; iteration <= runInfo.Iterations; iteration++)
                {
                    runInfo.CurrentIteration = iteration;


                    for (int run = 1; run <= runInfo.Runs; run++)
                    {
                        runInfo.CurrentRun = run;
                        int pathCount = 0;
                        foreach (ModelPathEntity mpe in path)
                        {
                            if (!ct.IsCancellationRequested)
                            {
                                double feedFactor = currentRemovalRate.DepthPerPass * spFactor * feedrateFactor(mpe.Feedrate.Value, currentRemovalRate);
                                pathCount++;
                                if (mpe.JetOn && feedFactor != 0)
                                {
                                    BoundingBox        searchBox        = BoundingBoxBuilder.GetSearchCylinder(surface.BoundingBox, mpe.PositionAsVector3, mpe.JetVector, searchRadius);
                                    List <AbmachPoint> jetIntersectList = surface.GetPointsInsideBox(searchBox);

                                    Octree <AbmachPoint> localSurface = OctreeBuilder <AbmachPoint> .Build(jetIntersectList, surface.MeshSize);// OctreeBuilder<AbmachPoint>.Build(jetIntersectList, searchBox, surface.MeshSize);

                                    var newPts = new List <AbmachPoint>();
                                    var mpeV   = new Vector3(mpe.Position.X, mpe.Position.Y, 0);
                                    var jetRay = new Ray(mpe.PositionAsVector3, mpe.JetVector);

                                    foreach (AbmachPoint jetPt in localSurface.GetAllPoints())
                                    {
                                        if (jetPt != null)
                                        {
                                            //var jetV = new Vector3(jetPt.Position.X, jetPt.Position.Y, 0);

                                            //double pointRadius = jetV.DistanceTo(mpeV);
                                            double pointRadius = GeomUtilities.RayPointDistance(jetRay, jetPt.Position);
                                            if (pointRadius <= testJetRadius)
                                            {
                                                double jFactor = jetFactor(pointRadius);
                                                if (jFactor > 0)
                                                {
                                                    Vector3 localNormal = new Vector3(0, 0, 1); // localSurface.GetNormalAt(jetPt.Position);
                                                    if (localNormal.Length == 0)
                                                    {
                                                        localNormal = new Vector3(mpe.JetVector);
                                                    }
                                                    double angle    = incidentAngle(mpe.JetVector, localNormal);
                                                    double slFactor = slopeFactor(angle);
                                                    //debug


                                                    if (jetPt.Position.X > 0.006 && jetPt.Position.X < .1 && jetPt.Position.Y > .072 && jetPt.Position.Y < .102)
                                                    {
                                                        pointlist.Add(run.ToString() + "," + jetPt.Position.X.ToString("f5") + "," + jetPt.Position.Y.ToString("f5") + "," + jetPt.Position.Z.ToString("f5") + "," + pointRadius.ToString("f5") + "," + jFactor.ToString("F5") + "," + angle.ToString("F5") + "," + slFactor.ToString("F5"));
                                                    }
                                                    //debug

                                                    Vector3 materialRemoved = (feedFactor * slFactor * jFactor) * mpe.JetVector;

                                                    Vector3 newPosition = jetPt.Position - materialRemoved;

                                                    jetPt.Position         = newPosition;
                                                    jetPt.Normal           = localNormal;
                                                    jetPt.OriginalPosition = jetPt.OriginalPosition;
                                                    jetPt.JetHit           = true;
                                                    newPts.Add(jetPt);
                                                }
                                            }
                                            else
                                            {
                                                newPts.Add(jetPt);
                                            }
                                        }    //end foreach jetPt
                                    }
                                    surface.Insert(newPts);
                                }//endif jeton
                            }
                            progress.Report(100 * ++count / pcount);
                        }//next path entity
                        if (runInfo.RunType == ModelRunType.NewMRR)
                        {
                            currentRemovalRate = newRemovalRate(path, runInfo, currentRemovalRate, depthInfo);
                        }
                    } //next run

                    if (runInfo.RunType == ModelRunType.NewFeedrates && runInfo.CurrentIteration < runInfo.Iterations)
                    {
                        path = newFeedrates(path, depthInfo);
                        resetSurface();
                    }
                }//next iteration
                FileIOLib.FileIO.Save(pointlist, "slopefactor.csv");
            }
            catch (Exception)
            {
                throw;
            }
        }