2015-04-14 48 views
1

我需要確定兩個幾何體的內部是否相交。一個InteriorsIntersect謂語不被OGC或升壓幾何規定,而是由DE-9IM矩陣(see also)定義:Boost幾何體內用戶定義的空間謂詞

T * * 
* * * 
* * * 

我已經使用升壓幾何的relate功能創建了自己的謂語。

namespace bgr = boost::geometry::detail::relate; 
using InteriorsIntersectMask = bgr::static_mask<'T','*','*','*','*','*','*','*','*'>; 

template<typename Geom1, typename Geom2> 
inline bool interiorsIntersect(const Geom1& geom1, const Geom2& geom2) 
{ 
    return bgr::relate<InteriorsIntersectMask>(geom1, geom2); 
} 

This works great。我唯一擔心的是relate函數和static_mask類型沒有作爲Boost Geometry API的一部分記錄下來,並且就我所知道的實現細節而言。以這種方式使用relate安全嗎?使用Boost幾何實現相同的目標是否有其他選擇?理想情況下,我希望relateboost/geometry/algorithms內的算法。

回答

1

relate()relation()函數計劃在Boost 1.59中發佈。接口比在問題中提到的一個silghtly不同:

namespace bg = boost::geometry; 
using II = bg::de9im::static_mask<'T','*','*','*','*','*','*','*','*'>; 
bool check1 = bg::relate(geom1, geom2, II()); 

bg::de9im::mask ii("T********"); 
bool check2 = bg::relate(geom1, geom2, ii); 

bg::de9im::matrix m = bg::relation(geom1, geom2); 
std::cout << m.str(); 

也可以通過更加複雜的面具:

bg::de9im::mask ii1("1********"); 
bg::de9im::mask ii2("2********"); 
// check if the intersection of interiors is linear or areal 
bool check2 = bg::relate(geom1, geom2, ii1 || ii2);