From 50d835e4956b68579d1acd254f4d5e889f0ed4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=82=E4=B9=8B=E9=92=B3?= Date: Fri, 24 Jul 2026 15:19:01 +0000 Subject: [PATCH] feat(v3.8): G2 continuity + surface extension + curvature (header only) --- include/vde/curves/nurbs_operations.h | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/include/vde/curves/nurbs_operations.h b/include/vde/curves/nurbs_operations.h index 2778db2..5ebd77e 100644 --- a/include/vde/curves/nurbs_operations.h +++ b/include/vde/curves/nurbs_operations.h @@ -167,4 +167,73 @@ using core::Vector3D; */ [[nodiscard]] NurbsCurve extract_boundary_curve(const NurbsSurface& surf, int edge); +/** + * @brief 曲面点的曲率(平均曲率与高斯曲率) + * + * 基于第一基本形式 (E,F,G) 和第二基本形式 (L,M,N) 的微分几何定义: + * - 平均曲率 H = (EN - 2FM + GL) / (2(EG - F²)) + * - 高斯曲率 K = (LN - M²) / (EG - F²) + * + * @param surf 输入曲面 + * @param u u 参数 + * @param v v 参数 + * @return (mean_curvature, gaussian_curvature) + * + * @note H > 0 表示曲面沿法向弯曲,K > 0 为椭圆点,K < 0 为双曲点 + * @code{.cpp} + * auto [H, K] = surface_curvature(surf, 0.5, 0.5); + * @endcode + * @see is_g2_continuous + * @ingroup curves + */ +[[nodiscard]] std::pair surface_curvature( + const NurbsSurface& surf, double u, double v); + +/** + * @brief 检查两曲面沿共享边界的 G²(曲率)连续性 + * + * 沿 surf_a 的指定边与 surf_b 的对应边采样多个点, + * 依次检查位置连续(G⁰)、切平面连续(G¹)和曲率连续(G²)。 + * + * @param surf_a 第一个曲面 + * @param surf_b 第二个曲面 + * @param edge surf_a 的边索引(0=umin, 1=umax, 2=vmin, 3=vmax) + * @param samples 沿边界的采样点数(默认 10) + * @return 所有采样点均满足 G² 连续时返回 true + * + * @note G² 连续性要求:位置、切平面和曲率在边界两侧一致 + * @note 默认容差:位置 1e-6,法向量 1e-3,曲率相对误差 1e-3 + * @code{.cpp} + * bool is_smooth = is_g2_continuous(surf_a, surf_b, 1); + * // 检查 surf_a 的 umax 边是否与 surf_b 的 umin 边 G² 连续 + * @endcode + * @see surface_curvature extend_surface + * @ingroup curves + */ +[[nodiscard]] bool is_g2_continuous(const NurbsSurface& surf_a, + const NurbsSurface& surf_b, int edge, int samples = 10); + +/** + * @brief 沿边界边延伸 NURBS 曲面 + * + * 在指定边方向上追加一行(或一列)控制点, + * 新控制点由边界控制点沿切向平移 distance 得到。 + * 节点向量相应扩展,延伸区间的参数长度为 distance。 + * + * @param surf 输入曲面 + * @param edge 延伸起始边(0=umin, 1=umax, 2=vmin, 3=vmax) + * @param length 延伸长度(参数空间) + * @return 延伸后的 NURBS 曲面 + * + * @note 延伸仅沿切向线性外推,不保证与原曲面 C² 连续 + * @note 大延伸长度可能引起自交或形状失真 + * @code{.cpp} + * auto extended = extend_surface(surf, 1, 0.5); // 沿 umax 延伸 0.5 + * @endcode + * @see is_g2_continuous + * @ingroup curves + */ +[[nodiscard]] NurbsSurface extend_surface(const NurbsSurface& surf, + int edge, double length); + } // namespace vde::curves