Ошибки компиляции при использовании Boost :: geometry с Eigen :: Vector2d - PullRequest
0 голосов
/ 06 января 2020

В настоящее время я работаю над математическим программным обеспечением и для геометрических частей, которые я хотел бы использовать Boost::geometry. Для линейной алгебры я использую библиотеку Eigen, особенно мои типы точек: Eigen::Vector2d.

Чтобы быть более точным, алгоритм должен вычислять объединения и выпуклые оболочки обоих отдельных многоугольников, а также несколько полигонов. В последующем мне нужно будет передать std::vector полигонов методу convex_hull, предоставленному boost::geometry, и мои полигоны в настоящее время сохраняются как std::vector<Eigen::Vector2d> (все полигоны простые, то есть не самопересекающиеся и просто соединенные ). Моя включает в себя:

#pragma once

#include <Eigen/Dense>

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/box.hpp>
#include <boost/geometry/geometries/register/ring.hpp>
#include <boost/geometry/geometries/register/linestring.hpp>
#include <boost/geometry/multi/geometries/register/multi_polygon.hpp>
#include <boost/geometry/geometries/multi_polygon.hpp>

BOOST_GEOMETRY_REGISTER_POINT_2D(Eigen::Vector2d, double, cs::cartesian, coeffRef(0), coeffRef(1))
BOOST_GEOMETRY_REGISTER_RING(std::vector<Eigen::Vector2d>)

и позже это терпит неудачу в этой точке (код внутри большего тестового метода):

//Some initializations for the molecule-lists happen here.

std::vector<Molecule> molList({mol1, mol2});
std::vector<std::vector<Eigen::Vector2d>> polyList({mol1.getPositionsOfAllAtoms(), mol2.getPositionsOfAllAtoms()});

std::vector<Eigen::Vector2d> convexClusterHull;
boost::geometry::correct(polyList.at(0));
boost::geometry::correct(polyList.at(1));

//Following induces the compiler-error:
boost::geometry::convex_hull(polyList, convexClusterHull); 

При комментировании последней строки код компилируется снова. Это интересно, так как я вызываю некоторые другие методы boost, такие как union_, area или convex_hull для отдельных полигонов (то есть std::vector<Eigen::Vector2d> в других частях моего кода и тех, которые компилируются). Например:

void Polygon::unionWithOther(const Polygon& other) {
  //BOOST:
  std::vector<std::vector<Eigen::Vector2d>> output;
  std::vector<Eigen::Vector2d> verticesSecond(other.getVerticesList());

  boost::geometry::correct(_vertices);
  boost::geometry::correct(verticesSecond);
  boost::geometry::union_(_vertices, verticesSecond, output);

  _vertices = output.at(0);
  _vertices.erase(_vertices.end());
}

Это публичный c метод одной из моих структур данных. Например, при замене boost::geometry::convex_hull(polyList, convexClusterHull); на boost::geometry::convex_hull(polyList.at(0), convexClusterHull); код компилируется и работает.

Ошибки компилятора:

/usr/include/boost/geometry/algorithms/not_implemented.hpp:69: error: no matching function for call to ‘assertion_failed<false>(mpl_::failed************ (boost::geometry::nyi::not_implemented_error<void, void, void>::THIS_OPERATION_IS_NOT_OR_NOT_YET_IMPLEMENTED::************)(mpl_::assert_::types<void, void, void, mpl_::na>))’
     BOOST_MPL_ASSERT_MSG
     ^~~~~~~~~~~~~~~~~~~~
/usr/include/boost/geometry/algorithms/is_empty.hpp:162: error: ‘apply’ is not a member of ‘boost::geometry::dispatch::is_empty<std::vector<std::vector<Eigen::Matrix<double, 2, 1> > >, void>’
         return dispatch::is_empty<Geometry>::apply(geometry);
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
/usr/include/boost/geometry/core/point_type.hpp:45: error: no matching function for call to ‘assertion_failed<false>(mpl_::failed************ (boost::geometry::traits::point_type<std::vector<std::vector<Eigen::Matrix<double, 2, 1> > > >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<std::vector<std::vector<Eigen::Matrix<double, 2, 1> > >, mpl_::na, mpl_::na, mpl_::na>))’
     BOOST_MPL_ASSERT_MSG
     ^~~~~~~~~~~~~~~~~~~~
/usr/include/boost/geometry/core/point_type.hpp:66: error: no type named ‘type’ in ‘struct boost::geometry::traits::point_type<std::vector<std::vector<Eigen::Matrix<double, 2, 1> > > >’
         >::type type;
                 ^~~~
/usr/include/boost/geometry/core/coordinate_dimension.hpp:122: error: no type named ‘type’ in ‘struct boost::geometry::dimension<const std::vector<std::vector<Eigen::Matrix<double, 2, 1> > > >’
     BOOST_STATIC_ASSERT(( static_cast<size_t>(dimension<G1>::type::value) == static_cast<size_t>(dimension<G2>::type::value) ));
     ^~~~~~~~~~~~~~~~~~~

Я предполагаю, что ошибки компилятора пытаются сказать мне, что я неправильно определил / зарегистрировал свою геометрию c структур. Нужно ли регистрировать «мульти-полигоны» с помощью boost-macro? Или я забыл что-то еще? Я пытался сделать это с

BOOST_GEOMETRY_REGISTER_MULTI_POLYGON(std::vector<std::vector<Eigen::Vector2d>>)

, хотя это ничего не изменило. Теперь я немного растерялся, так как не знаю, что еще попробовать (я искал это сочетание ошибок в Google уже несколько дней безуспешно).

За любую помощь и предложения я был бы очень признателен !

С уважением.

...