Как я могу проверить, содержится ли кольцо в другом кольце, используя Boost.Geometry? - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь определить, содержится ли кольцо в другом кольце, с помощью библиотеки 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, а если нет - проверить, находится ли первая точка кольца внутри другого кольца;но я не знаю, возможно ли избежать копирования каждого ring в linestring.

Есть ли способ достичь функциональности within для двух колец (с разумной производительностью)?

1 Ответ

3 голосов
/ 05 февраля 2012

Я реализовал идею, предложенную в вопросе:

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

Кажется, для меня это достаточно хорошо, но я все равно был бы рад получить некоторые предложения.

...