为何CDT无法读取自身创建的约束Delaunay三角剖分文件?
这个断言错误(Expr: s == LEFT_TURN)是因为CGAL读取三角剖分数据时,检测到某个三角形的三个点不满足左转几何约束——这是CGAL维护合法三角剖分的核心条件之一。即使写入过程无异常,读取失败的原因及解决办法如下:
未完成三角剖分的一致性构建
创建CDT后直接写入时,三角剖分可能处于未完全整理的状态:比如存在退化三角形(共线点构成)、未处理的约束边,或是拓扑结构不满足CGAL的内部要求。operator<<仅序列化当前状态,不会验证合法性,但operator>>会尝试重建符合约束的三角剖分,触发断言。
解决:写入前必须调用CGAL::triangulate_constraints(cdt),完成约束三角剖分的完整构建,确保拓扑与几何一致性后再序列化。浮点精度误差
若CDT使用浮点坐标核(如CGAL::Exact_predicates_inexact_constructions_kernel),写入和读取过程中可能出现微小精度损失,导致原本符合左转条件的三点变成共线或右转,触发断言。
解决:改用精确计算核(如CGAL::Exact_predicates_exact_constructions_kernel);或写入前调用cdt.infinite_vertex()确认无限顶点状态,避免精度误差累积。序列化的隐性前提未满足
CGAL的operator<</operator>>对CDT序列化有隐性要求:三角剖分必须是完全三角化且满足约束三角剖分严格条件的状态。未完成约束三角化的CDT可能包含不完整的拓扑数据,导致读取时无法重建合法结构。
解决:遵循完整的约束三角剖分流程后再写入:// 创建CDT、添加顶点与约束边后 CGAL::triangulate_constraints(cdt); // 执行写入 std::ofstream out("trian.dtr"); out << cdt; out.close();读写两端的CDT定义不一致
若读取代码中CDT的类型定义(包括核类型、启用的CGAL选项)与写入时不一致,几何计算逻辑会产生冲突,触发断言。
解决:确保读写两端的CDTtypedef完全相同,例如:typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Constrained_Delaunay_triangulation_2<K> CDT;
内容的提问来源于stack exchange,提问作者Rabelo

