Сбой триангуляции многогранника

#c #cgal #triangulation #polyhedra

#c #cgal #триангуляция #многогранники

Вопрос:

Я пытаюсь выполнить триангуляцию граней многогранника, используя CGAL 4.13 и следующий фрагмент кода, который принимает файл определения многогранника в формате OFF в stdin:

 #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
using namespace std;

int main (void) {
    Polyhedron p;
    cin >> p;
    if (!CGAL::Polygon_mesh_processing::triangulate_faces(p)) 
        cerr << p << endl << "Triangulation failed!" << endl;
}
  

Однако я наблюдаю следующее предупреждение:

Предупреждение CGAL: проверьте нарушение! Выражение : false Файл : /usr/include/CGAL/Constrained_triangulation_2.h Строка : 902 Объяснение: Вы используете точный числовой тип, использование класса Constrained_triangulation_plus_2 позволило бы избежать вычисления каскадного пересечения и было бы намного эффективнее Это сообщение отображается, только если CGAL_NO_CDT_2_WARNINGне определено.

Обратитесь к инструкциям по сообщению об ошибках наhttps://www.cgal.org/bug_report.html

и сбой триангуляции. Сообщение Triangulation failed! печатается вместе с определением многогранника, в котором четко показаны некоторые грани с 5 или даже 7 вершинами.

К сожалению, отключенное представление многогранника имеет длину 8070 строк, и мне не удалось создать пример меньшего размера, чтобы воспроизвести проблему. Итак, я загрузил это сюда. Там он доступен только в течение 30 дней, если кто-нибудь может предложить лучшее место для его загрузки, я рассмотрю это.

После компиляции, например, с

g -O3 tri.cpp -o tri -lCGAL -lgmp -lmpfr -Wall

проблема может быть воспроизведена с

./tri < poly.off

Я не уверен, связан ли сбой триангуляции с предупреждением; как я мог бы использовать Constrained_triangulation_plus_2 класс с CGAL::Polygon_mesh_processing::triangulate_faces() ? Возможно ли это вообще? Триангуляция грани — это не сложная вещь, как это может привести к сбою в первую очередь?

Комментарии:

1. Посмотрите, актуально ли это: cgal-discuss.949826.n4.nabble.com /…

Ответ №1:

Если вам не нужно точное ядро, вы должны использовать CGAL::Exact_predicates_inexact_constructions_kernel , которое отключит предупреждение, и тогда, вероятно, триангуляция не завершится ошибкой. Если вам действительно нужно точное ядро, вы можете использовать CGAL::copy_face_graph() , чтобы легко переключаться с Epeck на Epick, выполнять триангуляцию, а затем переключаться обратно на Epeck.