Расчет расстояния от точки до вороной ячейки с бустом

Доброй ночи. Кто-нибудь сталкивался с подобной проблемой?

Построение диаграммы Вороного не вызвало проблем. Ячейка Вороного — это многоугольник, по крайней мере, для меня. Библиотека также позволяет найти расстояние от точки до многоугольника. Но функция библиотеки не хочет работать с ячейкой. Компилятор выдает что-то на эльфийском. Шутка. Короче, вывод компилятора мне не поможет.
Есть ли способ сделать многоугольник из клетки?

Диаграмма Вороного строится по точкам. Программа должна рассчитать расстояние от элемента qpoints до соответствующей ячейки.
Вот мой код:

#include <iostream>
#include <vector>

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/polygon/voronoi.hpp>
namespace bg = boost::geometry;

using boost::polygon::voronoi_diagram;
typedef voronoi_diagram<double>::cell_type cell_type;
typedef voronoi_diagram<double>::edge_type edge_type;
typedef voronoi_diagram<double>::vertex_type vertex_type;
typedef boost::polygon::point_data<double> point_type;

using namespace std;

int main() {

vector< point_type > vpoints;
vpoints.push_back(point_type(0.0, 0.0));
vpoints.push_back(point_type(0.0, 4.0));
vpoints.push_back(point_type(4.0, 4.0));
vpoints.push_back(point_type(4.0, 0.0));
vpoints.push_back(point_type(2.0, 2.0));

vector< point_type > qpoints;
qpoints.push_back(point_type(0.0, 0.0));
qpoints.push_back(point_type(0.0, 2.0));
qpoints.push_back(point_type(3.0, 3.0));
qpoints.push_back(point_type(5.0, 5.0));
qpoints.push_back(point_type(5.0, 5.0));

voronoi_diagram<double> vd;
construct_voronoi(vpoints.begin(), vpoints.end(), &vd);

for (int i = 0; i < qpoints.size(); i++) {
for (voronoi_diagram<double>::const_cell_iterator it = vd.cells().begin();
it != vd.cells().end(); ++it) {
if (i == it->source_index()) {
cout << "v[i]=(" << vpoints[i].x() << "," << vpoints[i].y() << ")\t";
cout << "q[i]=(" << qpoints[i].x() << "," << qpoints[i].y() << ")\t";
cout << "Distance=";
cout << bg::distance(qpoints[i], *it) << endl;
cout << endl;
break;
}
}
}

return 0;
}

0

Решение

Сообщение

boost_1_57_0/boost/geometry/core/geometry_id.hpp|37 col 5| error: no matching function for call to ‘assertion_failed(mpl_::failed************ (boost::geometry::core_dispatch::geometry_id<void>::NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE::************)(mpl_::assert_::types<void, mpl_::na, mpl_::na, mpl_::na>))’

Какой NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE утверждать. Случается делать geometry_id за reverse_dispatch:

/*!
\brief Meta-function returning the id of a geometry type
\details The meta-function geometry_id defines a numerical ID (based on
boost::mpl::int_<...> ) for each geometry concept. A numerical ID is
sometimes useful, and within Boost.Geometry it is used for the
reverse_dispatch metafuntion.
\note Used for e.g. reverse meta-function
\ingroup core
*/
template <typename Geometry>
struct geometry_id : core_dispatch::geometry_id<typename tag<Geometry>::type>
{};

То же самое предупреждение срабатывает, когда вы делаете

 cout << distance(qpoints[i], qpoints[i]) << endl;

Так что проблема в том, что ваш тип точки не является зарегистрированной геометрией. В том числе

 #include <boost/geometry/geometries/adapted/boost_polygon.hpp>

делает компиляцию, но конечно

 cout << distance(qpoints[i], *it) << endl;

по-прежнему не удается, на этот раз, потому что const boost::polygon::voronoi_cell<double> не известен тип геометрии для ускорения геометрии.

Я бы предложил не смешивая библиотеки, если вы не знаете, почему вы хотите.

Мне кажется, что клетка вороной может быть больше, чем просто одна вещь (contains_segment() а также contains_point() являются показаниями). Возможно, вам придется написать некоторую логику переключения, чтобы обрабатывать возможные случаи отдельно, и, возможно, использовать euclidean_distance из Boost Polygon в процессе (в отличие от boost :: geometry :: distance`)

0

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


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