CGAL::Многогранник_3 создает нежелательные дублированные вершины с помощью функции make_tetrahedron(), как ее решить?

#c #cgal #polyhedra #tetrahedra

Вопрос:

Я пытался создать сетку объема, используя структуру CGAL::Polyhedron_3 данных, когда, выполняя некоторые тесты, я заметил, что make_tetrahedron функция дублирует вершины, уже присутствующие в многограннике.

Пример: Два тетраэдра с общей гранью

это код, который я пробовал:

 #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h>
#include <iostream>

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

int main(void) {
    // common points
    Point_3 p( 1.0, 0.0, 0.0 );
    Point_3 q( 0.0, 1.0, 0.0 );
    Point_3 s( 0.0, 0.0, 0.0 );

    // the other two
    Point_3 r( 0.0, 0.0, 1.0 );
    Point_3 d( 0.0, 0.0,-1.0 );

    Polyhedron P;
    P.make_tetrahedron( p, q, r, s );
    P.make_tetrahedron( p, q, s, d );

    CGAL::IO::set_ascii_mode( std::cout );
    
    // printing out the vertices
    for ( Vertex_iterator v = P.vertices_begin(); v != P.vertices_end();   v )
        std::cout << v->point() << std::endl;

    return 0;
}
 

и это тот результат, который я ожидал увидеть:

 1 0 0
0 1 0
0 0 1
0 0 0
0 0 -1
 

но это то, что у меня есть:

 1 0 0
0 1 0
0 0 1
0 0 0
1 0 0
0 1 0
0 0 0
0 0 -1
 

Теперь вопрос в следующем:
Можно ли сохранить точку в качестве вершины только один раз при CGAL::Polyhedron_3 использовании make_tetrahedron функции?

Ответ №1:

Вы не можете хранить объекты, не являющиеся многообразиями, в многограннике, вам нужно что-то вроде линейного клеточного комплекса. Смотрите здесь