feat(v3.8): G2 continuity + surface extension + curvature (header only)
CI / Build & Test (push) Failing after 16m52s
CI / Release Build (push) Failing after 34s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled

This commit is contained in:
茂之钳
2026-07-24 15:19:01 +00:00
parent e573cf958f
commit 50d835e495
+69
View File
@@ -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<double, double> 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