ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
网格模块 (vde::mesh)

半边网格、Delaunay 2D/3D、简化、平滑、修复、参数化、Marching Cubes 更多...

struct  vde::mesh::DelaunayResult
 2D Delaunay 三角化结果 更多...
 
struct  vde::mesh::TetrahedronMesh
 四面体网格结构 更多...
 
struct  vde::mesh::Halfedge
 半边数据结构元素 更多...
 
struct  vde::mesh::Face
 面元素 更多...
 
class  vde::mesh::HalfedgeMesh
 半边数据结构三角网格 更多...
 
struct  vde::mesh::MCMesh
 Marching Cubes 输出网格 更多...
 
struct  vde::mesh::CurvatureResult
 离散曲率计算结果 更多...
 
struct  vde::mesh::MeshQuality
 三角网格质量指标 更多...
 
struct  vde::mesh::TetQuality
 四面体网格质量指标 更多...
 
struct  vde::mesh::ElemQuality
 通用单元质量指标 更多...
 
struct  vde::mesh::QualityReport
 详细质量报告 更多...
 
struct  vde::mesh::RepairOptions
 网格修复选项 更多...
 
struct  vde::mesh::SimplifyOptions
 网格简化选项 更多...
 
struct  vde::mesh::SmoothOptions
 网格光顺参数 更多...
 

枚举

enum class  vde::mesh::BooleanOp { vde::mesh::Union , vde::mesh::Intersection , vde::mesh::Difference , vde::mesh::SymDiff }
 布尔运算类型(CSG 组合) 更多...
 
enum class  vde::mesh::ElementType { vde::mesh::Tri , vde::mesh::Quad , vde::mesh::Tet , vde::mesh::Hex }
 单元类型枚举 更多...
 
enum class  vde::mesh::SmoothMethod { vde::mesh::Laplacian , vde::mesh::Taubin , vde::mesh::HCLaplacian , vde::mesh::Bilateral }
 网格光顺方法 更多...
 

函数

TetrahedronMesh vde::mesh::alpha_shapes (const std::vector< Point3D > &points, double alpha)
 Alpha Shapes 点云表面重建 更多...
 
std::pair< std::vector< Point3D >, std::vector< std::array< int, 3 > > > vde::mesh::alpha_shapes_surface (const TetrahedronMesh &tet_mesh)
 将 Alpha Shapes 四面体网格的表面提取为三角形网格 更多...
 
DelaunayResult vde::mesh::constrained_delaunay_2d (const std::vector< Point2D > &points, const std::vector< std::pair< int, int >> &constraints)
 约束 Delaunay 三角化(CDT) 更多...
 
DelaunayResult vde::mesh::delaunay_2d (const std::vector< Point2D > &points)
 2D Delaunay 三角化(Bowyer-Watson 增量算法) 更多...
 
TetrahedronMesh vde::mesh::delaunay_3d (const std::vector< Point3D > &points)
 3D Delaunay 四面体化(Bowyer-Watson 增量算法) 更多...
 
std::vector< double > vde::mesh::geodesic_distance (const HalfedgeMesh &mesh, const std::vector< int > &sources, double t=-1.0)
 热方法(Heat Method)计算测地距离 更多...
 
MCMesh vde::mesh::marching_cubes (const std::function< double(double, double, double)> &f, double iso_level, const Point3D &bmin, const Point3D &bmax, int resolution)
 Marching Cubes 等值面提取 更多...
 
double vde::mesh::sdf_sphere (double x, double y, double z, double cx, double cy, double cz, double r)
 SDF 球体函数 更多...
 
double vde::mesh::sdf_box (double x, double y, double z, double hx, double hy, double hz)
 SDF 立方体函数(轴对齐,中心在原点) 更多...
 
double vde::mesh::sdf_smooth_subtraction (double d1, double d2, double k)
 SDF 平滑差集(Smooth Subtraction) 更多...
 
HalfedgeMesh vde::mesh::mesh_boolean (const HalfedgeMesh &a, const HalfedgeMesh &b, BooleanOp op)
 三角网格布尔运算 更多...
 
