如何在CGAL中正确加载MESH文件?解决仅读取节点问题
问题分析与解决方案
核心问题
你当前的代码只读取了顶点却丢失了单元数据,原因在于:
CGAL::build_triangulation_from_file仅负责构建底层三角剖分对象,没有针对C3t3的完整网格结构进行数据填充——C3t3除了三角剖分,还包含网格的拓扑关联、边界信息等额外数据,直接操作其内部triangulation()无法完整加载.mesh文件的所有内容。- 打开文件时使用了
binary模式,但Medit格式的.mesh是文本格式,二进制模式会导致读取解析错误。
修正后的代码
直接使用CGAL为C3t3提供的专用读写函数,就能完整加载并保存网格数据:
#include <CGAL/C3t3.h> #include <CGAL/IO/read_mesh.h> #include <CGAL/IO/write_mesh.h> #include <iostream> #include <fstream> int main() { CGAL::C3t3 c3t3; std::ifstream in("input.mesh"); // 读取完整的网格数据到C3t3 if (!CGAL::read_mesh(in, c3t3)) { std::cerr << "加载mesh文件失败" << std::endl; return 1; } std::ofstream out("output.mesh"); // 将完整的C3t3数据写入文件 if (!CGAL::write_mesh(out, c3t3)) { std::cerr << "写入mesh文件失败" << std::endl; return 1; } return 0; }
关键说明
CGAL::read_mesh()和CGAL::write_mesh()是专门针对C3t3设计的IO函数,能完整解析Medit格式中的顶点、四面体单元、面以及边界标记等所有信息。- 取消了
binary模式,改为默认的文本模式读取,符合.mesh文件的格式要求。
内容的提问来源于stack exchange,提问作者Fer
相关产品推荐
相关产品推荐

