如何使用 CGAL Point_3 以外的 class 进行点集处理?
How do I use a class other than a CGAL Point_3 for point set processing?
我有一个由外部库 Assimp 加载的点数组,在它自己的 aiVector3D
class 中(没有组件访问函数,只有public 访问成员变量),我想使用 CGAL 的 Point Set Processing 库来处理这些点。
因为我有数以百万计的这些点(并且有一天可能会达到数十亿),所以我不想创建一个新的 CGAL Point_3
数组,如果我能帮忙的话。
Users of this package may use other types to represent positions and normals if they implement the corresponding property maps.
这似乎意味着我可以通过创建一个将 aiVector3D
映射到 Point_3
的 属性 映射来实现我想要的,但是在阅读了 CGAL 和 Boost 的文档之后,我不清楚我会怎么做。
我认为这是正确的方法吗?如果可以,我该怎么做?
无论这是否更高效(对于某种意义上的高效),这是我想出的将 aiVector3D
映射到 CGAL::Point_3
的方法(使用 CGAL::Simple_cartesian<double>
内核),包括转换。
template <typename T>
struct AItoP {
AItoP(const aiScene* scene, const aiNode* node) :
_scene(scene),
_node(node),
_mesh(0)
{
_mesh = _scene->mMeshes[node->mMeshes[0]];
_xform = _node->mTransformation * _scene->mRootNode->mTransformation;
}
T operator()(const size_t& x) const {
aiVector3t<double> v(_mesh->mVertices[x].x, _mesh->mVertices[x].y, _mesh->mVertices[x].z);
v *= _xform;
return T(v.x, v.y, v.z);
}
private:
const aiScene* _scene;
const aiNode* _node;
const aiMesh* _mesh;
aiMatrix4x4t<double> _xform;
};
...
#include <boost/property_map/function_property_map.hpp>
void my_processing_function() {
std::vector<std::size_t> indices(mesh->mNumVertices);
for(std::size_t i = 0; i < mesh->mNumVertices; ++i){
indices[i] = i;
}
double cell_size = 0.05;
std::vector<std::size_t>::iterator end;
end = CGAL::grid_simplify_point_set(indices.begin(),
indices.end(),
make_function_property_map<const size_t&, Point, AItoP<Point> >(AItoP<Point>(_scene, node)),
cell_size);
}
我有一个由外部库 Assimp 加载的点数组,在它自己的 aiVector3D
class 中(没有组件访问函数,只有public 访问成员变量),我想使用 CGAL 的 Point Set Processing 库来处理这些点。
因为我有数以百万计的这些点(并且有一天可能会达到数十亿),所以我不想创建一个新的 CGAL Point_3
数组,如果我能帮忙的话。
Users of this package may use other types to represent positions and normals if they implement the corresponding property maps.
这似乎意味着我可以通过创建一个将 aiVector3D
映射到 Point_3
的 属性 映射来实现我想要的,但是在阅读了 CGAL 和 Boost 的文档之后,我不清楚我会怎么做。
我认为这是正确的方法吗?如果可以,我该怎么做?
无论这是否更高效(对于某种意义上的高效),这是我想出的将 aiVector3D
映射到 CGAL::Point_3
的方法(使用 CGAL::Simple_cartesian<double>
内核),包括转换。
template <typename T>
struct AItoP {
AItoP(const aiScene* scene, const aiNode* node) :
_scene(scene),
_node(node),
_mesh(0)
{
_mesh = _scene->mMeshes[node->mMeshes[0]];
_xform = _node->mTransformation * _scene->mRootNode->mTransformation;
}
T operator()(const size_t& x) const {
aiVector3t<double> v(_mesh->mVertices[x].x, _mesh->mVertices[x].y, _mesh->mVertices[x].z);
v *= _xform;
return T(v.x, v.y, v.z);
}
private:
const aiScene* _scene;
const aiNode* _node;
const aiMesh* _mesh;
aiMatrix4x4t<double> _xform;
};
...
#include <boost/property_map/function_property_map.hpp>
void my_processing_function() {
std::vector<std::size_t> indices(mesh->mNumVertices);
for(std::size_t i = 0; i < mesh->mNumVertices; ++i){
indices[i] = i;
}
double cell_size = 0.05;
std::vector<std::size_t>::iterator end;
end = CGAL::grid_simplify_point_set(indices.begin(),
indices.end(),
make_function_property_map<const size_t&, Point, AItoP<Point> >(AItoP<Point>(_scene, node)),
cell_size);
}