首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网格化算法搞乱了Triangulation_vertex_base_with_id_2

网格化算法搞乱了Triangulation_vertex_base_with_id_2
EN

Stack Overflow用户
提问于 2019-07-04 16:03:53
回答 3查看 57关注 0票数 0

我试图将Delaunay_mesher_2::refine_mesh应用于一组编号顶点(即顶点类为Triangulation_vertex_base_with_id_2)。我希望流程中创建的任何顶点都应该有id()==0。然而,事实证明并非如此。相反,ID具有不同的正/负值。

我试过使用Triangulation_vertex_base_with_info_2,但结果是一样的。

我的代码大致是这样工作的:

代码语言:javascript
复制
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().
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-05 14:30:14

CGAL::Triangulation_vertex_base_with_id_2<K>的默认构造函数不初始化id成员:

代码语言:javascript
复制
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默认初始化

解释 默认初始化在三种情况下执行:.

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

然后阅读下一段:

默认初始化的效果如下:

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-07-05 05:53:41

任何算法都不设置id。它只给了你一种可能性来设定它来满足你的需要。

票数 0
EN

Stack Overflow用户

发布于 2019-07-05 11:12:48

我认为这是CGAL中的某种错误(可能是一种未定义的行为,因为每次结果都是不同的)。很难说它的来源,但UB消毒剂在GCC说,至少有一些地方的零指针是取消引用。

作为一种解决办法,您可以通过Vertex_handleint映射为CGAL::Unique_hash_map

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56891435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档