public PointCloudVertices FindNearest_Stark(PointCloudVertices source, PointCloudVertices target) { KdTree_Stark.ResetSearch(); PointCloudVertices result = new PointCloudVertices(); List <int> pointsFound = new List <int>(); List <List <int> > searchdoubleList = new List <List <int> >(3); for (int i = source.Count - 1; i >= 0; i--) //for (int i = 0; i < source.Count ; i ++) { //int indexNearest = KdTree_Stark.FindNearest(source[i]); int indexNearest = KdTree_Stark.FindNearestAdapted(source[i], pointsFound); //result.Add(target[indexNearest]); if (!pointsFound.Contains(indexNearest)) { pointsFound.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 (!pointsFound.Contains(newIndex)) { bfound = true; pointsFound.Add(newIndex); result.Add(target[newIndex]); break; } } if (!bfound) { source.RemoveAt(i); } } } 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); }