#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.