При чтении вне файла с помощью cgal оказывается, что порядок вершин грани решает, будет ли она считана с помощью read_OFF. Но определение вне файла ничего не говорит о порядке вершин грани.
Я читаю самогенерируемый вне файлов, используя метод read_OFF cgal:
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = typename Kernel::Point_3;
...
CGAL::Surface_mesh<Point_3> test_mash;
CGAL::IO::read_OFF(file_name, test_mash);
std::cout << "Number of vertices: " << test_mash.vertices().size()
<< ", Number of faces: " << test_mash.faces().size() << std::endl;
two_faces_read.off:
OFF
4 2 0
1 1 1
2 -2 2
3 3 -3
-4 4 4
3 0 1 2
3 0 3 1
one_face_read.off:
OFF
4 2 0
1 1 1
2 -2 2
3 3 -3
-4 4 4
3 0 1 2
3 0 1 3
Чтение two_faces_read.off работает как положено, печатая:
Number of vertices: 4, Number of faces: 2.
Но когда я читаю one_face_read.off, я получаю Number of vertices: 4, Number of faces: 1. Единственная разница между этими двумя файлами — последняя строка, порядок вершин второй грани разный. После перебора всех возможных комбинаций оказалось, что с 031, 103, 310 считывается 2 лица, а с 013, 130, 301 считывается только 1 лицо.
Спецификация вне файла, на которую ссылается cgal, не упоминает никаких правил, касающихся порядка вершин грани.
Почему это происходит и как я могу убедиться, что все лица считываются?





one_face_read.off не определяет допустимую сетку поверхности, ориентация двух граней несовместима. Вы можете использовать следующая функция для считывания точек и граней и вызывать CGAL::Polygon_mesh_processing::is_polygon_soup_a_polygon_mesh() для проверки того, является ли вход допустимой сеткой поверхности. Функцию CGAL::Polygon_mesh_processing::orient_polygon_soup() можно использовать для фиксации ориентации. CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh() можно использовать для создания сетки.