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); }
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); }