我有一个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
一起使用的正确方法是什么?
问候
答案 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)
根据您的意思,代码:
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)作为没有类实例化的函数。