2015-04-14 2 views
1

Мне нужно определить, пересекаются ли интерьеры двух геометрий. InteriorsIntersect предикат не определен ГОС или Boost, геометрии, а определяется матрицей DE-9IM (see also):Определенный пользователем пространственный предикат в пределах геометрии Boost

T * * 
* * * 
* * * 

я создал свой собственный предикат, используя relate функцию Boost, геометрии.

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); 
} 

Это прекрасно работает. Моя единственная проблема заключается в том, что функция relate и тип static_mask не документированы как часть API геометрии Boost и являются деталями реализации, насколько я могу судить. Безопасно ли использовать relate таким образом? Есть ли альтернатива достижению той же цели с использованием Boost Geometry? В идеале я бы хотел, чтобы relate был алгоритмом в пределах boost/geometry/algorithms.

ответ

1

В версии Boost 1.59 планируется выпуск функций relate() и relation(). Интерфейс 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); 
Смежные вопросы