Exemplo n.º 1
0
        private void calcNormal(List <int>[] idc, ref PointCloud MyCloud, ref int count, int i)
        {
            List <Point3d> normalPts = new List <Point3d>();

            normalPts.Add(GlobalCloud[i].Location);
            List <int> ids = idc[i];

            if (ids.Count >= 3)
            {
                for (int j = 0; j < ids.Count; j++)
                {
                    Point3d nPt = GlobalCloud[ids[j]].Location;
                    normalPts.Add(nPt);
                }
                //Get not-oriented normal from Z-Axis of best fit plane to NormalPoints.
                Plane normalPln = new Plane();
                Plane.FitPlaneToPoints(normalPts, out normalPln);

                Vector3d notOriNormal = normalPln.ZAxis;

                //Orient not-oriented NormalVector according to the guiding vector.
                Vector3d guideVector = new Vector3d();
                if (insV_GuideStyle == true)
                {
                    guideVector = insV_GuideVector;
                }
                else if (insV_GuideStyle == false)
                {
                    guideVector = Point3d.Subtract(GlobalCloud[i].Location, new Point3d(insV_GuideVector));
                }
                guideVector.Unitize();

                Vector3d normalVector = new Vector3d();
                double   vecAngle     = Vector3d.VectorAngle(notOriNormal, guideVector);
                if (vecAngle < Math.PI / 2)
                {
                    normalVector = notOriNormal;
                }
                else
                {
                    normalVector = notOriNormal;
                    normalVector.Reverse();
                }

                //Add normal to Cloud.
                Cloud_Utils.AddItem_FromOtherCloud(ref MyCloud, GlobalCloud, i);
                MyCloud[count].Normal = normalVector;

                if (insV_Colorize)
                {
                    MyCloud[count].Color = KDTreeLib.normalColors(1, normalVector, GlobalCloud[i].Color);
                }

                count += 1;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Parallel Computing Setup for Code to Execute.
        /// </summary>
        /// <param name="pointCloud">ByRef PointCloud to Execute Code on.</param>
        /// <returns></returns>
        public override bool Execute(ref PointCloud pointCloud)
        {
            //Set Global Variables
            LastPercentReported = 0;
            PointCounter        = 0;
            NewCloud            = new PointCloud();
            CloudPieces         = null;
            CloudPieces         = new PointCloud[ProcCount];
            DictPieces          = new object[ProcCount];
            GlobalCloud         = pointCloud;

            // Setup the cancellation mechanism.
            po.CancellationToken = cts.Token;

            //Create Partitions for multithreading.
            var rangePartitioner = System.Collections.Concurrent.Partitioner.Create(0, GlobalCloud.Count, (int)Math.Ceiling((double)GlobalCloud.Count / ProcCount));

            Dict_Utils.CastDictionary_ToArrayDouble(ref GlobalCloud);

            //Run MultiThreaded Loop.
            Parallel.ForEach(rangePartitioner, po, (rng, loopState) =>
            {
                //Initialize Local Variables.
                /// Get Index for Processor to be able to merge clouds in ProcesserIndex order in the end.
                int MyIndex = (int)(rng.Item1 / Math.Ceiling(((double)GlobalCloud.Count / ProcCount)));
                /// Initialize Partial PointCloud
                PointCloud MyCloud = new PointCloud();
                /// Get Total Count Fraction to calculate Operation Percentage.
                double totc = (double)1 / GlobalCloud.Count;

                /// Initialize Partial Dictionary Lists
                List <double>[] MyDict = new List <double> [GlobalCloud.UserDictionary.Count];
                //Get Dictionary Values from PointCloud
                List <double[]> GlobalDict = new List <double[]>();
                GlobalDict.Clear();

                if (GlobalCloud.UserDictionary.Count > 0)
                {
                    Dict_Utils.Initialize_Dictionary(ref GlobalDict, ref MyDict, GlobalCloud);
                    //Loop over individual RangePartitions per processor.
                    for (int i = rng.Item1; i < rng.Item2; i++)
                    {
                        //Operation Percentage Report
                        ///Safe Counter Increment.
                        Interlocked.Increment(ref PointCounter);
                        ///Calculate and Report Percentage.
                        if (LastPercentReported < ((PointCounter * totc) * 100))
                        {
                            LastPercentReported = (int)(5 * Math.Ceiling((double)(PointCounter * totc) * 20));
                            this.ReportPercent  = LastPercentReported;
                        }

                        //
                        if (insV_InsideBool)
                        {
                            for (int j = 0; j <= insV_Box.Count - 1; j += 1)
                            {
                                PointCloudItem GlobalCloudItem = GlobalCloud[i];
                                if (Math_Utils.IsInBox(GlobalCloudItem.Location, insV_Box[j]))
                                {
                                    Cloud_Utils.AddItem_FromOtherCloud(ref MyCloud, GlobalCloud, i);
                                    Dict_Utils.AddItem_FromGlobalDict(ref MyDict, GlobalDict, i);
                                    break; // TODO: might not be correct. Was : Exit For
                                }
                            }
                        }
                        else
                        {
                            List <Boolean> CropBools       = new List <Boolean>();
                            PointCloudItem GlobalCloudItem = GlobalCloud[i];
                            for (int j = 0; j <= insV_Box.Count - 1; j += 1)
                            {
                                CropBools.Add(Math_Utils.IsInBox(GlobalCloudItem.Location, insV_Box[j]));
                            }
                            bool Crop = !CropBools.Any(x => x == true);

                            if (Crop)
                            {
                                Cloud_Utils.AddItem_FromOtherCloud(ref MyCloud, GlobalCloud, i);
                                Dict_Utils.AddItem_FromGlobalDict(ref MyDict, GlobalDict, i);
                            }
                        }
                    }
                }
                else
                {
                    //Loop over individual RangePartitions per processor.
                    for (int i = rng.Item1; i < rng.Item2; i++)
                    {
                        //Operation Percentage Report
                        ///Safe Counter Increment.
                        Interlocked.Increment(ref PointCounter);
                        ///Calculate and Report Percentage.
                        if (LastPercentReported < ((PointCounter * totc) * 100))
                        {
                            LastPercentReported = (int)(5 * Math.Ceiling((double)(PointCounter * totc) * 20));
                            this.ReportPercent  = LastPercentReported;
                        }

                        //
                        if (insV_InsideBool)
                        {
                            for (int j = 0; j <= insV_Box.Count - 1; j += 1)
                            {
                                PointCloudItem GlobalCloudItem = GlobalCloud[i];
                                if (Math_Utils.IsInBox(GlobalCloudItem.Location, insV_Box[j]))
                                {
                                    Cloud_Utils.AddItem_FromOtherCloud(ref MyCloud, GlobalCloud, i);
                                    break; // TODO: might not be correct. Was : Exit For
                                }
                            }
                        }
                        else
                        {
                            List <Boolean> CropBools       = new List <Boolean>();
                            PointCloudItem GlobalCloudItem = GlobalCloud[i];
                            for (int j = 0; j <= insV_Box.Count - 1; j += 1)
                            {
                                CropBools.Add(Math_Utils.IsInBox(GlobalCloudItem.Location, insV_Box[j]));
                            }
                            bool Crop = !CropBools.Any(x => x == true);

                            if (Crop)
                            {
                                Cloud_Utils.AddItem_FromOtherCloud(ref MyCloud, GlobalCloud, i);
                            }
                        }
                    }
                }
                //Set DictPieces.
                if (GlobalCloud.UserDictionary.Count > 0)
                {
                    DictPieces[(int)MyIndex] = MyDict;
                }

                //Add MyCloud to CloudPieces at ProcesserIndex.
                CloudPieces[(int)MyIndex] = MyCloud;

                //Enable Parrallel Computing Cancellation
                po.CancellationToken.ThrowIfCancellationRequested();
            }
                             );



            //Merge PointCloud Pieces into One PointCloud.
            Cloud_Utils.MergeClouds(ref NewCloud, CloudPieces);

            if (GlobalCloud.UserDictionary.Count > 0)
            {
                List <double>[] NewDict = new List <double> [GlobalCloud.UserDictionary.Count];
                Dict_Utils.Merge_DictPieces(ref NewDict, DictPieces);
                Dict_Utils.SetUserDict_FromDictLists(ref NewCloud, NewDict, GlobalCloud.UserDictionary.Keys);
            }

            //Dispose of Global Clouds.
            GlobalCloud.Dispose();
            pointCloud.Dispose();

            //Set OutputCloud
            pointCloud = (PointCloud)NewCloud.Duplicate();

            //Dispose of PointCloud Pieces and NewCloud.
            CloudPieces = null;
            DictPieces  = null;
            NewCloud.Dispose();


            //Return True on Finish
            return(true);
        }