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リングの最初のポイントが他のリング内にあるかどうかを確認します ringしかし、それぞれを a にコピーすることを避けることができるかどうかはわかりませんlinestring

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 に答える