Создать и проверить, находится ли точка внутри многоугольника

у меня есть 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?

Привет

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;
1

Другие решения

Есть пример из 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();
}

Потому что прямой вызов конструктора Point (someX, someY) как функции без создания экземпляра класса в C ++ не допускается.

0

По вопросам рекламы [email protected]