网格划分算法弄乱了Triangulation_vertex_base_with_id_2

时间:2019-07-04 16:03:53

标签: c++ cgal

我正在尝试将class MyBloc extends Bloc<MyEvent, MyState> { @override Stream<MyState> mapEventToState(MyEvent event) async* { if (event is ChangeSomeValues) { print("here's the data : ${event.data}"); } } } 应用于一组编号的顶点(即,顶点类为Delaunay_mesher_2::refine_mesh)。我希望在过程中创建的任何顶点都应具有Triangulation_vertex_base_with_id_2。但是事实并非如此。相反,这些ID具有各种正/负值。

我尝试使用id()==0,但结果相同。

我的代码或多或少是这样的:

Triangulation_vertex_base_with_info_2

3 个答案:

答案 0 :(得分:2)

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() {}

这意味着_iddefault-initialized

  

说明

     

在以下三种情况下执行默认初始化:[...]

     
      
  1. 当构造函数初始化列表中未提及基类或非静态数据成员时,将调用该构造函数。
  2.   

然后阅读下一段:

  

默认初始化的效果是:

     
      
  • 如果T是非POD(直到C ++ 11)类类型,则考虑构造函数,并针对空参数列表对其进行重载解析。调用选定的构造函数(它是默认的构造函数之一)为新对象提供初始值;
  •   
  • 如果T是数组类型,则数组的每个元素均为   默认初始化;
  •   
  • 否则,什么也不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。
  •   

如果子对象_id的类型为int,则它不是类或数组。这就是为什么它没有初始化。该值将是内存中存在的任何垃圾。

答案 1 :(得分:0)

没有任何算法设置ID。它仅使您可以根据需要进行设置。

答案 2 :(得分:0)

我认为这是CGAL中的某种错误(可能是不确定的行为,因为每次的结果都不同)。很难确定它是从哪里来的,但是GCC中的UB清理程序说,至少在某些地方取消了空指针的引用。

作为一种解决方法,可以通过Vertex_handle使用intCGAL::Unique_hash_map的映射。