我试图将Delaunay_mesher_2::refine_mesh应用于一组编号顶点(即顶点类为Triangulation_vertex_base_with_id_2)。我希望流程中创建的任何顶点都应该有id()==0。然而,事实证明并非如此。相反,ID具有不同的正/负值。
我试过使用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().
}发布于 2019-07-05 14:30:14
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是默认初始化
解释 默认初始化在三种情况下执行:.
然后阅读下一段:
默认初始化的效果如下:
在这里,子对象_id if类型为int,因此它不是类或数组。这就是为什么没有初始化它。该值将是内存中的任何垃圾。
发布于 2019-07-05 05:53:41
任何算法都不设置id。它只给了你一种可能性来设定它来满足你的需要。
发布于 2019-07-05 11:12:48
我认为这是CGAL中的某种错误(可能是一种未定义的行为,因为每次结果都是不同的)。很难说它的来源,但UB消毒剂在GCC说,至少有一些地方的零指针是取消引用。
作为一种解决办法,您可以通过Vertex_handle将int映射为CGAL::Unique_hash_map。
https://stackoverflow.com/questions/56891435
复制相似问题