73df04d5cb
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
156 lines
6.0 KiB
C++
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
|