приведение матрицы Eigen :: MatrixXd к типам контейнеров cgal - PullRequest
0 голосов
/ 07 июня 2018

В моем примере я получаю несколько точек, которые образуют куб и хранятся в контейнере Eigen::MatrixXd, например:

  // Inline mesh of a cube
  const Eigen::MatrixXd cubeV= (Eigen::MatrixXd(8,3)<<
  0.0,0.0,0.0,
  0.0,0.0,1.0,
  0.0,1.0,0.0,
  0.0,1.0,1.0,
  1.0,0.0,0.0,
  1.0,0.0,1.0,
  1.0,1.0,0.0,
  1.0,1.0,1.0).finished();

Теперь я хотел бы обработать эти точки в библиотеке cgal на основенапример на этот урок .Однако вы можете видеть, что точки ввода в функции cgal имеют вид:

std::vector<Pwn> points;

, где Pwn соответствует:

// Types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
typedef std::pair<Point, Vector> Pwn;

или во втором примере формы:

PointList points;

, где снова PointList соответствует:

// Types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::FT FT;
typedef Kernel::Point_3 Point;
typedef CGAL::Point_with_normal_3<Kernel> Point_with_normal;
typedef Kernel::Sphere_3 Sphere;
typedef std::vector<Point_with_normal> PointList;

Таким образом, я хотел спросить, как я могу привести свою структуру Eigen::MatrixXd к Pwn или PointListтак что я могу использовать их с функциями Cgal.Я знаю, что мог бы сделать цикл и отодвинуть каждую точку по отдельности, но я думаю, что вместо этого должен быть более эффективный или более точный способ сделать это.

1 Ответ

0 голосов
/ 07 июня 2018

Если вы внимательно прочитаете примеры, вы увидите, что вам не нужно упаковывать очки и нормали в std::vector.Все, что вам нужно, это передать точки и контейнеры нормали, соответствующие концепции ReadablePropertyMap .Таким образом, вы должны реализовать небольшую оболочку, хранящую ссылку на MatrixXd с бесплатной функцией get(const your_wrapper&,int), приводящей строку к Point_3 или Vector_3.Поскольку MatrixXd по умолчанию столбцов, вам придется выполнить копию для этой задачи и вернуть по значению.Поэтому может быть предпочтительным упорядочить ваши точки по столбцу или использовать Matrix<double,Dynamic,3,RowMajor>, чтобы при доступе к точке ее координаты последовательно сохранялись в памяти.В этом случае вы могли бы даже подумать о том, чтобы сделать уродливый reinterpret_cast для возврата по ссылке ...

...