2012-11-27 42 views
1

我已經創建了一個結構和填充了可被認爲是在x和y z平面座標,或一個變量數組作爲從點3點的尺寸的距離。搜索具有類似性質的數據在結構

for (a=1; a<=lst; a++) { 
for (b=1; b<=hst; b++) {  
     for (c=1; c<=wst; c++) { 

    point[d].x=a*k+px; 
    point[d].y=b*k+py; 
    point[d].z=c*k+pz; 
    d++; 

    } 
    } 
} 

變量px ...是作爲隨機添加的一部分通用k,使一個較少的「剛性」立方體。我想在循環的迭代中確定在選定「點」的給定半徑內的「點」,該循環的運行次數與點的次數相同。然而,我想這樣做而不用運行一個循環來檢查point [num]數組中的每一個點,看它是否接近。有沒有什麼我可以做,以避免這一點,而不是做一個基於point [num]數組中點的順序的檢查?

+1

如果你點[]是在一些分類軸,您可以使用二進制搜索之前,還剩下些什麼,通過所有的點要迅速減少搜索範圍。 – Billiska

+0

是的,減少搜索範圍正是我需要的。我會考慮它 – straits

+0

但是我試圖避免使用基於這樣一個點在座標 – straits

回答

2

我可以看到兩個很好的方法來做到這一點。

  1. 如果你正在尋找的點是一些有序的軸向排列的網格,那麼你就可以訪問立即在某一半徑的人。做到這一點的方法是獲取x,y,z點並將其轉換爲其網格位置以及半徑以定義x,y和z的最小和最大網格位置。然後您可以立即訪問這些變量。

  2. 如果分不中,這不是軸向對準並下令成網格形式,那麼你需要把它inot,這將是快速搜索方式。我會建議kd樹。它需要從O(n)O(log(n)的搜索操作。它做它的方式是劈成兩半沿平均值設定點和重複,直到你有一個快速搜索的樹:對於

enter image description here

的PCL(點雲中圖書館)將做到這一點你以及!

這裏是一個鏈接:

http://pointclouds.org/

和教程上KD樹木PCL:

http://pointclouds.org/documentation/tutorials/kdtree_search.php#kdtree-search

事實上,它甚至可以顯示你從一個半徑搜索代碼進入一個kd樹存儲點雲。看看我所提供的指南頁面,在半徑搜索鄰居。

祝你好運!