feat(v3.8): G2 continuity + surface extension + curvature (header only)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user