Алгоритмы построения мешают Triangulation_vertex_base_with_id_2 - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь применить Delaunay_mesher_2::refine_mesh к набору пронумерованных вершин (то есть класс вершин Triangulation_vertex_base_with_id_2).Я ожидаю, что любая созданная в процессе вершина должна иметь id()==0.Однако оказывается, что это не так.Вместо этого идентификаторы имеют различные положительные / отрицательные значения.

Я пытался использовать Triangulation_vertex_base_with_info_2, но результат был таким же.

Более или менее мой код работает так:

using K = CGAL::Exact_predicates_inexact_constructions_kernel;
using Vb = CGAL::Triangulation_vertex_base_with_id_2<K>;
using Fb = CGAL::Delaunay_mesh_face_base_2<K>;
using Tds = CGAL::Triangulation_data_structure_2<Vb, Fb>;
using CDT_Tag = CGAL::Exact_intersections_tag;
using CDT = CGAL::Constrained_Delaunay_triangulation_2<K, Tds, CDT_Tag>;
using Criteria = CGAL::Delaunay_mesh_size_criteria_2<CDT>;
CDT cdt;
CGAL::Delaunay_mesher_2<CDT, Criteria> mesher(cdt, Criteria(0.125, 0.5));
... // Add some points and constraints.
static const CDT::Point INFINITE_POINT = { 1e100, 1e100 };
std::vector<CDT::Point> seeds = { INFINITE_POINT };
mesher.set_seeds(seeds.begin(), seeds.end());
mesher.refine_mesh();

for (auto vertices_iter = cdt.finite_vertices_begin();
     vertices_iter != cdt.finite_vertices_end();
     ++vertices_iter) {
  // do something with vertices_iter->id().
}

Ответы [ 3 ]

2 голосов
/ 05 июля 2019

Конструктор по умолчанию CGAL::Triangulation_vertex_base_with_id_2<K> не инициализирует член id:

template < typename GT,
           typename Vb = Triangulation_vertex_base_2<GT> >
class Triangulation_vertex_base_with_id_2
  : public Vb
{
  int _id;

public:

  // [...]

  Triangulation_vertex_base_with_id_2()
    : Vb() {}

Это означает, что _id инициализирован по умолчанию :

Пояснение

Инициализация по умолчанию выполняется в трех ситуациях: [...]

когда базовый класс или нестатический член данных не упомянут в списке инициализатора конструктора и этот конструктор вызывается.

, затем прочитайте следующий абзац:

Эффекты инициализации по умолчанию:

  • , если T является типом класса не POD (до C ++ 11), конструкторы рассматриваются и подвергаются разрешению перегрузки для пустогосписок аргументов.Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;
  • , если T является типом массива, каждый элемент массива инициализируется по умолчанию;
  • в противном случае ничего не делается: объекты с автоматической продолжительностью хранения (и их подобъекты) инициализируются неопределенными значениями.

Здесь подобъект _id, если имеет тип int, и, следовательно, это не класс или массив.Вот почему он не инициализирован.Значением будет любой мусор, который был в памяти.

0 голосов
/ 05 июля 2019

Я думаю, что это какая-то ошибка в CGAL (вероятно, неопределенное поведение, потому что результат каждый раз меняется). Трудно сказать наверняка, откуда он, но UB sanitizer в GCC говорит, что есть хотя бы места, где нулевой указатель разыменовывается.

В качестве обходного пути можно использовать отображение Vertex_handle в int через CGAL::Unique_hash_map.

0 голосов
/ 05 июля 2019

Идентификатор не установлен ни одним алгоритмом.Это дает вам только возможность настроить его для ваших нужд.

...