CurvatureResult vde::mesh::compute_curvature (const HalfedgeMesh &mesh)
 离散曲率计算(Cotan 公式,Meyer et al. 2003) 更多...
 
std::vector< Point2D > vde::mesh::tutte_parameterization (const HalfedgeMesh &mesh)
 Tutte 参数化(调和参数化) 更多...
 
std::vector< Point2D > vde::mesh::lscm_parameterization (const HalfedgeMesh &mesh)
 LSCM(Least Squares Conformal Maps)参数化 更多...
 
MeshQuality vde::mesh::evaluate_mesh_quality (const HalfedgeMesh &mesh)
 评估三角网格质量 更多...
 
TetQuality vde::mesh::evaluate_tet_quality (const HalfedgeMesh &mesh)
 评估三角网格作为四面体边界的质量 更多...
 
ElemQuality vde::mesh::evaluate_element_quality (const HalfedgeMesh &mesh, ElementType type)
 按单元类型分派的网格质量评估 更多...
 
QualityReport vde::mesh::mesh_quality_report (const HalfedgeMesh &mesh)
 生成三角网格的完整质量报告 更多...
 
QualityReport vde::mesh::mesh_quality_report_tet (const HalfedgeMesh &mesh)
 生成四面体网格的完整质量报告 更多...
 
double vde::mesh::tri_scaled_jacobian (const Point3D &a, const Point3D &b, const Point3D &c)
 三角形归一化 Jacobian 更多...
 
double vde::mesh::tet_scaled_jacobian (const Point3D &a, const Point3D &b, const Point3D &c, const Point3D &d)
 四面体归一化 Jacobian 更多...
 
HalfedgeMesh vde::mesh::repair_mesh (const HalfedgeMesh &mesh, const RepairOptions &opts={})
 自动网格修复 更多...
 
HalfedgeMesh vde::mesh::simplify_mesh (const HalfedgeMesh &mesh, const SimplifyOptions &opts={})
 QEM(Quadric Error Metrics)网格简化 更多...
 
HalfedgeMesh vde::mesh::smooth_mesh (const HalfedgeMesh &mesh, const SmoothOptions &opts={})
 网格光顺(通用分发器) 更多...
 
HalfedgeMesh vde::mesh::smooth_laplacian (const HalfedgeMesh &mesh, int iterations, double lambda)
 标准拉普拉斯光顺 更多...
 
HalfedgeMesh vde::mesh::smooth_taubin (const HalfedgeMesh &mesh, int iterations, double lambda, double mu)
 Taubin λ|μ 光顺(体积保持) 更多...
 
