2016-11-17 6 views
0

У меня есть массив точек, которые были загружены внешней библиотекой, Assimp, в свой собственный класс aiVector3D (который не имеет функций доступа к компонентам, просто открытый доступ к переменным-членам), и я хочу обработать эти точки используя CGAL's Обработка набора точек библиотека.Как использовать класс, отличный от CGAL Point_3, для обработки набора точек?

Поскольку у меня есть 10 миллионов из этих точек (и может когда-нибудь быть миллиардами), я не хочу создавать новый массив CGAL Point_3, если я могу ему помочь.

documentation говорит:

Пользователи этого пакета могут использовать другие типы для представления позиции и нормалей, если они реализуют соответствующие карты свойств.

который, кажется, подразумевает, что я могу добиться того, чего я хочу, создав карту собственности, которая отображает aiVector3D в Point_3, но после прочтения обоих документов CGAL-х и подталкивания'S это мне не ясно, как я бы об этом.

Я прав, думая, что это путь? Если да, то как мне это сделать?

+0

Я считаю, что вы завышая стоимость копирования точек на вектор CGAL точек. Вы можете управлять с помощью карты свойств точки, которая преобразует aiVector3D в точку cgal на лету (см. Boost :: function_property_map для простого способа создания такой карты свойств), но я сомневаюсь, что экономия стоит того. –

+0

Две причины, по которым я хочу избежать простой копии: 1) набор входных точек может составлять миллиарды в один день и иметь две копии в памяти может вызвать проблемы. 2) Он просто не кажется * элегантным. 1) можно смягчить с помощью файлов с отображением памяти, а 2) можно поместить в ящик и проигнорировать :) Я попробую 'boost :: function_property_map' и запустил некоторые эталонные тесты. – MerseyViking

ответ

1

Независимо от того, является ли это более или менее эффективным (для некоторого значения эффективного), вот что я придумал для сопоставления 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); 
}