#pragma once /** * @file surface_continuity.h * @brief 曲面连续性分析 — G0/G1/G2/G3 连续性检测 * * 提供曲线间和曲面间沿公共边的连续性分类。 * * ### 连续性等级 * * | 等级 | 条件 | * |------|------| * | G0 | 位置连续:两端点重合 | * | G1 | 切向连续:一阶导数共线(方向一致) | * | G2 | 曲率连续:曲率大小和方向匹配 | * | G3 | 曲率变化率连续:曲率的变化率匹配 | * * @ingroup curves */ #include "vde/curves/nurbs_curve.h" #include "vde/curves/nurbs_surface.h" #include "vde/core/point.h" #include #include namespace vde::curves { // ═══════════════════════════════════════════════════════════ // Continuity Level Enum // ═══════════════════════════════════════════════════════════ /// 连续性等级 enum class ContinuityLevel { None, ///< 不连续(甚至不满足 G0) G0, ///< 位置连续 G1, ///< 切向连续 G2, ///< 曲率连续 G3, ///< 曲率变化率连续 }; /// 将 ContinuityLevel 转为可读字符串 [[nodiscard]] const char* to_string(ContinuityLevel level); // ═══════════════════════════════════════════════════════════ // Curve Continuity // ═══════════════════════════════════════════════════════════ /** * @brief 分析两条 NURBS 曲线在公共参数点的连续性 * * 在给定参数点计算两曲线的位置、一阶、二阶、三阶导数, * 按 G0→G1→G2→G3 逐级判定。 * * @param curve_a 第一条 NURBS 曲线 * @param t_a curve_a 上公共点的参数值 * @param curve_b 第二条 NURBS 曲线 * @param t_b curve_b 上公共点的参数值 * @param tol 位置容差(默认 1e-6) * @return 满足的最高连续性等级 * * @note G1 要求一阶导数共线(方向相同),G2 要求曲率向量一致, * G3 要求曲率变化率一致。判定是累积的:G3 自动满足 G2/G1/G0。 */ [[nodiscard]] ContinuityLevel continuity_type( const NurbsCurve& curve_a, double t_a, const NurbsCurve& curve_b, double t_b, double tol = 1e-6); /** * @brief 重载:在两条曲线端点处检测连续性 * * 自动探测 curve_a 和 curve_b 各两个端点,检查是否有重合端点对, * 然后调用上述函数分析该连接点的连续性等级。 * * @param curve_a 第一条曲线 * @param curve_b 第二条曲线 * @param tol 位置容差 * @return 若存在重合端点则返回连续性等级,否则返回 ContinuityLevel::None */ [[nodiscard]] ContinuityLevel continuity_type( const NurbsCurve& curve_a, const NurbsCurve& curve_b, double tol = 1e-6); // ═══════════════════════════════════════════════════════════ // Surface Continuity // ═══════════════════════════════════════════════════════════ /** * @brief 沿公共等参边分析两张 NURBS 曲面的连续性 * * 在沿公共边的采样点处评估曲面连续性,返回最弱点等级。 * 例如 surf_a 的 u=u_max 边与 surf_b 的 u=u_min 边相邻。 * * @param surf_a 第一张曲面 * @param surf_b 第二张曲面 * @param edge_param_range_a 公共边在 surf_a 上的参数范围 {{u, v_start}, {u, v_end}} * @param edge_param_range_b 公共边在 surf_b 上的参数范围 {{u, v_start}, {u, v_end}} * @param samples 沿边的采样点数量(默认 20) * @param tol 位置容差(默认 1e-6) * @return 所有采样点中的最低连续性等级 * * @note 若曲面在采样点间连续但曲面方向(法线)相反, * 仍判定为 G0(因为 G1 要求一阶导数方向一致)。 */ [[nodiscard]] ContinuityLevel surface_continuity( const NurbsSurface& surf_a, const NurbsSurface& surf_b, std::pair, std::pair> edge_param_range_a, std::pair, std::pair> edge_param_range_b, int samples = 20, double tol = 1e-6); /** * @brief 沿公共边自动检测并分析两张曲面连续性 * * 自动检测 surf_a 和 surf_b 的公共边(通过比较四条等参边界), * 然后调用 surface_continuity 分析。 * * @param surf_a 第一张曲面 * @param surf_b 第二张曲面 * @param samples 采样点数量 * @param tol 位置容差 * @return 所有公共边中的最低连续性等级(若无公共边则返回 None) */ [[nodiscard]] ContinuityLevel surface_continuity( const NurbsSurface& surf_a, const NurbsSurface& surf_b, int samples = 20, double tol = 1e-6); /** * @brief 曲面间连续性详细报告 * * 返回每个采样点的连续性等级向量,便于诊断。 */ struct SurfaceContinuityReport { ContinuityLevel worst; ///< 最弱等级 ContinuityLevel best; ///< 最佳等级 double g1_ratio; ///< G1 通过率 (0~1) double g2_ratio; ///< G2 通过率 (0~1) std::vector per_sample; ///< 各采样点等级 std::vector position_errors; ///< 各采样点位置误差 }; /** * @brief 获取曲面连续性详细报告 */ [[nodiscard]] SurfaceContinuityReport surface_continuity_report( const NurbsSurface& surf_a, const NurbsSurface& surf_b, int samples = 50, double tol = 1e-6); } // namespace vde::curves