不管這或多或少是有效的(對於高效有些意思),這裏就是我想出了映射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);
}
我相信你高估複製點CGAL點的矢量的成本。你可以使用一個點屬性映射來管理aiVector3D動態轉換爲cgal點(參見boost :: function_property_map,這是一種創建這種屬性映射的簡單方法),但是我懷疑節省是否值得。 –
我想避免一個簡單副本的兩個原因,1)輸入點集可能是幾十億一天,並且在內存中有兩個副本可能會導致問題。 2)它看起來並不優雅。 1)可以通過內存映射文件來緩解,2)可以放在抽屜中並忽略:)我會嘗試'boost :: function_property_map',並運行一些基準測試。 – MerseyViking