Example #1
0
        /// <summary>
        /// colors and indices are lost!!
        /// </summary>
        /// <param name="pc"></param>
        /// <returns></returns>
        public static PointCloud ResizeAndSort_XYZ(PointCloud pc)
        {
            pc.ResizeTo1();
            List <Vector3> listSource = pc.ListVectors;

            listSource.Sort(new Vector3_XYZ());

            PointCloud pcNew = PointCloud.FromListVector3(listSource);

            return(pcNew);
        }
Example #2
0
        public static PointCloud CreateSomePoints()
        {
            float[]        origin = { 0.0f, 0.0f, 0.0f };
            List <Vector3> list   = new List <Vector3>();

            list.Add(new Vector3(100, 0, 0));
            list.Add(new Vector3(0, 100, 0));
            list.Add(new Vector3(0, 0, 100));

            return(PointCloud.FromListVector3(list));
        }
Example #3
0
        public static Matrix3 Rotation_ToOriginAxes(this Matrix3 mat, PointCloud cloudOrigin)
        {
            List <Vector3> list = new List <Vector3>();

            list.Add(new Vector3(1, 0, 0));
            list.Add(new Vector3(0, 1, 0));
            list.Add(new Vector3(0, 0, 1));

            PointCloud target = PointCloud.FromListVector3(list);

            return(mat.RotationCoordinateChange(cloudOrigin, target));
        }
Example #4
0
        private List <Vector3> TransformPointsAfterPCA(List <Vector3> listVector3)
        {
            PointCloud     pc         = PointCloud.FromListVector3(listVector3);
            List <Vector3> listResult = PointCloud.CloneAll(pc).ListVectors;


            Matrix3 R = Matrix3.Mult(U, VT);

            listResult = TransformPoints(listResult, R);

            return(listResult);
        }
Example #5
0
        public PointCloud CalculatePCA(PointCloud pointsSource, int eigenvectorUsed)
        {
            List <Vector3> Vector3Source = pointsSource.ListVectors;

            Centroid = pointsSource.CentroidVector;

            List <Vector3> listTranslated = pointsSource.Clone().ListVectors;

            Vector3Source.SubtractVector(Centroid);

            SVD_ForListVectorsMassCentered(listTranslated, false);
            List <Vector3> vectors = GetResultOfEigenvector(eigenvectorUsed, listTranslated);

            return(PointCloud.FromListVector3(Vector3Source));
        }
Example #6
0
        public static PointCloud SubtractVector(PointCloud pointCloud, Vector3 centroid)
        {
            List <Vector3> list = new List <Vector3>();

            //List<Vector3> colors = new List<Vector3>();

            for (int i = 0; i < pointCloud.Vectors.Length; i++)
            {
                Vector3 v           = pointCloud.Vectors[i];
                Vector3 translatedV = Vector3.Subtract(v, centroid);
                v = translatedV;
                list.Add(v);
            }
            PointCloud pc = PointCloud.FromListVector3(list);

            pc.Colors  = pointCloud.Colors;
            pc.Indices = pointCloud.Indices;
            return(pc);
        }
Example #7
0
        public static PointCloud CreateCuboid(float u, float v, int numberOfPoints)
        {
            List <Vector3> points = new List <Vector3>();
            float          v0     = 0f;

            for (int i = 0; i < numberOfPoints; i++)
            {
                points.Add(new Vector3(0, v0, 0));

                points.Add(new Vector3(0, v0, u));

                points.Add(new Vector3(u, v0, u));

                points.Add(new Vector3(u, v0, 0));

                v0 += v / numberOfPoints;
            }

            return(PointCloud.FromListVector3(points));
        }
Example #8
0
        public static PointCloud ExtractPoints(PointCloud points, List <int> indices)
        {
            try
            {
                List <Vector3> output = new List <Vector3>();

                for (int i = 0; i < indices.Count; i++)
                {
                    int     indexPoint = indices[i];
                    Vector3 p          = points.Vectors[indexPoint];
                    output.Add(p);
                }
                return(PointCloud.FromListVector3(output));
            }
            catch (Exception err)
            {
                MessageBox.Show("Error in RandomUtils.ExtractPoints " + err.Message);
                return(null);
            }
        }
Example #9
0
        public static Matrix4d FindTransformationMatrix_MinimumDistance(PointCloud pointsSource, PointCloud pointsTarget, ICP_VersionUsed icpVersionUsed, float minimumDistance)
        {
            minimumDistance *= minimumDistance * 2;
            List <Vector3> sourceList = new List <Vector3>();
            List <Vector3> targetList = new List <Vector3>();

            int numberOfVectorsNotTaken = 0;

            for (int i = 0; i < pointsSource.Vectors.Length; i++)
            {
                float distance = pointsSource.Vectors[i].DistanceSquared(pointsTarget.Vectors[i]);
                if (distance < minimumDistance)
                {
                    sourceList.Add(pointsSource.Vectors[i]);
                    targetList.Add(pointsTarget.Vectors[i]);
                }
                else
                {
                    numberOfVectorsNotTaken++;
                }
            }

            if (numberOfVectorsNotTaken > 0)
            {
                System.Diagnostics.Debug.WriteLine("Ignored vectors in SVD because too far: " + numberOfVectorsNotTaken.ToString() + " :  out of : " + pointsSource.Count.ToString());
            }



            PointCloud pSourceNew = PointCloud.FromListVector3(sourceList);
            PointCloud pTargetNew = PointCloud.FromListVector3(targetList);

            if (pSourceNew == null || pTargetNew == null)
            {
                return(Matrix4d.Identity);
            }

            return(FindTransformationMatrix(pSourceNew, pTargetNew, icpVersionUsed));
        }
Example #10
0
 public static PointCloud Cube_RegularGrid_Empty(float cubeSize, int numberOfPointsPerPlane)
 {
     return(PointCloud.FromListVector3(Cube_RegularGrid_Empty_List(cubeSize, numberOfPointsPerPlane)));
 }