示例#1
0
        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);
        }