|
ViewDesignEngine
3.1.0
高性能 CAD 计算几何引擎
|
半边网格、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
|
strong |
布尔运算类型(CSG 组合)
| 枚举值 | |
|---|---|
| Union | A ∪ B 并集 |
| Intersection | A ∩ B 交集 |
| Difference | A \ B 差集 |
| SymDiff | A Δ B 对称差集 |
在文件 mesh_boolean.h 第 13 行定义.
|
strong |
|
strong |
网格光顺方法
| 枚举值 | |
|---|---|
| Laplacian | 标准拉普拉斯光顺:v ← v + λ·L(v),快速但会收缩 |
| Taubin | Taubin λ|μ 光顺:先正后负步交替,体积保持 |
| HCLaplacian | HC 拉普拉斯(Humphrey's Classes):推拉两步保持形状/体积 |
| Bilateral | 双边滤波:法向加权去噪,保持尖锐特征 |
在文件 mesh_smooth.h 第 13 行定义.
| TetrahedronMesh vde::mesh::alpha_shapes | ( | const std::vector< Point3D > & | points, |
| double | alpha | ||
| ) |
Alpha Shapes 点云表面重建
从 3D 点云的 Delaunay 四面体化中提取表面,通过参数 α 控制细节级别:
算法:对每个 Delaunay 四面体,检查其外接球半径。 若半径 ≤ α,四面体保留;否则剔除。最终表面 = 保留四面体与 被剔除四面体(或外部)之间的边界三角形面。
| points | 输入 3D 点云 |
| alpha | α 半径阈值,通常取平均点间距的 1~3 倍 |
| std::pair<std::vector<Point3D>, std::vector<std::array<int,3> > > vde::mesh::alpha_shapes_surface | ( | const TetrahedronMesh & | tet_mesh | ) |
将 Alpha Shapes 四面体网格的表面提取为三角形网格
遍历四面体网格,提取所有仅出现在一个四面体上的面(边界面), 即为重建的表面三角形。
| tet_mesh | Alpha Shapes 输出的四面体网格 |
| 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 | 输入三角网格 |
| 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 vde::mesh::delaunay_2d | ( | const std::vector< Point2D > & | points | ) |
2D Delaunay 三角化(Bowyer-Watson 增量算法)
构建点集的 Delaunay 三角化:任意三角形的外接圆内不含其他点。 该性质使三角化的最小角最大化,避免狭长三角形。
算法流程:
| points | 输入 2D 点集(至少 3 个不共线点) |
| TetrahedronMesh vde::mesh::delaunay_3d | ( | const std::vector< Point3D > & | points | ) |
3D Delaunay 四面体化(Bowyer-Watson 增量算法)
将 3D 点集剖分为 Delaunay 四面体网格:任意四面体的外接球内不含其他顶点。 算法是 2D 版本的自然推广:
| points | 输入 3D 点集(至少 4 个不共面点) |
| ElemQuality vde::mesh::evaluate_element_quality | ( | const HalfedgeMesh & | mesh, |
| ElementType | type | ||
| ) |
| MeshQuality vde::mesh::evaluate_mesh_quality | ( | const HalfedgeMesh & | mesh | ) |
评估三角网格质量
对网格中每个三角面计算内角、长宽比,统计全局最值及平均值。 质量好的三角网格应有:
| mesh | 输入三角网格 |
| TetQuality vde::mesh::evaluate_tet_quality | ( | const HalfedgeMesh & | mesh | ) |
评估三角网格作为四面体边界的质量
将每个三角面与其面重心构造虚拟四面体,评估这些四面体的质量。 适用于将封闭三角表面解释为体积边界时的质量检测。
| mesh | 封闭三角网格(volume boundary) |
| 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)。
算法三步:
相比精确测地线算法(如 MMP),热方法更快(~线性时间)且易于实现, 但精度受时间步长 t 和网格分辨率影响。
| mesh | 输入三角网格 |
| sources | 源顶点索引列表(距离为 0 的顶点) |
| t | 时间步长,< 0 时自动设为平均边长平方 |
| std::vector<Point2D> vde::mesh::lscm_parameterization | ( | const HalfedgeMesh & | mesh | ) |
LSCM(Least Squares Conformal Maps)参数化
基于 Lévy et al. 2002 的最小二乘共形映射。通过最小化共形能量 使参数化尽可能保角(角度畸变小),同时允许边界自由。
与 Tutte 的区别:
能量函数: E(u,v) = Σ_T || ∇(u+iv) ||² · A_T 对每个三角形 T 最小化梯度扰动平方和
| mesh | 输入三角网格 |
| 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³ 个立方体 |
| HalfedgeMesh vde::mesh::mesh_boolean | ( | const HalfedgeMesh & | a, |
| const HalfedgeMesh & | b, | ||
| BooleanOp | op | ||
| ) |
三角网格布尔运算
对两个封闭三角网格执行 CSG(Constructive Solid Geometry)布尔操作。 内部流程:
| a | 第一个三角网格(必须为封闭流形) |
| b | 第二个三角网格(必须为封闭流形) |
| op | 布尔运算类型 |
| QualityReport vde::mesh::mesh_quality_report | ( | const HalfedgeMesh & | mesh | ) |
生成三角网格的完整质量报告
包含直方图、分级统计及基本统计量。 分级标准(按归一化 Jacobian):
| mesh | 输入三角网格 |
| QualityReport vde::mesh::mesh_quality_report_tet | ( | const HalfedgeMesh & | mesh | ) |
| HalfedgeMesh vde::mesh::repair_mesh | ( | const HalfedgeMesh & | mesh, |
| const RepairOptions & | opts = {} |
||
| ) |
自动网格修复
对输入网格执行一系列修复操作,输出水密的流形网格:
| mesh | 输入网格(可能有缺陷) |
| opts | 修复选项(默认全部启用) |
|
inline |
|
inline |
SDF 平滑差集(Smooth Subtraction)
d1 减去 d2,过渡区由 k 控制。
| d1,d2 | 两个 SDF 值 |
| k | 平滑宽度(> 0) |
在文件 marching_cubes.h 第 118 行定义.
|
inline |
| 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,塌缩代价为该最小值。
算法流程:
| mesh | 输入三角网格 |
| opts | 简化选项 |
| HalfedgeMesh vde::mesh::smooth_bilateral | ( | const HalfedgeMesh & | mesh, |
| const SmoothOptions & | opts = {} |
||
| ) |
双边网格滤波
基于法向加权的各向异性去噪,保持尖锐边缘和特征:
相比于各向同性的拉普拉斯类方法,双边滤波在 CAD/机械零件网格上效果最优。
| mesh | 输入网格 |
| opts | 光顺选项(使用 bilateral_ 前缀字段) |
| HalfedgeMesh vde::mesh::smooth_hc_laplacian | ( | const HalfedgeMesh & | mesh, |
| const SmoothOptions & | opts = {} |
||
| ) |
HC 拉普拉斯光顺(Humphrey's Classes)
两遍处理以保持原始形状特征:
相比标准拉普拉斯显著减轻体积收缩,同时比 Taubin 更好地保持尖锐特征。
| mesh | 输入网格 |
| opts | 光顺选项(使用 hc_alpha 和 hc_beta 字段) |
| HalfedgeMesh vde::mesh::smooth_laplacian | ( | const HalfedgeMesh & | mesh, |
| int | iterations, | ||
| double | lambda | ||
| ) |
标准拉普拉斯光顺
均匀拉普拉斯:v ← v + λ·(avg(neighbor_positions) - v) 最简单但会引入体积收缩,适用于轻度平滑。
| mesh | 输入网格 |
| iterations | 迭代次数 |
| lambda | 步长系数 (0, 1] |
| HalfedgeMesh vde::mesh::smooth_mesh | ( | const HalfedgeMesh & | mesh, |
| const SmoothOptions & | opts = {} |
||
| ) |
网格光顺(通用分发器)
根据 opts.method 分派到具体的光顺实现:
| mesh | 输入三角网格 |
| opts | 光顺选项 |
| HalfedgeMesh vde::mesh::smooth_taubin | ( | const HalfedgeMesh & | mesh, |
| int | iterations, | ||
| double | lambda, | ||
| double | mu | ||
| ) |
Taubin λ|μ 光顺(体积保持)
两阶段交替:
传递函数在低频通带增益 ≈ 1,有效去噪同时保持体积。
| mesh | 输入网格 |
| iterations | 完整 λ/μ 循环次数 |
| lambda | 正步系数 (0, 1] |
| mu | 负步系数,需满足 mu < 0 且 |mu| > lambda |
| 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 | 四面体四个顶点 |
| 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 | 三角形三个顶点 |
| std::vector<Point2D> vde::mesh::tutte_parameterization | ( | const HalfedgeMesh & | mesh | ) |
Tutte 参数化(调和参数化)
将边界顶点固定映射到单位圆上,内部顶点通过求解 Laplace 方程 Δu = 0, Δv = 0 得到 UV 坐标。这是最经典、最稳定的网格参数化方法。
算法:
优点:极稳定,保证无翻转(对凸边界网格) 缺点:边界固定,内部可能扭曲(非共形)
| mesh | 输入三角网格(需含边界) |