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); }
/// <summary> /// resets all vectors so that there are no negative values /// </summary> /// <param name="pc"></param> public static void ResetToOriginAxis(PointCloud pc) { PointCloud.AddVectorToAll(pc, pc.BoundingBox.Min.Abs()); }