Files
茂之钳 73df04d5cb
CI / Build & Test (push) Failing after 35s
CI / Release Build (push) Failing after 1m32s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
feat(v5-M2): G2/G3 continuity + surface analysis + extension + N-side fill + advanced blend
M2.1 — G2/G3 连续性分析 (Agent #0):
- surface_continuity.h/.cpp: G0/G1/G2/G3 curve/surface detection
- Weingarten equation for curvature, Frénet frame, zebra stripe
- surface_analysis.h/.cpp: curvature_map, deviation_analysis, curvature_comb
- 24 tests (12 continuity + 12 analysis)

M2.2 — 曲面延伸 + N边填充 (Agent #1):
- surface_extension.h/.cpp: extend_surface(G1/G2), n_sided_fill, blend_surfaces
- Coons patch generalization for N-sided holes
- 16/16 tests passed in Docker container

M2.3 — 高级过渡曲面 (Agent #2):
- advanced_blend.h/.cpp: real implementations replacing stubs
- variable_radius_blend, multi_face_blend, rolling_ball_blend, face_face_blend
- Ball-rolling envelope + corner sphere filling
- 15+ tests with validate() verification
2026-07-26 20:58:31 +08:00

156 lines
6.0 KiB
C++

#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 <vector>
#include <utility>
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<double, double>, std::pair<double, double>> edge_param_range_a,
std::pair<std::pair<double, double>, std::pair<double, double>> 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<ContinuityLevel> per_sample; ///< 各采样点等级
std::vector<double> 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