2012-02-03 5 views
2

私はBoost.Geometryライブラリを使って別のリングにリングが含まれているかどうかを調べようとしています。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; 
} 

をしかし、それはwithinの静的なアサーションを失敗したので、それは、(ブースト1.48.0で)コンパイルされません:

NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE 

それはwithinようですポイントが別のジオメトリ(documentationによる)内にあるかどうかのチェックのみをサポートします。

私はリングを線ストリングとして扱い、次にintersectかどうかをチェックし、そうでない場合は、リングの最初の点が他のリング内にあるかどうかを確認します。それぞれringlinestringにコピーすることを避けることができるかどうかはわかりません。

withinの機能を2つのリング(妥当なパフォーマンス)で実現する方法はありますか?

+0

"リング"は正しい単語ですか?これらの形は、より正方形に見えます。 –

+0

"リング"は本質的に閉じたジオメトリ(ポリゴンのような)ですが、 "穴"はありません。これらの図形は実際には正方形です。 –

+0

私は彼らが実際に "線形のリング"を短縮するように言います、あなたは正しい - これらはリングではありません。 –

答えて

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

は私のために十分に思えるが、私はまだいくつかの提案を得るために喜んでいると思いますが。

関連する問題