2

我正在尝试使用 Boost.Geometry 库确定一个环是否包含在另一个环中。

我写了以下代码:

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>

using namespace boost::geometry;

int main (int argc, const char * argv[])
{
    typedef model::d2::point_xy<double> P;
    model::ring<P> ring1, ring2;

    read_wkt("polygon((0 0,0 3,3 3,3 0,0 0))", ring1);
    read_wkt("polygon((1 1,1 2,2 2,2 1,1 1))", ring2);

    bool b = within(ring1, ring2);
    std::cout << "Within: " << (b ? "YES" : "NO") << std::endl;

    return 0;
}

但它无法编译(使用 Boost 1.48.0),因为它无法通过以下静态断言within

NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE

似乎within只支持检查一个点是否在另一个几何图形内(根据文档)。

我正在考虑将环视为线串,然后检查它们是否intersect,如果不是 - 检查环的第一个点是否在另一个环内;但我不知道是否可以避免将每个复制ringlinestring.

有没有办法实现withinfor two ring 的功能(性能合理)?

4

1 回答 1

3

我最终实现了我在问题中提出的想法:

using namespace boost::geometry;

template <typename Point>
bool within(const model::ring<Point>& ring1, const model::ring<Point>& ring2)
{
    return within(ring1.front(), ring2) &&
           disjoint(model::linestring<Point>(ring1.begin(), ring1.end()),
                    model::linestring<Point>(ring2.begin(), ring2.end()));
}

对我来说似乎已经足够好了,但我仍然很乐意得到一些建议。

于 2012-02-05T17:43:36.710 回答