В настоящее время я работаю над математическим программным обеспечением и для геометрических частей, которые я хотел бы использовать 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 уже несколько дней безуспешно).
За любую помощь и предложения я был бы очень признателен !
С уважением.