Задача
проста: я хочу создать четырехгранную сетку и хочу добавить к ней несколько объектов.
Пример
В качестве входных данных возьмитефайл cube.off
, который можно найти в CGAL-4.11/examples/Mesh_3/data
.Функции, которые я хотел бы добавить (только двенадцать ребер куба) сохраняются в cube.edges
:
2 -1 -1 -1 -1 1 -1
2 -1 -1 -1 1 -1 -1
2 -1 -1 -1 -1 -1 1
2 -1 1 -1 1 1 -1
2 -1 1 -1 -1 1 1
2 1 1 -1 1 -1 -1
2 1 1 -1 1 1 1
2 1 -1 -1 1 -1 1
2 -1 -1 1 -1 1 1
2 -1 -1 1 1 -1 1
2 -1 1 1 1 1 1
2 1 1 1 1 -1 1
MWE кода:
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>
#include <CGAL/Polyhedral_complex_mesh_domain_3.h>
#include <CGAL/make_mesh_3.h>
// From CGAL-4.11/examples/Mesh_3 but for simplicity copied to the current folder.
#include "read_polylines.h"
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Mesh_polyhedron_3<K>::type Polyhedron;
typedef CGAL::Polyhedral_complex_mesh_domain_3<K> Mesh_domain;
typedef CGAL::Sequential_tag Concurrency_tag;
typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr;
typedef CGAL::Mesh_complex_3_in_triangulation_3<
Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_segment_index> C3t3;
typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria;
typedef K::Point_3 Point;
typedef std::vector<std::vector<Point> > Polylines;
int main()
{
// Read the (one) patch.
std::vector<Polyhedron> patches(1);
std::ifstream input("cube.off");
input >> patches[0];
const std::pair<int, int> incident_subdomains[] = { std::make_pair(1,0) };
Mesh_domain domain(patches.begin(), patches.end(), incident_subdomains, incident_subdomains+1);
// Read the features.
std::string feature_edges="cube.edges";
Polylines polylines;
read_polylines<Point>(feature_edges.c_str(), polylines);
domain.add_features(polylines.begin(), polylines.end());
// Create the mesh.
Mesh_criteria criteria(CGAL::parameters::edge_size = 0.25);
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);
// Write it (if it hasn't crashed before).
std::ofstream medit_file("out.mesh");
c3t3.output_to_medit(medit_file, false, true);
}
This (при компиляциис параметром -DCGAL_MESH_3_VERBOSE
) вылетает со следующим сообщением об ошибке:
Start volume scan...Scanning triangulation for bad cells (sequential)... terminate called after throwing an instance of 'CGAL::Assertion_exception'
what(): CGAL ERROR: assertion violation!
Expr: patch_id > 0 && std::size_t(patch_id) < patch_id_to_polyhedron_id.size()
File: /yatmp/scr1/ya10813/cgal-install/include/CGAL/Polyhedral_complex_mesh_domain_3.h
Line: 457
Aborted
Вопрос
Чего мне не хватает?Это должно быть что-то действительно основное.CGAL - очень надежная библиотека, которая хорошо работает со сложными данными;Я не верю, что куба с 12 ребрами достаточно, чтобы остановить его.
То, что я тоже пробовал
Когда я заменяю строку domain.add_features(polylines.begin(), polylines.end());
на domain.detect_features();
, программа завершается корректно.Заблуждение заключается в том, что обнаруженные функции точно те, которые я пытаюсь добавить (я знаю, потому что я сделал функцию в Mesh_domain_with_polyline_features_3
, которая печатает края для меня; я могу поделиться здесь, еслинеобходимо).
Когда я использую Polyhedral_mesh_domain_with_features_3
вместо Polyhedral_complex_mesh_domain_3
, программа завершается правильно.Кажется, что особенности сохраняются в получающейся геометрии.Однако это всего лишь один патч (все треугольники в out.mesh
имеют одинаковое последнее число, тогда как в этом случае я хочу, чтобы они имели номера от 0 до 11). Редактировать: Для этого нужно будет либо использовать detect_features();
вместо add_features(...);
, либо разбить домен на патчи и позволить CGAL создать комплекс из них.Спасибо @lrineau за разъяснения.
Я также попытался сначала разбить домен на несколько патчей.Однако тогда границы патчей меняются. Редактировать: Один из способов сохранить их - добавить границы патчей как элементы.
Изменение ориентации поверхности (и переключение 0
и 1
в incident_subdomains
): без видимых изменений.
Изменение порядка характерных линий в cube.edges
: без видимых изменений.
Связывание со старой версией Boost: без видимых изменений.