2026-07-23 06:27:43 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "vde/mesh/halfedge_mesh.h"
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
|
|
namespace vde::mesh {
|
2026-07-23 08:19:24 +00:00
|
|
|
|
using core::Point2D;
|
|
|
|
|
|
using core::Point3D;
|
|
|
|
|
|
using core::Vector3D;
|
2026-07-23 06:27:43 +00:00
|
|
|
|
|
2026-07-24 11:04:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 离散曲率计算结果
|
|
|
|
|
|
* @ingroup mesh
|
|
|
|
|
|
*/
|
2026-07-23 06:27:43 +00:00
|
|
|
|
struct CurvatureResult {
|
2026-07-24 11:04:04 +00:00
|
|
|
|
std::vector<double> gaussian; ///< 每顶点高斯曲率 K = κ₁·κ₂
|
|
|
|
|
|
std::vector<double> mean; ///< 每顶点平均曲率 H = (κ₁+κ₂)/2
|
|
|
|
|
|
std::vector<double> area; ///< 每顶点 Voronoi 面积(曲率归一化权重)
|
2026-07-23 06:27:43 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-07-24 11:04:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 离散曲率计算(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 相对的两个角
|
|
|
|
|
|
*
|
|
|
|
|
|
* 边界顶点使用角度缺损公式修正。
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mesh 输入三角网格
|
|
|
|
|
|
* @return CurvatureResult 每顶点曲率
|
|
|
|
|
|
*
|
|
|
|
|
|
* @note 要求网格为流形;边界顶点曲率使用近似公式
|
|
|
|
|
|
* @code{.cpp}
|
|
|
|
|
|
* auto crv = compute_curvature(mesh);
|
|
|
|
|
|
* double max_curvature = *std::max_element(crv.gaussian.begin(), crv.gaussian.end());
|
|
|
|
|
|
* // 可用于特征检测、网格分割等
|
|
|
|
|
|
* @endcode
|
|
|
|
|
|
* @ingroup mesh
|
|
|
|
|
|
*/
|
2026-07-23 06:27:43 +00:00
|
|
|
|
CurvatureResult compute_curvature(const HalfedgeMesh& mesh);
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace vde::mesh
|