/// <summary> /// colors and indices are lost!! /// </summary> /// <param name="pc"></param> /// <returns></returns> public static PointCloud ResizeAndSort_XYZ(PointCloud pc) { pc.ResizeTo1(); List <Vector3> listSource = pc.ListVectors; listSource.Sort(new Vector3_XYZ()); PointCloud pcNew = PointCloud.FromListVector3(listSource); return(pcNew); }
public static PointCloud CreateSomePoints() { float[] origin = { 0.0f, 0.0f, 0.0f }; List <Vector3> list = new List <Vector3>(); list.Add(new Vector3(100, 0, 0)); list.Add(new Vector3(0, 100, 0)); list.Add(new Vector3(0, 0, 100)); return(PointCloud.FromListVector3(list)); }
public static Matrix3 Rotation_ToOriginAxes(this Matrix3 mat, PointCloud cloudOrigin) { List <Vector3> list = new List <Vector3>(); list.Add(new Vector3(1, 0, 0)); list.Add(new Vector3(0, 1, 0)); list.Add(new Vector3(0, 0, 1)); PointCloud target = PointCloud.FromListVector3(list); return(mat.RotationCoordinateChange(cloudOrigin, target)); }
private List <Vector3> TransformPointsAfterPCA(List <Vector3> listVector3) { PointCloud pc = PointCloud.FromListVector3(listVector3); List <Vector3> listResult = PointCloud.CloneAll(pc).ListVectors; Matrix3 R = Matrix3.Mult(U, VT); listResult = TransformPoints(listResult, R); return(listResult); }
public PointCloud CalculatePCA(PointCloud pointsSource, int eigenvectorUsed) { List <Vector3> Vector3Source = pointsSource.ListVectors; Centroid = pointsSource.CentroidVector; List <Vector3> listTranslated = pointsSource.Clone().ListVectors; Vector3Source.SubtractVector(Centroid); SVD_ForListVectorsMassCentered(listTranslated, false); List <Vector3> vectors = GetResultOfEigenvector(eigenvectorUsed, listTranslated); return(PointCloud.FromListVector3(Vector3Source)); }
public static PointCloud SubtractVector(PointCloud pointCloud, Vector3 centroid) { List <Vector3> list = new List <Vector3>(); //List<Vector3> colors = new List<Vector3>(); for (int i = 0; i < pointCloud.Vectors.Length; i++) { Vector3 v = pointCloud.Vectors[i]; Vector3 translatedV = Vector3.Subtract(v, centroid); v = translatedV; list.Add(v); } PointCloud pc = PointCloud.FromListVector3(list); pc.Colors = pointCloud.Colors; pc.Indices = pointCloud.Indices; return(pc); }
public static PointCloud CreateCuboid(float u, float v, int numberOfPoints) { List <Vector3> points = new List <Vector3>(); float v0 = 0f; for (int i = 0; i < numberOfPoints; i++) { points.Add(new Vector3(0, v0, 0)); points.Add(new Vector3(0, v0, u)); points.Add(new Vector3(u, v0, u)); points.Add(new Vector3(u, v0, 0)); v0 += v / numberOfPoints; } return(PointCloud.FromListVector3(points)); }
public static PointCloud ExtractPoints(PointCloud points, List <int> indices) { try { List <Vector3> output = new List <Vector3>(); for (int i = 0; i < indices.Count; i++) { int indexPoint = indices[i]; Vector3 p = points.Vectors[indexPoint]; output.Add(p); } return(PointCloud.FromListVector3(output)); } catch (Exception err) { MessageBox.Show("Error in RandomUtils.ExtractPoints " + err.Message); return(null); } }
public static Matrix4d FindTransformationMatrix_MinimumDistance(PointCloud pointsSource, PointCloud pointsTarget, ICP_VersionUsed icpVersionUsed, float minimumDistance) { minimumDistance *= minimumDistance * 2; List <Vector3> sourceList = new List <Vector3>(); List <Vector3> targetList = new List <Vector3>(); int numberOfVectorsNotTaken = 0; for (int i = 0; i < pointsSource.Vectors.Length; i++) { float distance = pointsSource.Vectors[i].DistanceSquared(pointsTarget.Vectors[i]); if (distance < minimumDistance) { sourceList.Add(pointsSource.Vectors[i]); targetList.Add(pointsTarget.Vectors[i]); } else { numberOfVectorsNotTaken++; } } if (numberOfVectorsNotTaken > 0) { System.Diagnostics.Debug.WriteLine("Ignored vectors in SVD because too far: " + numberOfVectorsNotTaken.ToString() + " : out of : " + pointsSource.Count.ToString()); } PointCloud pSourceNew = PointCloud.FromListVector3(sourceList); PointCloud pTargetNew = PointCloud.FromListVector3(targetList); if (pSourceNew == null || pTargetNew == null) { return(Matrix4d.Identity); } return(FindTransformationMatrix(pSourceNew, pTargetNew, icpVersionUsed)); }
public static PointCloud Cube_RegularGrid_Empty(float cubeSize, int numberOfPointsPerPlane) { return(PointCloud.FromListVector3(Cube_RegularGrid_Empty_List(cubeSize, numberOfPointsPerPlane))); }