You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

周期性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:35:18