2013-11-04 98 views
0

我在boost :: geometry中有多個多邊形,並且想從一個與第一個多邊形具有最長公共邊界的多邊形中找到特定的鄰居。多邊形正好互相接觸,從而boost::geometry::disjoint返回false,但下面的代碼總是返回周長0:如何在boost :: geometry中找到2個多邊形的觸摸長度?

typedef boost::geometry::model::d2::point_xy<double>  boost_pnt; 
typedef boost::geometry::model::polygon<boost_pnt>  boost_poly; 

boost_poly otherPol = ...; 
boost_poly thisPol = ...; 

if(! boost::geometry::intersection(thisPol, otherPol, out)) 
    return -1; 

float perimeter = 0; 
BOOST_FOREACH(boost_poly const& p, out) 
{ 
    perimeter += boost::geometry::perimeter(p); 
} 
return perimeter; 

我如何才能找到共同的「邊界」,這兩個多邊形的接觸長度是多少?

回答

1

我不是一個mathemetician,我不知道boost :: geometry庫,所以我應該給這一個鏡頭。 :-)

你需要在多邊形1每條線段所以在每個比較,我們有兩個線段,A和B

首先比較每一線段在多邊形2,我比較單元兩條線段的向量,如果它們相等,或者完全相反,則這些線是平行的。

如果這些線是平行的,我會採用由A點中的一個點和B中的一個點定義的線段(無論哪種情況都無關緊要),並計算其單位向量。如果該單位矢量與上述單位矢量相等(或與之完全相反),則線段在同一無限長線上。

如果是這種情況,我們可以很容易地找到線段中的哪些(如果有的話)端點位於另一個端點內。即:如果A.point1向上且在B.point1和B.point2的左側向上且在A.point1的左側,則A.point1位於線段B上(幫助繪製它)。

請注意,1條線段可能完全位於另一條線內 - 因此,如果A完全位於B內,則B將不具有位於A內的終點。在A完全位於B內的情況下,共享這些段的邊界當然是A的長度

否則找到所述的一個點和在B中的點之間的最大長度,並且減去來自A的長度之和和B.

boost :: geomettry中的任何幫助功能,您都應該使用! :-)

(請注意,我說:「等於」了不少,我們當然會處理浮點運算,從而平等是一個稍微靈活的術語。)

+0

由於似乎沒有預定義的解決方案,我不得不建立自己的。謝謝你的幫助。好的靈感。 –

+0

@REDSOFTADAIR我很確定我已經用數學方法確定了這一點,是不是值得接受? :-) –

+0

我給了你一個投票。我仍然想知道是否有人直接在boost :: geometry中解決了這個問題。這是我的問題。 –

0

我相信情況下,多邊形觸摸但不重疊操作geometry::intersection將在out中生成一個空容器,雖然仍會返回true。這實質上是觸摸的定義:不是內部交叉。

由於Boost.Geometry適用於室內設計,因此您無法從中獲得更多收益。

你真正想要的是將你的多邊形視爲庫CGAL定義爲Nef polygons。 CGAL提供了一個API,它允許你獲得Nef多邊形作爲兩個Nef多邊形的交集。在操作數觸及的情況下,結果將是多折線。

但不要屏住呼吸,Nef操作速度較慢,API比Boost.Geometry更復雜;您可能會通過自己實現該功能獲得更好的結果。

相關問題