创建并检查点是否在多边形内

时间:2013-08-13 11:50:59

标签: c++ boost boost-geometry

我有一个std::list的2D点,并且想测试一个点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一起使用的正确方法是什么?

问候

2 个答案:

答案 0 :(得分:1)

为什么不坚持示例中给出的类型?例如,请参阅this page

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;

答案 1 :(得分: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)作为没有类实例化的函数。