#pragma once #include "vde/mesh/halfedge_mesh.h" #include namespace vde::mesh { using core::Point2D; using core::Point3D; using core::Vector3D; /** * @brief 热方法(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 和网格分辨率影响。 * * @param mesh 输入三角网格 * @param sources 源顶点索引列表(距离为 0 的顶点) * @param t 时间步长,< 0 时自动设为平均边长平方 * @return 每顶点到最近源点的测地距离 * * @note 要求网格为连通流形;时间步长 t 越小精度越高但数值越不稳定 * @code{.cpp} * auto dist = geodesic_distance(mesh, {0, 10, 20}); * // dist[i] = 顶点 i 到 {0,10,20} 中最近顶点的测地距离 * @endcode * @ingroup mesh */ std::vector geodesic_distance(const HalfedgeMesh& mesh, const std::vector& sources, double t = -1.0); } // namespace vde::mesh