Триангуляция многогранника не удалась - PullRequest
1 голос
/ 12 марта 2019

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

#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 вершинами.

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

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

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

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

. / Tri

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

1 Ответ

0 голосов
/ 13 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...