public bool BuildKDTree_Rednaxela(PointCloudVertices target) { GlobalVariables.ResetTime(); ResetVerticesLists(target); try { KdTree_Rednaxela = new KDTreeRednaxela.KDTree_Rednaxela <EllipseWrapper>(3); for (int i = 0; i < target.Count; ++i) { Vertex p = target[i]; KdTree_Rednaxela.AddPoint(new float[] { Convert.ToSingle(p.Vector.X), Convert.ToSingle(p.Vector.Y), Convert.ToSingle(p.Vector.Z) }, new EllipseWrapper(p)); } } catch (Exception err) { MessageBox.Show("Error building kd-tree " + err.Message); return(false); } GlobalVariables.ShowLastTimeSpan("Build Tree Rednaxela - Number of points: " + target.Count.ToString() + " : "); return(true); }
public bool BuildKDTree_Stark(PointCloudVertices target) { GlobalVariables.ResetTime(); KdTree_Stark = KDTree_Stark.Build(target); GlobalVariables.ShowLastTimeSpan("Build Tree Stark"); return(true); }
public void FindNearest_NormalsCheck_Rednaxela(PointCloudVertices pointCloud, bool normalsCheck) { PointCloudVertices nearestNeighbours = new PointCloudVertices(); //for (int i = pointCloud.Count - 1; i >= 0; i--) for (int i = 0; i < pointCloud.Count; i++) { Vertex vSource = pointCloud[i]; // Perform a nearest neighbour search around that point. KDTreeRednaxela.NearestNeighbour <EllipseWrapper> nearestNeighbor = null; if (normalsCheck) { nearestNeighbor = KdTree_Rednaxela.FindNearest_EuclidDistance(new float[] { Convert.ToSingle(vSource.Vector.X), Convert.ToSingle(vSource.Vector.Y), Convert.ToSingle(vSource.Vector.Z) }, NumberOfNeighboursToSearch + 1, -1); } else { nearestNeighbor = KdTree_Rednaxela.FindNearest_EuclidDistance(new float[] { Convert.ToSingle(vSource.Vector.X), Convert.ToSingle(vSource.Vector.Y), Convert.ToSingle(vSource.Vector.Z) }, NumberOfNeighboursToSearch, -1); } while (nearestNeighbor.MoveNext()) { EllipseWrapper wr = nearestNeighbor.CurrentPoint; Vertex vTarget = wr.Vertex; if (vSource != vTarget) { if (!vSource.KDTreeSearch.Contains(vTarget.IndexInModel)) { if (!vTarget.TakenInTree) { vTarget.TakenInTree = true; KeyValuePair <int, float> el = new KeyValuePair <int, float>(vTarget.IndexInModel, nearestNeighbor.CurrentDistance); vSource.KDTreeSearch.Add(el); break; } } if ((vSource.KDTreeSearch.Count) >= 1) { break; } } } //if (vSource.KDTreeSearch.Count == 0) //{ // System.Windows.Forms.MessageBox.Show("Error in finding neighbour for index " + i.ToString()); //} } if (KdTree_Rednaxela.pLeft != null) { SetRecursive(KdTree_Rednaxela.pLeft); } if (KdTree_Rednaxela.pRight != null) { SetRecursive(KdTree_Rednaxela.pRight); } GlobalVariables.ShowLastTimeSpan("Find neighbours"); //RemoveAllVerticesBasedOnRadius(pointCloud); }