2013-10-21 84 views
0

我使用boost :: geometry庫編寫了一個函數,該函數給出了先前定義的多邊形的直徑。Boost :: Geometry如何獲取多邊形內點的座標?

該直徑被定義爲其兩個點之間的最大距離。因此,我編寫了一個雙循環計算每對點的每個距離,但我不知道如何訪問多邊形內的點座標,甚至點對象,然後使用兩點之間的距離函數由圖書館(順便說一下,哪一個應該更快?)。

看着Boost docs on polygon後,我試圖my_polygon.PointList沒有成功...

我在最後的解決辦法是使用副把提案的修改版本:

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly)); 
    ++it1) 
{ 
    for(auto it2 = it1+1; 
     it2 != boost::end(boost::geometry::exterior_ring(poly)); 
     ++it2) 
    { 
     double distance = boost::geometry::distance(*it1, *it2); 
     if(my_diameter < distance){my_diameter = distance;} 
    } 
} 

我只是抑制的冗餘兩次計算相同的距離;

回答

3

多邊形由環組成。你想要有外環(外環)。這是可訪問的使用exterior_ring(aPolygon);

所以,你可以使用這樣的代碼來遍歷一個多邊形的點(簡單起見,我用汽車,否則聲明一個迭代):

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly)); 
    ++it1) 
{ 
    for(auto it2 = boost::begin(boost::geometry::exterior_ring(poly)); 
     it2 != boost::end(boost::geometry::exterior_ring(poly)); 
     ++it2) 
    { 
     // You might skip cases where it1==it2, distance is zero anyway 
     double distance = boost::geometry::distance(*it1, *it2); 
     // Compare with a max distance, if larger, assign, etc. 
    } 
} 

(循環往往也環比內環,但如果多邊形定義良好,則不需要直徑)。

順便說一下,關於您的問題:PointList是模板參數的名稱(請參閱doc)。成員函數是outer(),用於外環。上面的代碼使用了一個自由函數「exterior_ring」來使用多邊形概念,它應該適用於Boost.Geometry中的任何多邊形類型。

+0

謝謝你的例子,我只是試了一下,它絕對有效,雖然我不明白這個環的概念,但更重要的是,我仍然在尋找一些更優化的東西:對於N點多邊形,你的循環我只需要N(N-1)/ 2來計算距離(case it1 = it2無關和雙重計數),我可以通過使用outer()函數來訪問這些點嗎? – Liam

0

由於兩個「拐角」之間的最大距離是兩個「拐角」之間的距離,因此您只能檢查彼此的「拐角」距離。

只用一點「A」和一個細分考慮它。你會發現無論你如何放置段,距離A最遠的段的點將成爲兩端之一。

順便問一下,每點?在什麼粒度?其中無限多!

+0

我只查看構成多邊形的點的有限集合。不是它內部的無限多的點。 – Liam

+0

你的意思是你只是檢查角落?因爲你真的不需要檢查任何其他點。 – 2013-10-21 15:03:06

+1

然後你的雙循環就像j(對於i> j(...)))。對n + 1個角進行周圍(n^2 + n)/ 2距離計算。 – 2013-10-21 15:05:14

相關問題