public PointCloudVertices NearestPointIndices_Stark(PointCloudVertices source) { KdTree_Stark.ResetSearch(); PointCloudVertices result = new PointCloudVertices(); PointCloudVertices sourceTemp = source; List <int> indicesTargetFound = new List <int>(); for (int i = sourceTemp.Count - 1; i >= 0; i--) { Vertex v = sourceTemp[i]; //tempList.RemoveAt(i); int neighboursFound = 0; v.KDTreeSearch.Clear(); for (int j = 0; j < NumberOfNeighboursToSearch; j++) { int indexNearest = KdTree_Stark.FindNearest(sourceTemp[i]); if (!v.KDTreeSearch.Contains(indexNearest)) { KDTree_Stark.LatestSearchResults.Sort(new KeyValueComparer()); neighboursFound++; KeyValuePair <int, float> res = KDTree_Stark.LatestSearchResults[0]; //check if the index is right v.KDTreeSearch.Add(res); } if ((neighboursFound + 1) > NumberOfNeighboursToSearch) { break; } } } return(result); }
public List <Vertex> FindNearest_Stark(List <Vertex> source, List <Vertex> target) { KdTree_Stark.ResetSearch(); List <Vertex> result = new List <Vertex>(); List <int> indicesTargetFound = new List <int>(); for (int i = source.Count - 1; i >= 0; i--) //for (int i = 0; i < source.Count ; i ++) { int indexNearest = KdTree_Stark.FindNearest(source[i]); //result.Add(target[indexNearest]); if (!indicesTargetFound.Contains(indexNearest)) { indicesTargetFound.Add(indexNearest); result.Add(target[indexNearest]); } else { bool bfound = false; for (int j = 0; j < KDTree_Stark.LatestSearchResults.Count; j++) { int newIndex = KDTree_Stark.LatestSearchResults[j].Key; if (!indicesTargetFound.Contains(newIndex)) { bfound = true; indicesTargetFound.Add(newIndex); result.Add(target[newIndex]); break; } } if (!bfound) { source.RemoveAt(i); } } } return(result); }