#pragma once #include "vde/core/point.h" #include "vde/mesh/delaunay_3d.h" #include namespace vde::mesh { using core::Point2D; using core::Point3D; using core::Vector3D; /** * @brief Alpha Shapes 点云表面重建 * * 从 3D 点云的 Delaunay 四面体化中提取表面,通过参数 α 控制细节级别: * - α → ∞:返回凸包(所有边界四面体面都保留) * - α → 0:返回所有 Delaunay 面(非常详细,含内部结构) * - 中间值:剔除外接球半径 > α 的四面体,保留细节适中的表面 * * 算法:对每个 Delaunay 四面体,检查其外接球半径。 * 若半径 ≤ α,四面体保留;否则剔除。最终表面 = 保留四面体与 * 被剔除四面体(或外部)之间的边界三角形面。 * * @param points 输入 3D 点云 * @param alpha α 半径阈值,通常取平均点间距的 1~3 倍 * @return TetrahedronMesh 保留的四面体网格 * * @code{.cpp} * // 从点云重建表面 * auto tets = alpha_shapes(point_cloud, 0.5); * auto [verts, tris] = alpha_shapes_surface(tets); * @endcode * @see alpha_shapes_surface delaunay_3d * @ingroup mesh */ TetrahedronMesh alpha_shapes(const std::vector& points, double alpha); /** * @brief 将 Alpha Shapes 四面体网格的表面提取为三角形网格 * * 遍历四面体网格,提取所有仅出现在一个四面体上的面(边界面), * 即为重建的表面三角形。 * * @param tet_mesh Alpha Shapes 输出的四面体网格 * @return {顶点数组, 三角形索引数组} * * @note 表面三角形法向指向四面体外部(右手定则) * @see alpha_shapes * @ingroup mesh */ std::pair, std::vector>> alpha_shapes_surface(const TetrahedronMesh& tet_mesh); } // namespace vde::mesh