2016-12-06 5 views
1

ポリゴンが軸合わせボックス "POLYGON((0 0,1,0,1 1,0 1))"である場合、union_()は正しい結果を出力せず、空の出力のみを返します。実際には、ポリゴンのunion_()は空であってはいけません。boost :: geometry :: union_がaxis-aligned-boxの結果を返すことができないのはなぜですか?

ポリゴングリーンを軸調整ボックスから "POLYGON((2 1.3.2.4 1.7,2.8 1.8))"に変更すると、意味のある出力(空ではない)が表示されます。

これはboost union_()のバグですか?

感謝

int main() 
{ 
    typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; 

    polygon green, blue; 

    boost::geometry::read_wkt(
     "POLYGON((0 0,1 0,1 1,0 1))", 
     green); 

    boost::geometry::read_wkt(
     "POLYGON((2 1.3,2.4 1.7,2.8 1.8))", 
     blue); 

    std::deque<polygon> output; 
    boost::geometry::union_(green, blue, output); 

    int i = 0; 
    std::cout << "green && blue:" << std::endl; 
    BOOST_FOREACH(polygon const& p, output) 
    { 
     std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; 
    } 

    return 0; 
} 
+0

私は答えを得たようです。しかし、私はそれを確認する必要があります。それぞれのポリゴンに対してboost :: geometry :: correct()を呼び出すだけです。そしてboostはuion_()とintersection()に対して正しい結果を返します。ちょっと待って。私はそれを試してみましょう。 –

答えて

1

それについてsimmilar質問があります。このアルゴリズムはいくつかの前提条件を必要とする。 1)ポリゴンは時計回りでなければなりません。 2)ポリゴンが閉じている、つまり最後の点が最初の点に一致します。

したがって、オルゴナルポリゴンデータの問題を修正するには、データをルールに適合させるためにboost :: geometry :: correct()を呼び出します。アルゴリズムはポリゴンを受け取り、正しい結果を返します。

Why boost::geometry::intersection does not work correct?

関連する問題