周期性C3T3网格存在元素缺失问题
CGAL周期性网格生成器元素缺失问题
使用CGAL周期性网格生成器时,粗网格和细网格中均会出现一个或多个元素缺失的情况,每个重复单元都存在缺失现象:

可复现问题的最简代码
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Periodic_3_mesh_3/config.h> #include <CGAL/make_periodic_3_mesh_3.h> #include <CGAL/optimize_periodic_3_mesh_3.h> #include <CGAL/Periodic_3_mesh_3/IO/File_medit.h> #include <CGAL/Periodic_3_mesh_triangulation_3.h> #include <CGAL/Labeled_mesh_domain_3.h> #include <CGAL/Mesh_complex_3_in_triangulation_3.h> #include <CGAL/Mesh_criteria_3.h> #include <CGAL/number_type_config.h> // CGAL_PI /* Standard library headers */ #include <cmath> #include <iostream> #include <fstream> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::FT FT; typedef K::Point_3 Point; typedef K::Iso_cuboid_3 Iso_cuboid; typedef FT (Function)(const Point&); typedef CGAL::Labeled_mesh_domain_3<K> Periodic_mesh_domain; typedef CGAL::Periodic_3_mesh_triangulation_3<Periodic_mesh_domain>::type Tr; typedef CGAL::Mesh_complex_3_in_triangulation_3<Tr> C3T3_Periodic; typedef CGAL::Mesh_criteria_3<Tr> Periodic_mesh_criteria; using namespace CGAL::parameters; // Implicit function FT schwarz_p(const Point& p) { double scaling = 2*CGAL_PI/1; double t = -0.5; return sin(scaling*p.x())*cos(scaling*p.y()) + sin(scaling*p.y())*cos(scaling*p.z()) + sin(scaling*p.z())*cos(scaling*p.x()) - t; } int main(int argc, char** argv) { int domain_size = 1; Iso_cuboid canonical_cube(0, 0, 0, domain_size, domain_size, domain_size); Periodic_mesh_domain domain = Periodic_mesh_domain::create_implicit_mesh_domain(schwarz_p, canonical_cube); Periodic_mesh_criteria criteria(facet_angle = 30, facet_size = domain_size, facet_distance = 0.027 * domain_size, cell_radius_edge_ratio = 2., cell_size = 0.027 * domain_size); C3T3_Periodic c3t3_Periodic = CGAL::make_periodic_3_mesh_3<C3T3_Periodic>(domain, criteria); std::ofstream medit_file("out.mesh"); CGAL::IO::output_periodic_mesh_to_medit(medit_file, c3t3_Periodic, 8); std::cout << "EXIT SUCCESS" << std::endl; return 0; }
问题排查与解决建议
- 统一数值类型精度:隐式函数中混合了
double和CGAL::FT类型,易引发精度偏差。修改为统一使用CGAL::FT计算:FT schwarz_p(const Point& p) { FT scaling = 2 * CGAL_PI / FT(1); FT t = FT(-0.5); return sin(scaling*p.x())*cos(scaling*p.y()) + sin(scaling*p.y())*cos(scaling*p.z()) + sin(scaling*p.z())*cos(scaling*p.x()) - t; } - 调整网格生成参数:当前
facet_size设为与域尺寸相同,可能导致网格拓扑不完整。尝试减小该参数,例如设为0.5 * domain_size,同时确保cell_size、facet_distance等参数比例协调。 - 优化域初始化精度:创建隐式网格域时,添加精度控制参数以提升边界检测准确性:
Periodic_mesh_domain domain = Periodic_mesh_domain::create_implicit_mesh_domain( schwarz_p, canonical_cube, relative_error_bound(1e-6), min_edge_size(0.01 * domain_size) ); - 启用网格后处理优化:生成网格后调用优化函数,尝试修复拓扑缺陷:
CGAL::optimize_periodic_3_mesh_3(c3t3_Periodic, domain, criteria);
内容的提问来源于stack exchange,提问作者Fer
相关产品推荐
相关产品推荐

