在我的示例中,我得到一些点,这些点形成一个多维数据集并存储在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
结构转换为Pwn
或PointList
,以便可以将它们与cgal功能一起使用。我知道我可以进行循环并逐个推回每个点,但是我猜想应该有一种更有效或更整洁的方法来代替。 最佳答案
如果仔细阅读示例,您将发现不必将点和法线打包在std::vector
中。您需要做的就是传递与ReadablePropertyMap概念匹配的点和法线容器。因此,您必须实现一个小的包装器来存储对
带有MatrixXd
自由功能的get(const your_wrapper&,int)
,将一行强制转换为Point_3
或Vector_3
。由于MatrixXd
默认是按列的,因此您必须为此任务执行一个复制并按值返回。因此,最好按列组织点或使用Matrix<double,Dynamic,3,RowMajor>
,以便在访问点时将其坐标顺序存储在内存中。在这种情况下,您甚至可以考虑做一个难看的reinterpret_cast以通过引用返回...