Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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);
        }