5

Boostに含めることが提案されている汎用ジオメトリライブラリは初めてです。

http://geometrylibrary.geodan.nl/

vector<int> Xb, Ybポリゴンを作成しようとしている2つのベクトルがあります。次のコードスニペットに沿って何かを取得しようとしています。

 polygon_2d P;

 vector<double>::const_iterator xi;
 vector<double>::const_iterator yi;

 for (xi=Xb.begin(), yi=Yb.begin(); xi!=Xb.end(); ++xi, ++yi)
  P.push_back (make<point_2d>(*xi, *yi));

上記のコードは機能せず、メンバー関数Pがないことを訴えます。push_back座標を持つポイントからポリゴンを初期化するにはどうすればよいvector<int> Xb,vector<int> Ybですか?

4

3 に答える 3

12

これは、キリルの回答の下にコメントとして尋ねた元の質問の拡張の例です。ポリゴン間の交差は可能ですか?

はい、ポリゴンとポリゴンの交差はBoost.Geometry(別名GGL)でサポートされています

#include <iostream>
#include <vector>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/cartesian2d.hpp>
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>

using namespace boost::geometry;

int main(void)
{
    // Define a polygons and fill the outer rings.
    polygon_2d a;
    {
        const double c[][2] = {
            {160, 330}, {60, 260}, {20, 150}, {60, 40}, {190, 20}, {270, 130}, {260, 250}, {160, 330}
        };
        assign(a, c);
    }
    correct(a);
    std::cout << "A: " << dsv(a) << std::endl;

    polygon_2d b;
    {
        const double c[][3] = {
            {300, 330}, {190, 270}, {150, 170}, {150, 110}, {250, 30}, {380, 50}, {380, 250}, {300, 330}
        };
        assign(b, c);
    }
    correct(b);
    std::cout << "B: " << dsv(b) << std::endl;

    // Calculate interesection
    typedef std::vector<polygon_2d > polygon_list;
    polygon_list v;

    intersection_inserter<polygon_2d>(a, b, std::back_inserter(v));
    std::cout << "Intersection of polygons A and B" << std::endl;
    for (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << dsv(*it) << std::endl;
    }

    return 0;
}

結果は次のとおりです(交差するポリゴンは、見やすくするために南に移動されます)。

代替テキスト

それがあなたのために働くことを願っています。

于 2010-01-26T01:33:20.827 に答える
6
append(P, make<point_2d>(*xi, *yi));
于 2009-09-17T19:12:33.997 に答える
0

タプルを使用してポリゴンを初期化することもできます

#include <boost/geometry/geometries/adapted/boost_tuple.hpp>

boost::geometry::assign_points(
    polygon, boost::assign::tuple_list_of
        (300, 330) (190, 270) (150, 170) (150, 110) (250, 30) (380, 50)
        (380, 250) (300, 330)
);
于 2012-10-09T10:00:29.897 に答える