///// <summary> ///// number of search result ///// </summary> ///// <param name="qv"></param> ///// <param name="r2"></param> ///// <returns></returns> //public int r_count(Vector3 qv, float r2) //{ // { // // search for all within a ball of a certain radius // ListKDTreeResultVectors result = new ListKDTreeResultVectors(); // SearchRecord sr = new SearchRecord(qv, this, result); // sr.IndexCenter = -1; // sr.correltime = 0; // sr.IndexNeighbour = 0; // sr.Ballsize = r2; // root.search(sr); // return (result.Count); // } //} public ListKDTreeResultVectors r_nearest_around_point(int idxin, int correltime, float r2) { ListKDTreeResultVectors result = new ListKDTreeResultVectors(); Vector3 qv = TreeVectors[idxin].Vector.Clone(); // query vector // copy the query vector. SearchRecord sr = new SearchRecord(qv); // construct the search record. sr.Radius = r2; sr.NumberOfNeighbours = 0; root.search(sr); //if (sort_results) //{ // result.So // sort(result.begin(), result.end()); //} return(sr.SearchResult); }
/// <summary> /// Based upon the info of the nearest vertex (of each vertex), the triangles are created /// </summary> /// <param name="myModel"></param> //private static List<Triangle> CreateTrianglesByNearestVertices(PointCloud pointCloud) //{ // List<Triangle> listTriangles = new List<Triangle>(); // //create triangles // //for (int i = pointCloud.Count - 1; i >= 0; i--) // for (int i = 0; i < pointCloud.Count; i++) // { // Vertex v = pointCloud[i]; // if (v.KDTreeSearch.Count >= 2) // { // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[0].Key, v.KDTreeSearch[1].Key, listTriangles, v); // } // if (v.KDTreeSearch.Count >= 3) // { // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[0].Key, v.KDTreeSearch[2].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[1].Key, v.KDTreeSearch[2].Key, listTriangles, v); // } // if (v.KDTreeSearch.Count >= 4) // { // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[0].Key, v.KDTreeSearch[3].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[1].Key, v.KDTreeSearch[3].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[2].Key, v.KDTreeSearch[3].Key, listTriangles, v); // } // if (v.KDTreeSearch.Count >= 5) // { // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[0].Key, v.KDTreeSearch[4].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[1].Key, v.KDTreeSearch[4].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[2].Key, v.KDTreeSearch[4].Key, listTriangles, v); // Triangle.AddTriangleToList(v.Index, v.KDTreeSearch[3].Key, v.KDTreeSearch[4].Key, listTriangles, v); // } // } // //RemoveDuplicateTriangles(listTriangles); // listTriangles.Sort(new TriangleComparer()); // return listTriangles; //} public void Triangulate_KDTree(int numberNeighbours) { KDTreeKennell kdTree = new KDTreeKennell(); kdTree.Build(this); List <Triangle> listTriangles = new List <Triangle>(); for (int i = 0; i < this.Vectors.Length; i++) { VertexKDTree vSource = new VertexKDTree(this.Vectors[i], this.Colors[i], i); uint indexI = Convert.ToUInt32(i); ListKDTreeResultVectors listResult = kdTree.Find_N_Nearest(vSource.Vector, numberNeighbours); for (int j = 1; j < listResult.Count; j++) { for (int k = j + 1; k < listResult.Count; k++) { Triangle t = new Triangle(indexI, listResult[j].IndexNeighbour, listResult[k].IndexNeighbour); listTriangles.Add(t); } } } this.Triangles = listTriangles; CreateIndicesFromTriangles(); }
/// <summary> /// FInd the closest matching point using a full For-loop search: O(n) /// </summary> /// <param name="vertex">Vertex to match</param> /// <param name="nearest_index">Index of matching vertex in the KDTree vertex array</param> /// <returns>Nearest matching vertex</returns> public VertexKDTree FindClosestPoint(VertexKDTree vertex, ref float nearestDistance, ref int nearest_index) { VertexKDTree v = new VertexKDTree(); ListKDTreeResultVectors listResult = Find_N_Nearest(vertex.Vector, 1); if (listResult != null && listResult.Count > 0) { nearest_index = Convert.ToInt32(listResult[0].IndexNeighbour); nearestDistance = listResult[0].Distance; v = this.TreeVectors[Convert.ToInt32(listResult[0].IndexNeighbour)]; } return(v); }
public void FindClosestPoints_Radius(VertexKDTree vertex, float radius, ref int neighboursCount) { // search for all within a ball of a certain radius //ListKDTreeResultVectors result = new ListKDTreeResultVectors(); SearchRecord sr = new SearchRecord(vertex.Vector); // Vector3 vdiff = new Vector3(); sr.Radius = radius; root.search(sr); ListKDTreeResultVectors listResult = sr.SearchResult; neighboursCount = listResult.Count; }
public static void StandardDeviation(PointCloud source, int numberOfNeighbours, out float meanDistance, out float standardDeviation, out float[] distances) { meanDistance = 0; standardDeviation = 0f; distances = new float[source.Count]; KDTreeKennell kdTree = new KDTreeKennell(); kdTree.Build(source); PointCloud pcResult = new PointCloud(); VertexKDTree[] resultArray = new VertexKDTree[source.Count]; VertexKDTree[] outliers = new VertexKDTree[source.Count]; try { List <Vector3> listV = new List <Vector3>(); List <Vector3> listC = new List <Vector3>(); //1. mean distance of one point to his next "numberOfNeighbours" neighbours - stored in the "distances" array for (int i = 0; i < source.Count; i++) { VertexKDTree vSource = new VertexKDTree(source.Vectors[i], source.Colors[i], i); ListKDTreeResultVectors listResult = kdTree.Find_N_Nearest(vSource.Vector, numberOfNeighbours); float distSum = 0f; for (int k = 1; k < listResult.Count; ++k) // k = 0 is the query point { distSum += listResult[k].Distance; } distances[i] = (distSum / (listResult.Count - 1)); } //2. calculate the mean distance of ALL points for (int i = 0; i < distances.Length; ++i) { meanDistance += distances[i]; } meanDistance /= distances.Length; //3. calculate the deviation of each data point from the mean, and square the result of each for (int i = 0; i < distances.Length; i++) { float dev = distances[i] - meanDistance; dev *= dev; standardDeviation += dev; } standardDeviation /= distances.Length; standardDeviation = Convert.ToSingle(Math.Sqrt(standardDeviation)); } catch (Exception err) { System.Windows.Forms.MessageBox.Show("Error in KDTreeKennnellRemoveDuplicates: " + err.Message); } }