将Eigen :: MatrixXd矩阵转换为cgal容器类型

时间:2018-06-07 13:26:55

标签: c++ casting eigen cgal

在我的示例中,我得到了一些形成立方体的点并存储在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库中处理这些问题,例如基于this tutorial。但是,您可以看到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结构投射到PwnPointList,以便我可以将它们与cgal功能一起使用。我知道我可以制作循环并单独推回每个点,但我的猜测是应该有一种更有效或更简洁的方法来代替它。

1 个答案:

答案 0 :(得分:2)

如果您仔细阅读这些示例,您将看到您无需在std::vector中打包积分和法线。您只需要传递与ReadablePropertyMap概念匹配的点和法线容器。所以你必须实现一个存储引用的小包装器 使用MatrixXd免费功能的get(const your_wrapper&,int)Point_3Vector_3投放一行。由于默认情况下MatrixXd是默认的,因此您必须为此任务执行副本并按值返回。因此,最好每列组织点数或使用Matrix<double,Dynamic,3,RowMajor>,以便在访问某个点时,其坐标将按顺序存储在内存中。在这种情况下,你甚至可以考虑做一个丑陋的reinterpret_cast来通过引用返回......