HalfedgeMesh vde::mesh::smooth_hc_laplacian (const HalfedgeMesh &mesh, const SmoothOptions &opts={})
 HC 拉普拉斯光顺(Humphrey's Classes) 更多...
 
HalfedgeMesh vde::mesh::smooth_bilateral (const HalfedgeMesh &mesh, const SmoothOptions &opts={})
 双边网格滤波 更多...
 

详细描述

半边网格、Delaunay 2D/3D、简化、平滑、修复、参数化、Marching Cubes

枚举类型说明

◆ BooleanOp

enum vde::mesh::BooleanOp
strong

布尔运算类型(CSG 组合)

枚举值
Union 

A ∪ B 并集

Intersection 

A ∩ B 交集

Difference 

A \ B 差集

SymDiff 

A Δ B 对称差集

在文件 mesh_boolean.h13 行定义.

◆ ElementType

单元类型枚举

枚举值
Tri 

三角形

Quad 

四边形(Stub)

Tet 

四面体

Hex 

六面体(Stub)

在文件 mesh_quality.h92 行定义.

◆ SmoothMethod

网格光顺方法

枚举值
Laplacian 

标准拉普拉斯光顺:v ← v + λ·L(v),快速但会收缩

Taubin 

Taubin λ|μ 光顺:先正后负步交替,体积保持

HCLaplacian 

HC 拉普拉斯(Humphrey's Classes):推拉两步保持形状/体积

Bilateral 

双边滤波:法向加权去噪,保持尖锐特征

在文件 mesh_smooth.h13 行定义.

函数说明

◆ alpha_shapes()

TetrahedronMesh vde::mesh::alpha_shapes ( const std::vector< Point3D > &  points,
double  alpha 
)

Alpha Shapes 点云表面重建

从 3D 点云的 Delaunay 四面体化中提取表面,通过参数 α 控制细节级别:

  • α → ∞:返回凸包(所有边界四面体面都保留)
  • α → 0:返回所有 Delaunay 面(非常详细,含内部结构)
  • 中间值:剔除外接球半径 > α 的四面体,保留细节适中的表面

算法:对每个 Delaunay 四面体,检查其外接球半径。 若半径 ≤ α,四面体保留;否则剔除。最终表面 = 保留四面体与 被剔除四面体(或外部)之间的边界三角形面。

参数
points输入 3D 点云
alphaα 半径阈值,通常取平均点间距的 1~3 倍
返回
TetrahedronMesh 保留的四面体网格
// 从点云重建表面
auto tets = alpha_shapes(point_cloud, 0.5);
auto [verts, tris] = alpha_shapes_surface(tets);
std::pair< std::vector< Point3D >, std::vector< std::array< int, 3 > > > alpha_shapes_surface(const TetrahedronMesh &tet_mesh)
将 Alpha Shapes 四面体网格的表面提取为三角形网格
TetrahedronMesh alpha_shapes(const std::vector< Point3D > &points, double alpha)
Alpha Shapes 点云表面重建
参见
alpha_shapes_surface delaunay_3d

◆ alpha_shapes_surface()

std::pair<std::vector<Point3D>, std::vector<std::array<int,3> > > vde::mesh::alpha_shapes_surface ( const TetrahedronMesh tet_mesh)

将 Alpha Shapes 四面体网格的表面提取为三角形网格

遍历四面体网格,提取所有仅出现在一个四面体上的面(边界面), 即为重建的表面三角形。

参数
tet_meshAlpha Shapes 输出的四面体网格
返回
{顶点数组, 三角形索引数组}
注解
表面三角形法向指向四面体外部(右手定则)
参见
alpha_shapes

◆ compute_curvature()

CurvatureResult vde::mesh::compute_curvature ( const HalfedgeMesh mesh)

离散曲率计算(Cotan 公式,Meyer et al. 2003)

对三角网格每个顶点计算离散高斯曲率和平均曲率。

高斯曲率(内点): K(v) = (2π - Σ_j θ_j) / A_v 其中 θ_j 是顶点 v 处面角的总和,A_v 是 Voronoi 面积

平均曲率: H(v) = || Σ_j (cot α_j + cot β_j) · e_j || / (2 · A_v) 其中 α_j,β_j 是与边 e_j 相对的两个角

边界顶点使用角度缺损公式修正。

参数
mesh输入三角网格
返回
CurvatureResult 每顶点曲率
注解
要求网格为流形;边界顶点曲率使用近似公式
auto crv = compute_curvature(mesh);
double max_curvature = *std::max_element(crv.gaussian.begin(), crv.gaussian.end());
// 可用于特征检测、网格分割等
CurvatureResult compute_curvature(const HalfedgeMesh &mesh)
离散曲率计算(Cotan 公式,Meyer et al. 2003)

◆ constrained_delaunay_2d()

DelaunayResult vde::mesh::constrained_delaunay_2d ( const std::vector< Point2D > &  points,
const std::vector< std::pair< int, int >> &  constraints 
)

约束 Delaunay 三角化(CDT)

在标准 Delaunay 三角化基础上强制指定的约束边必须出现在三角化中。 通过边翻转(edge flip)反复消除与约束边相交的三角形边,直到所有 约束边都成为三角形边。

约束边在输出三角化中一定存在(作为三角形边),但不保证满足 空圆性质——靠近约束边的三角形可能违反 Delaunay 条件。

参数
points输入 2D 点集
constraints约束边列表,每项为 {起点索引, 终点索引}
返回
DelaunayResult 含约束边的三角化结果
注解
约束边不能相交(否则行为未定义);自相交约束需先分割交点
// 带孔洞的三角化:约束边标记孔洞边界
auto result = constrained_delaunay_2d(points,
{{0,1}, {1,2}, {2,1}, {3,0}});
DelaunayResult constrained_delaunay_2d(const std::vector< Point2D > &points, const std::vector< std::pair< int, int >> &constraints)
约束 Delaunay 三角化(CDT)
参见
delaunay_2d

◆ delaunay_2d()

DelaunayResult vde::mesh::delaunay_2d ( const std::vector< Point2D > &  points)

2D Delaunay 三角化(Bowyer-Watson 增量算法)

构建点集的 Delaunay 三角化:任意三角形的外接圆内不含其他点。 该性质使三角化的最小角最大化,避免狭长三角形。

算法流程:

  1. 创建包围所有输入点的超级三角形
  2. 逐点插入: a. 找出外接圆包含新点的所有三角形("坏三角形") b. 删除坏三角形,形成多边形空洞 c. 将新点与空洞边界各边连接形成新三角形
  3. 删除与超级三角形顶点相关的三角形
参数
points输入 2D 点集(至少 3 个不共线点)
返回
DelaunayResult 三角化结果
注解
时间复杂度:平均 O(n log n),最坏 O(n²)
auto result = delaunay_2d({{0,0}, {1,0}, {0.5, 0.5}, {0,1}, {1,1}});
// result.triangles 为 Delaunay 三角形索引
DelaunayResult delaunay_2d(const std::vector< Point2D > &points)
2D Delaunay 三角化(Bowyer-Watson 增量算法)
参见
constrained_delaunay_2d

◆ delaunay_3d()

TetrahedronMesh vde::mesh::delaunay_3d ( const std::vector< Point3D > &  points)

3D Delaunay 四面体化(Bowyer-Watson 增量算法)

将 3D 点集剖分为 Delaunay 四面体网格:任意四面体的外接球内不含其他顶点。 算法是 2D 版本的自然推广:

  1. 构建超级四面体包含所有点
  2. 逐点插入:删除外接球包含新点的四面体 → 空洞 → 重连
  3. 去除超级四面体相关单元
参数
points输入 3D 点集(至少 4 个不共面点)
返回
TetrahedronMesh 四面体网格
注解
时间复杂度与 2D 类似:平均 O(n log n),最坏 O(n²)
输出包括内部和边界四面体;通过 alpha_shapes 可提取表面
auto tet_mesh = delaunay_3d(point_cloud);
TetrahedronMesh delaunay_3d(const std::vector< Point3D > &points)
3D Delaunay 四面体化(Bowyer-Watson 增量算法)
参见
alpha_shapes

◆ evaluate_element_quality()

ElemQuality vde::mesh::evaluate_element_quality ( const HalfedgeMesh mesh,
ElementType  type 
)

按单元类型分派的网格质量评估

参数
mesh输入网格
type单元类型
返回
ElemQuality 质量指标
注解
目前仅 Tri 和 Tet 完整实现;Quad / Hex 返回 stub(全零)

◆ evaluate_mesh_quality()

MeshQuality vde::mesh::evaluate_mesh_quality ( const HalfedgeMesh mesh)

评估三角网格质量

对网格中每个三角面计算内角、长宽比,统计全局最值及平均值。 质量好的三角网格应有:

  • min_angle > 20°(CFD 模拟要求 > 25°)
  • max_angle < 120°(避免狭长退化)
  • avg_aspect_ratio 接近 1
参数
mesh输入三角网格
返回
MeshQuality 质量指标汇总
auto q = evaluate_mesh_quality(mesh);
if (q.min_angle_deg < 15.0) {
// 需要 remesh 或优化
}
MeshQuality evaluate_mesh_quality(const HalfedgeMesh &mesh)
评估三角网格质量

◆ evaluate_tet_quality()

TetQuality vde::mesh::evaluate_tet_quality ( const HalfedgeMesh mesh)

评估三角网格作为四面体边界的质量

将每个三角面与其面重心构造虚拟四面体,评估这些四面体的质量。 适用于将封闭三角表面解释为体积边界时的质量检测。

参数
mesh封闭三角网格(volume boundary)
返回
TetQuality 四面体质量指标
注解
这不是真正的四面体网格质量评估——仅用于表面网格的代理指标

◆ geodesic_distance()

std::vector<double> vde::mesh::geodesic_distance ( const HalfedgeMesh mesh,
const std::vector< int > &  sources,
double  t = -1.0 
)

热方法(Heat Method)计算测地距离

基于 Crane et al. 2013 的算法,通过求解三个线性系统高效计算 曲面上任意点到源点集的测地距离(Geodesic Distance)。

算法三步:

  1. 热扩散:求解 (I - t·L)·u = u₀,其中 u₀ 在源点为 1 其余为 0
  2. 梯度归一化:X = -∇u / |∇u|
  3. 泊松重建:L·φ = div(X),得到测地距离 φ

相比精确测地线算法(如 MMP),热方法更快(~线性时间)且易于实现, 但精度受时间步长 t 和网格分辨率影响。

参数
mesh输入三角网格
sources源顶点索引列表(距离为 0 的顶点)
t时间步长,< 0 时自动设为平均边长平方
返回
每顶点到最近源点的测地距离
注解
要求网格为连通流形;时间步长 t 越小精度越高但数值越不稳定
auto dist = geodesic_distance(mesh, {0, 10, 20});
// dist[i] = 顶点 i 到 {0,10,20} 中最近顶点的测地距离
std::vector< double > geodesic_distance(const HalfedgeMesh &mesh, const std::vector< int > &sources, double t=-1.0)
热方法(Heat Method)计算测地距离

◆ lscm_parameterization()

std::vector<Point2D> vde::mesh::lscm_parameterization ( const HalfedgeMesh mesh)

LSCM(Least Squares Conformal Maps)参数化

基于 Lévy et al. 2002 的最小二乘共形映射。通过最小化共形能量 使参数化尽可能保角(角度畸变小),同时允许边界自由。

与 Tutte 的区别:

  • 无需固定边界 → 边界自然展开,畸变更小
  • 需要固定至少 2 个顶点消除刚体自由度(内部处理)
  • 共形性更好,适合纹理映射
  • 不保证无翻转(局部极小可能翻转)

能量函数: E(u,v) = Σ_T || ∇(u+iv) ||² · A_T 对每个三角形 T 最小化梯度扰动平方和

参数
mesh输入三角网格
返回
每顶点 UV 坐标(Point2D)
注解
简化实现,不包含完整 Lévy 论文中所有的退化处理
auto uv = lscm_parameterization(mesh);
// 适合纹理 mapping
std::vector< Point2D > lscm_parameterization(const HalfedgeMesh &mesh)
LSCM(Least Squares Conformal Maps)参数化
参见
tutte_parameterization

◆ marching_cubes()

MCMesh vde::mesh::marching_cubes ( const std::function< double(double, double, double)> &  f,
double  iso_level,
const Point3D &  bmin,
const Point3D &  bmax,
int  resolution 
)

Marching Cubes 等值面提取

从标量场 f(x,y,z) 中提取等值面 S = { (x,y,z) | f(x,y,z) = iso_level }。 将包围盒划分为 resolution×resolution×resolution 体素网格, 在每个体素的 8 个角求值 f,查表确定等值面穿越该体素的三角形配置。

参数
f标量场函数 f(x,y,z) → double
iso_level等值面值(默认 0)
bmin包围盒最小角
bmax包围盒最大角
resolution每轴采样分辨率(≥ 1),总网格 = resolution³ 个立方体
返回
MCMesh 三角形网格
注解
使用经典的 256 查表法(Lorensen & Cline 1987)
// 提取球面等值面
auto f = [](double x,double y,double z) {
return sdf_sphere(x,y,z, 0,0,0, 1.0);
};
auto mesh = marching_cubes(f, 0.0,
{-2,-2,-2}, {2,2,2}, 64);
MCMesh marching_cubes(const std::function< double(double, double, double)> &f, double iso_level, const Point3D &bmin, const Point3D &bmax, int resolution)
Marching Cubes 等值面提取
double sdf_sphere(double x, double y, double z, double cx, double cy, double cz, double r)
SDF 球体函数
参见
sdf_sphere sdf_box

◆ mesh_boolean()

HalfedgeMesh vde::mesh::mesh_boolean ( const HalfedgeMesh a,
const HalfedgeMesh b,
BooleanOp  op 
)

三角网格布尔运算

对两个封闭三角网格执行 CSG(Constructive Solid Geometry)布尔操作。 内部流程:

  1. 计算两个网格的三角形-三角形交线
  2. 沿交线细分三角形(conforming 三角化)
  3. 根据布尔类型对每个子面片做内/外分类
  4. 缝合属于结果的部分形成新网格
参数
a第一个三角网格(必须为封闭流形)
b第二个三角网格(必须为封闭流形)
op布尔运算类型
返回
结果三角网格
注解
要求输入网格为封闭流形(watertight),否则分类不可靠
// result = 立方体减去球体的交集部分
HalfedgeMesh mesh_boolean(const HalfedgeMesh &a, const HalfedgeMesh &b, BooleanOp op)
三角网格布尔运算
@ Difference
A \ B 差集
double sphere(const Point3D &p, double radius)
球体的 SDF

◆ mesh_quality_report()

QualityReport vde::mesh::mesh_quality_report ( const HalfedgeMesh mesh)

生成三角网格的完整质量报告

包含直方图、分级统计及基本统计量。 分级标准(按归一化 Jacobian):

  • A: [0.9, 1.0] — 优秀
  • B: [0.7, 0.9) — 良好
  • C: [0.5, 0.7) — 合格
  • D: [0.3, 0.5) — 差
  • F: [0.0, 0.3) — 不合格
参数
mesh输入三角网格
返回
QualityReport 完整质量报告

◆ mesh_quality_report_tet()

QualityReport vde::mesh::mesh_quality_report_tet ( const HalfedgeMesh mesh)

生成四面体网格的完整质量报告

将表面网格的面解释为四面体单元的边界(面 + 面心 = 虚拟四面体)。

参数
mesh封闭三角网格
返回
QualityReport 完整质量报告

◆ repair_mesh()

HalfedgeMesh vde::mesh::repair_mesh ( const HalfedgeMesh mesh,
const RepairOptions opts = {} 
)

自动网格修复

对输入网格执行一系列修复操作,输出水密的流形网格:

  • fill_holes: 检测边界环并用 fan 三角化填充
  • remove_duplicates: 空间哈希合并间距 < 1e-8 的重复顶点
  • fix_orientation: 从最大连通分量开始遍历传播一致的半边朝向
  • remove_degenerate: 剔除面积 < ε 的退化三角形
参数
mesh输入网格(可能有缺陷)
opts修复选项(默认全部启用)
返回
修复后的网格
注解
修复为启发式算法,不保证 100% 成功;孔洞过大或非流形边可能仍有残留问题
auto fixed = repair_mesh(broken_mesh); // 默认全修复
RepairOptions opts;
opts.fill_holes = false; // 仅做去重 + 定向
auto cleaned = repair_mesh(mesh, opts);
HalfedgeMesh repair_mesh(const HalfedgeMesh &mesh, const RepairOptions &opts={})
自动网格修复

◆ sdf_box()

double vde::mesh::sdf_box ( double  x,
double  y,
double  z,
double  hx,
double  hy,
double  hz 
)
inline

SDF 立方体函数(轴对齐,中心在原点)

参数
x,y,z采样点坐标
hx,hy,hz半边长
返回
有符号距离

在文件 marching_cubes.h82 行定义.

◆ sdf_smooth_subtraction()

double vde::mesh::sdf_smooth_subtraction ( double  d1,
double  d2,
double  k 
)
inline

SDF 平滑差集(Smooth Subtraction)

d1 减去 d2,过渡区由 k 控制。

参数
d1,d2两个 SDF 值
k平滑宽度(> 0)
返回
混合后的 SDF 值

在文件 marching_cubes.h118 行定义.

◆ sdf_sphere()

double vde::mesh::sdf_sphere ( double  x,
double  y,
double  z,
double  cx,
double  cy,
double  cz,
double  r 
)
inline

SDF 球体函数

参数
x,y,z采样点坐标
cx,cy,cz球心坐标
r半径
返回
有符号距离:内部 < 0,表面 = 0,外部 > 0
auto sphere_sdf = [](double x,double y,double z) {
return sdf_sphere(x,y,z, 0,0,0, 1.0);
};

在文件 marching_cubes.h69 行定义.

◆ simplify_mesh()

HalfedgeMesh vde::mesh::simplify_mesh ( const HalfedgeMesh mesh,
const SimplifyOptions opts = {} 
)

QEM(Quadric Error Metrics)网格简化

基于 Garland & Heckbert 1997 的 QEM 算法,通过迭代边塌缩减少三角面数量。 每条边维护一个 4×4 误差二次型 Q = Σ Q_f(面片的顶点-平面距离平方和), 塌缩目标点为 argmin v^T Q v,塌缩代价为该最小值。

算法流程:

  1. 为每个顶点计算初始 Q(关联所有邻面的平面二次型之和)
  2. 为每条边计算最优塌缩点及代价,插入最小堆
  3. 循环弹出最小代价边,执行塌缩,更新受影响边的代价
  4. 直到面数达到 target_ratio 或堆为空
参数
mesh输入三角网格
opts简化选项
返回
简化后的网格
注解
preserve_boundary 模式下,边界边通过惩罚项(大代价)被保护
SimplifyOptions opts;
opts.target_ratio = 0.1; // 保留 10% 面
auto lod = simplify_mesh(high_res_mesh, opts);
HalfedgeMesh simplify_mesh(const HalfedgeMesh &mesh, const SimplifyOptions &opts={})
QEM(Quadric Error Metrics)网格简化

◆ smooth_bilateral()

HalfedgeMesh vde::mesh::smooth_bilateral ( const HalfedgeMesh mesh,
const SmoothOptions opts = {} 
)

双边网格滤波

基于法向加权的各向异性去噪,保持尖锐边缘和特征:

  • 空间权重:w_c = exp(-d²/(2·σ_c²)),基于顶点间距
  • 法向权重:w_n = exp(-θ²/(2·σ_n²)),基于法向夹角
  • 更新:v ← v + Σ_j w_c(j)·w_n(j)·(v_j - v) / Σ_j w_c(j)·w_n(j)

相比于各向同性的拉普拉斯类方法,双边滤波在 CAD/机械零件网格上效果最优。

参数
mesh输入网格
opts光顺选项(使用 bilateral_ 前缀字段)
返回
光顺后的网格

◆ smooth_hc_laplacian()

HalfedgeMesh vde::mesh::smooth_hc_laplacian ( const HalfedgeMesh mesh,
const SmoothOptions opts = {} 
)

HC 拉普拉斯光顺(Humphrey's Classes)

两遍处理以保持原始形状特征:

  1. 前推:标准拉普拉斯光顺,记录位移 b_i = v_i' - v_i
  2. 回推:v_i'' = v_i' - (α·b_i + β·avg(neighbor_b))

相比标准拉普拉斯显著减轻体积收缩,同时比 Taubin 更好地保持尖锐特征。

参数
mesh输入网格
opts光顺选项(使用 hc_alpha 和 hc_beta 字段)
返回
光顺后的网格

◆ smooth_laplacian()

HalfedgeMesh vde::mesh::smooth_laplacian ( const HalfedgeMesh mesh,
int  iterations,
double  lambda 
)

标准拉普拉斯光顺

均匀拉普拉斯:v ← v + λ·(avg(neighbor_positions) - v) 最简单但会引入体积收缩,适用于轻度平滑。

参数
mesh输入网格
iterations迭代次数
lambda步长系数 (0, 1]
返回
光顺后的网格
注解
迭代过多会导致网格坍塌;对于体积关键的应用优先选 Taubin 或 HC
参见
smooth_taubin smooth_hc_laplacian

◆ smooth_mesh()

HalfedgeMesh vde::mesh::smooth_mesh ( const HalfedgeMesh mesh,
const SmoothOptions opts = {} 
)

网格光顺(通用分发器)

根据 opts.method 分派到具体的光顺实现:

参数
mesh输入三角网格
opts光顺选项
返回
光顺后的网格(顶点位置更新,拓扑不变)
SmoothOptions opts;
opts.method = SmoothMethod::Taubin;
opts.iterations = 20;
auto smooth = smooth_mesh(noisy_mesh, opts);
HalfedgeMesh smooth_mesh(const HalfedgeMesh &mesh, const SmoothOptions &opts={})
网格光顺(通用分发器)
@ Taubin
Taubin λ|μ 光顺:先正后负步交替,体积保持

◆ smooth_taubin()

HalfedgeMesh vde::mesh::smooth_taubin ( const HalfedgeMesh mesh,
int  iterations,
double  lambda,
double  mu 
)

Taubin λ|μ 光顺(体积保持)

两阶段交替:

  1. 正步(收缩滤波):v ← v + λ·L(v)
  2. 负步(膨胀滤波):v ← v + μ·L(v),其中 μ < 0 且 |μ| > |λ|

传递函数在低频通带增益 ≈ 1,有效去噪同时保持体积。

参数
mesh输入网格
iterations完整 λ/μ 循环次数
lambda正步系数 (0, 1]
mu负步系数,需满足 mu < 0 且 |mu| > lambda
返回
光顺后的网格
注解
典型值:λ = 0.5, μ = -0.53;|mu| 过大可能导致不稳定振荡

◆ tet_scaled_jacobian()

double vde::mesh::tet_scaled_jacobian ( const Point3D &  a,
const Point3D &  b,
const Point3D &  c,
const Point3D &  d 
)

四面体归一化 Jacobian

计算四面体 (a,b,c,d) 的体积 Jacobian,归一化到 [0, 1]。 值 1 = 正四面体(最优),0 = 退化(共面)。

公式:J = det([b-a, c-a, d-a]) / (归一化因子)

参数
a,b,c,d四面体四个顶点
返回
归一化 Jacobian [0, 1]

◆ tri_scaled_jacobian()

double vde::mesh::tri_scaled_jacobian ( const Point3D &  a,
const Point3D &  b,
const Point3D &  c 
)

三角形归一化 Jacobian

计算三角形 (a,b,c) 的带符号面积,归一化到 [-1, 1]。 值 1 = 等边三角形(最优),0 = 退化(共线),-1 = 翻转(法向反了)。

公式:J = det([b-a, c-a, n]) / (|b-a|·|c-a|·|b-c|? or area-based?) 实际实现使用面积与理想等边三角形面积之比。

参数
a,b,c三角形三个顶点
返回
归一化 Jacobian [-1, 1]

◆ tutte_parameterization()

std::vector<Point2D> vde::mesh::tutte_parameterization ( const HalfedgeMesh mesh)

Tutte 参数化(调和参数化)

将边界顶点固定映射到单位圆上,内部顶点通过求解 Laplace 方程 Δu = 0, Δv = 0 得到 UV 坐标。这是最经典、最稳定的网格参数化方法。

算法:

  1. 检测网格边界环
  2. 将边界顶点按弧长比例映射到单位圆上
  3. 对每个内部顶点求解均匀 Laplace(权重 w_ij = 1): v_i = Σ_j v_j / deg(i)
  4. 构造稀疏线性系统 LU 求解

优点:极稳定,保证无翻转(对凸边界网格) 缺点:边界固定,内部可能扭曲(非共形)

参数
mesh输入三角网格(需含边界)
返回
每顶点 UV 坐标(Point2D),顺序与 mesh 顶点一致
注解
网格必须有边界(开网格);闭曲面需先切割为拓扑圆盘
auto uv = tutte_parameterization(mesh);
// uv[i] 为顶点 i 的 (u,v) 坐标,范围大致在 [-1,1]²
std::vector< Point2D > tutte_parameterization(const HalfedgeMesh &mesh)
Tutte 参数化(调和参数化)
参见
lscm_parameterization