1

std::list2D ポイントがあり、1 つのポイントがpベクトルで指定されたポリゴン内にあるかどうかをテストしたいと考えています。これをテストboost::geometryする機能があることはすでにわかっています。within残念ながら、私はそれを間違った方法で使用しているようです:

void someFunction(...) {
    namespace bpl = boost::polygon;
    typedef bpl::polygon_data<double> Polygon;
    typedef bpl::polygon_traits<Polygon>::point_type Point;

    Polygon polygon;
    std::vector<Point> points;

    for (std::list<MyPointType>::const_iterator it = myPolygonPoints.begin(); it != myPolygonPoints.end(); ++it) {
        points.push_back(Point(it->GetX(),it->GetY()));
    } 

    polygon.set(points.begin(),points.end());
    // ...
    if (!boost::geometry::within(Point(someX,someY),polygon)) {
        doSomething();
    }
    //...
}

の呼び出しで型が一致しないことから始まり、さまざまなコンパイル エラーが発生しますwithin。では、ポリゴンを作成して使用する正しい方法は何withinですか?

ご挨拶

4

2 に答える 2

1

例に示されている型に固執しないのはなぜですか? たとえば、このページを参照してください。

typedef boost::geometry::model::d2::point_xy<double> Point;
typedef boost::geometry::model::polygon<Point> Polygon;

私にとっては、それでうまくいきます。

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
//...

Polygon poly;
//... construct the polygon

Point p(4, 1);

std::cout << "within: " << (boost::geometry::within(p, poly) ? "yes" : "no") << std::endl;
于 2013-08-13T13:03:26.520 に答える
0

http://www.boost.org/doc/libs/1_47_0/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.htmlの例があります

あなたが意味することに基づいて、コード:

if (!boost::geometry::within(Point(someX,someY),polygon)) {
        doSomething();
}

次のようにする必要があります。

Point point(someX,someY);
if (!boost::geometry::within(point,polygon)) {
        doSomething();
}

また:

   Point *ppoint = new point(someX,someY);
   if (!boost::geometry::within(*ppoint,polygon)) {
            doSomething();
   }

C++ では、コンストラクター Point(someX,someY) をクラスのインスタンス化なしで関数として直接呼び出すことは許可されていないためです。

于 2013-08-13T12:10:24.177 に答える