Использование BOOST_GEOMETRY_REGISTER_RING

У меня проблемы с пониманием того, как зарегистрировать свой собственный тип как boost::geometry::model::ring, У меня есть свой собственный класс:

struct Point { double x, y; };

И кольца хранятся как std::vector<Point>, Поэтому я зарегистрировал их так:

BOOST_GEOMETRY_REGISTER_POINT_2D(Point , double, cs::cartesian, x, y);
BOOST_GEOMETRY_REGISTER_RING(std::vector<Point>);

Теперь я хотел бы исправить ориентацию кольца, и, действительно, следующие компиляции:

void foo(std::vector<Point>& ring) {
boost::geometry::correct(ring);
}

Проблема в том, как определить «правильную» ориентацию кольца? Это более очевидно при использовании boost::geometry::model::polygonгде параметр шаблона позволяет мне указать ожидаемую ориентацию. Однако следующее не компилируется:

void foo(std::vector<Point>& ring) {
typedef boost::geometry::model::polygon<vector> clockwise_closed_polygon;
clockwise_closed_polygon cwcp;
boost::geometry::exterior_ring(cwcp) = ring; //<<< fails to compile
boost::geometry::correct(cwcp);
}

Очевидно, мой собственный тип звонка не может быть преобразован в тип, определенный clockwise_closed_polygon,

Итак, у меня есть два вопроса:

  1. Как я могу указать правильную ориентацию кольца?
  2. Почему мой тип кольца не может использоваться с многоугольником, как указано выше?

1

Решение

Проблема в том, как определить «правильную» ориентацию кольца?

Вы можете попробовать специализироваться повышение :: геометрия :: point_order:

живое демо

#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/ring.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/core/point_order.hpp>
#include <boost/geometry.hpp>
#include <iostream>
#include <ostream>
#include <vector>

using namespace boost::geometry;
using namespace std;

struct Point { double x, y; };

BOOST_GEOMETRY_REGISTER_POINT_2D(Point , double, cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_RING(vector<Point>)

namespace boost { namespace geometry
{
template<>
struct point_order<vector<Point>>
{
//static const order_selector value=counterclockwise;
static const order_selector value=clockwise;
};
}}

template<typename Ring>
void print(const Ring &r)
{
for(auto p : r)
cout << "(" << p.x << "," << p.y << ")";
cout << endl;
}

int main()
{
std::vector<Point> ring{{0.0,0.0},{1.0,0.0},{0.0,1.0},{0.0,0.0}};
print(ring);
correct(ring);
print(ring);
}

Выход:

(0,0)(1,0)(0,1)(0,0)
(0,0)(0,1)(1,0)(0,0)

Если изменить с по часовой стрелке на против часовой стрелки, то вывод:

(0,0)(1,0)(0,1)(0,0)
(0,0)(1,0)(0,1)(0,0)
2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector