コード例 #1
0
ファイル: KDTreeVertex.cs プロジェクト: 0000duck/IM-Solutions
        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);
        }
コード例 #2
0
        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);
        }