Example #1
0
        public static void Rotate(PointCloud pointCloud, Matrix3 R)
        {
            pointCloud.Rotate(R);

            //List<Vector3> listVectors = new List<Vector3>(pointCloud.Vectors);

            //PointCloud.RotateVectors(listVectors, R);
            //PointCloud.AssignNewVectorList(pointCloud, listVectors);
        }
Example #2
0
        public static void ScaleByVector(PointCloud pc, Vector3 v)
        {
            Matrix3 R = Matrix3.Identity;

            R[0, 0] = v.X;
            R[1, 1] = v.Y;
            R[2, 2] = v.Z;
            pc.Rotate(R);
        }
Example #3
0
        public static void ScaleByFactor(PointCloud pc, float scale)
        {
            Vector3 scaleVector = new Vector3(scale, scale, scale);

            Matrix3 R = Matrix3.Identity;

            R[0, 0] = scaleVector[0];
            R[1, 1] = scaleVector[1];
            R[2, 2] = scaleVector[2];

            PointCloud.Rotate(pc, R);
        }
Example #4
0
        public PointCloud AlignPointClouds_OneVector(PointCloud pointCloudSource, PointCloud pointCloudTarget, int vectorNumberSource, int vectorNumberTarget)
        {
            //-------------------
            pcSourceCentered = CalculatePCA_Internal(pointCloudSource);



            //second object:
            //-----------
            pcTargetCentered = CalculatePCA_Internal(pointCloudTarget);


            //Vector3 v = TargetPCVectors[vectorNumberTarget];
            //v.X = -v.X;
            //v.Y = -v.Y;
            //v.Z = -v.Z;
            //TargetPCVectors[vectorNumberTarget] = v;


            Matrix3 R = new Matrix3();

            //R = R.RotationOneVectorToAnother(TargetPCVectors[vectorNumber], SourcePCVectors[vectorNumber]);
            R = R.RotationOneVectorToAnother(pointCloudSource.PCAAxes[vectorNumberSource].Vector, pointCloudTarget.PCAAxes[vectorNumberTarget].Vector);


            //R.CheckRotationMatrix();

            //

            //test:
            //Vector3 testV = R.MultiplyVector(sourceV);


            PointCloud pointCloudResult = PointCloud.CloneAll(pointCloudSource);

            PointCloud.SubtractVectorRef(pointCloudResult, pointCloudSource.CentroidVector);
            PointCloud.Rotate(pointCloudResult, R);
            PointCloud.AddVectorToAll(pointCloudResult, pointCloudTarget.CentroidVector);

            pcResultCentered = CalculatePCA_Internal(pointCloudResult);


            MeanDistance = PointCloud.MeanDistance(pointCloudResult, pointCloudTarget);
            System.Diagnostics.Debug.WriteLine("-->>  PCA (V) - Mean Distance : " + MeanDistance.ToString("0.000000"));



            return(pointCloudResult);
        }
Example #5
0
        ////}
        ///// <summary>
        ///// PCA are center of mass - centered
        ///// </summary>
        ///// <param name="pointCloud"></param>
        ///// <param name="myCentroid"></param>
        //private void AssignPCVectors(PointCloud pointCloud, PointCloud mypointCloudSourceCentered)
        //{
        //    pointCloud.CentroidPCA = Centroid;
        //    pointCloud.PCAAxes = new PointCloud();
        //    for (int i = 0; i < 3; i++)
        //    {
        //        Vector3 v = VT.ExtractColumn(i);
        //        //v = v * Math.Sqrt(EV[i]);
        //        v = v * EV[i];
        //        float d = v.Length;
        //        Vector3 ve = new Vector3(i, v);
        //        pointCloud.PCAAxes.Add(ve);
        //    }

        //    mypointCloudSourceCentered.PCAAxes = pointCloud.PCAAxes;


        ////}
        ////}
        ////}
        ///// <summary>
        ///// PCA are center of mass - centered
        ///// </summary>
        ///// <param name="pointCloud"></param>
        ///// <param name="myCentroid"></param>
        //private void AssignPCVectors(PointCloud pointCloud, PointCloud mypointCloudSourceCentered)
        //{
        //    pointCloud.CentroidPCA = Centroid;
        //    pointCloud.PCAAxes = new PointCloud();
        //    for (int i = 0; i < 3; i++)
        //    {
        //        Vector3 v = VT_NotNormalized.ExtractColumn(i);
        //        //v = v * Math.Sqrt(EV[i]);
        //        v = v * EV_NotNormalized[i];
        //        float d = v.Length;
        //        Vector3 ve = new Vector3(i, v);
        //        pointCloud.PCAAxes.Add(ve);
        //    }

        //    mypointCloudSourceCentered.PCAAxes = pointCloud.PCAAxes;


        //}



        private static PointCloud CalculateResults(Matrix3 Ub, Matrix3 Ua, PointCloud pointCloudSource, Vector3 centroidB, Vector3 centroidA)
        {
            Matrix3 R;

            Matrix3.Mult(ref Ub, ref Ua, out R);


            PointCloud pointCloudResult = PointCloud.CloneAll(pointCloudSource);

            PointCloud.Rotate(pointCloudResult, R);

            Vector3 t = centroidB - R.MultiplyVector(centroidA);

            //Vertices.AddVector(pointCloudResult, t);
            return(pointCloudResult);
        }
Example #6
0
        public static PointCloud RotateToOriginAxes(PointCloud mypointCloudSource)
        {
            PCA pca = new PCA();

            pca.PCA_OfPointCloud(mypointCloudSource);


            Matrix3    R = new Matrix3();
            PointCloud mypointCloudResult = PointCloud.CloneAll(mypointCloudSource);

            R = R.Rotation_ToOriginAxes(mypointCloudResult.PCAAxes);
            PointCloud.Rotate(mypointCloudResult, R);
            pca.PCA_OfPointCloud(mypointCloudResult);

            mypointCloudResult.Path = mypointCloudSource.Path;
            mypointCloudResult.Name = mypointCloudSource.Name;


            return(mypointCloudResult);
        }
Example #7
0
        public PointCloud AlignToCenter(PointCloud pointCloudSource)
        {
            pcSourceCentered = CalculatePCA_Internal(pointCloudSource);


            Matrix3 R = new Matrix3();

            R = R.RotationChangeBasis(pointCloudSource.PCAAxes.ListVectors);



            PointCloud pointCloudResult = PointCloud.CloneAll(pointCloudSource);

            PointCloud.SubtractVectorRef(pointCloudResult, pointCloudSource.CentroidVector);
            PointCloud.Rotate(pointCloudResult, R);

            pcResultCentered = CalculatePCA_Internal(pointCloudResult);



            return(pointCloudResult);
        }