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