2 Вопрос: CGAL: Как я могу получить доступ к цветам вершин после загрузки файла .off?

вопрос создан в Thu, May 2, 2019 12:00 AM

Загрузка файлов .off проста:

typedef CGAL::Simple_cartesian<double>  Kernel;
typedef CGAL::Surface_mesh<Kernel::Point_3> SurfaceMesh;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;

...

SurfaceMesh surface;
Polyhedron poly;
std::fstream inputOffFile( "myFile.off" );
inputOffFile >> poly;
CGAL::copy_face_graph( poly, surface);

Затем я могу перебрать координаты вершины следующим образом:

std::vector<float> verts;
for( SurfaceMesh::Vertex_index vi : surface.vertices() )
{
    Point pt = surface.point( vi );
    verts.push_back( pt.x() );
    verts.push_back( pt.y() );
    verts.push_back( pt.z() );
}

Но как мне получить доступ к цветам вершин, которые тоже были сохранены в файле .off?

РЕДАКТИРОВАТЬ: Вероятно, CGAL :: copy_face_graph не копирует свойство цвета, поэтому я думаю, что мне нужен другой подход?

    
0
2 ответа                              2                         

Вам необходимо использовать карты свойств вашего SurfaceMesh. Если и только если в файле OFF есть цвета (то есть первая индикация - это COFF, а не OFF в первой строке), и есть цвета для каждой вершины, а не только для грани, то ваш SurfaceMesh будет иметь внутреннюю карту свойств с именем "v: цвет". Вы можете получить к нему доступ, позвонив

SurfaceMesh::Property_map<SurfaceMesh::Vertex_index, CGAL::Color> vcolors =
      surface.property_map<SurfaceMesh::Vertex_index, CGAL::Color >("v:color").first;

for( SurfaceMesh::Vertex_index vi : surface.vertices() )
{
    CGAL::Color ci = vcolors[vi];
}

Если у каждого цвета есть цвета, вы можете получить к нему аналогичный доступ, но с помощью поиска карты свойств с именем "f: color". Проверить наличие карты можно с помощью surface.property_map < ...... > (...). Second.

    
1
2019-05-03 07: 10: 28Z
  1. То, что написал Максим, верно для CGAL :: Surface_mesh, а не для CGAL :: Polyhedron_3
    2019-05-03 08: 03: 46Z
  2. OMG - скорее всего CGAL :: copy_face_graph не копирует свойство цвета ...? Как мне этого добиться?
    2019-05-03 09: 16: 44Z
  3. Я отладил загрузку .off в сам многогранник CGAL, и цвета вершин были определенно загружены во некоторую внутреннюю структуру, но не существуют в SurfaceMesh ....
    2019-05-03 09: 51: 12Z
  4. Многогранник_3 не имеет элегантного механизма для добавления свойств. Вот почему я предложил переключиться на Surface_mesh. IO многогранника может анализировать файл с цветом, но игнорирует их.
    2019-05-03 10: 45: 21Z
  5. О да, извините, я не видел, чтобы выкл был загружен в многогранник. Почему бы вам не загрузить его прямо на поверхность? Поскольку функция чтения многогранника не считывает цвета, они даже не доходят до фазы dopy_face_graph ().
    2019-05-03 13: 10: 26Z

Хорошо, вот полное решение, включая доступ к вершинам грани (при необходимости, если вы хотите визуализировать сетку через OpenGL). Работа с SurfaceMesh - это ключ.

...
std::vector<Point> verts;
std::vector<Color> cols;

SurfaceMesh::Property_map<SurfaceMesh::Vertex_index, CGAL::Color> vcolors =
    m_pSurface->property_map<SurfaceMesh::Vertex_index, CGAL::Color >( "v:color" ).first;

bool colorExists = m_pSurface->property_map<SurfaceMesh::Vertex_index, CGAL::Color>( "v:color" ).second;

if( !colorExists ) 
    Error(); 

for( SurfaceMesh::Vertex_index vi : m_pSurface->vertices() )
{
    cols.push_back( vcolors[ vi ] );
    verts.push_back( m_pSurface->point( vi ) );
}

for( SurfaceMesh::Face_index face_index : m_pSurface->faces() )
{
    CGAL::Vertex_around_face_circulator<SurfaceMesh> vcirc( m_pSurface->halfedge( face_index ), *m_pSurface ), done( vcirc );

    signed char count = 0;

    do
    {
        count++;
        uint32_t vertexI = *vcirc++;

        const Point &pt = verts[ vertexI ];
        const Color &col = cols[ vertexI ];

        ...

    } while( vcirc != done );

}

Большое спасибо за полезные комментарии!

    
0
2019-05-06 10: 25: 27Z
источник размещен Вот