2016-11-17 106 views
0

我有一個點已被加載的外部庫,Assimp,在其自己的aiVector3D類(它沒有組件訪問函數,只是公共訪問成員變量),我想要處理這些點使用CGAL的點集處理庫。因爲我有數以百萬計的這些點數(有一天可能會達到數十億),所以我不想創建一個CGAL Point_3的新數組,如果我可以提供幫助的話。如何使用CGAL Point_3以外的類進行點集處理?

documentation說:

這個包的用戶可以使用其他類型來表示位置和法線,如果他們實施相應的屬性映射。

這似乎意味着我可以通過創建一個屬性映射,映射aiVector3DPoint_3達到我想要的,但看完兩CGAL的和Boost的文件後,目前還不清楚我,我怎麼會去了解這一點。

我是否認爲這是要走的路?如果是這樣,我該怎麼做?

+0

我相信你高估複製點CGAL點的矢量的成本。你可以使用一個點屬性映射來管理aiVector3D動態轉換爲cgal點(參見boost :: function_property_map,這是一種創建這種屬性映射的簡單方法),但是我懷疑節省是否值得。 –

+0

我想避免一個簡單副本的兩個原因,1)輸入點集可能是幾十億一天,並且在內存中有兩個副本可能會導致問題。 2)它看起來並不優雅。 1)可以通過內存映射文件來緩解,2)可以放在抽屜中並忽略:)我會嘗試'boost :: function_property_map',並運行一些基準測試。 – MerseyViking

回答

1

不管這或多或少是有效的(對於高效有些意思),這裏就是我想出了映射aiVector3DCGAL::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); 
} 
相關問題