用户在Boost几何中定义空间谓词

时间:2015-04-14 23:06:57

标签: c++ boost boost-geometry

我需要确定两个几何的内部是否相交。 InteriorsIntersect谓词不是由OGC或Boost Geometry指定的,而是由DE-9IM矩阵(see also)定义的:

T * *
* * *
* * *

我使用Boost Geometry中的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);
}

这很有效。我唯一担心的是relate函数和static_mask类型没有被记录为Boost几何API的一部分,并且据我所知是实现细节。以这种方式使用relate是否安全?是否有使用Boost Geometry实现相同目标的替代方案?理想情况下,我希望relate中的boost/geometry/algorithms成为算法。

1 个答案:

答案 0 :(得分:1)

计划在Boost 1.59中发布relate()relation()函数。界面与问题中提到的界面完全不同:

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