Files
ViewDesignEngine/include/vde/curves/surface_editing.h
T
茂之钳 bb0029234f
CI / Build & Test (push) Failing after 31s
CI / Release Build (push) Failing after 38s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
feat(v12): generative surfaces (Sweep/Loft/Net) + curve tools + surface analysis
M1 — Generative Surfaces:
- sweep_surface: Explicit/Spine/TwoGuides modes
- loft_surface: multi-section interpolation + guide + tangent constraints
- net_surface: bidirectional curve grid → NURBS

M3 — Curve Tools + Analysis:
- curve_tools: project_curve, parallel_curve, connect_curve(G1-G3), helix, isoparametric
- surface_analysis: inflection_lines, checker_mapping, surface_checker_report (A/B/C/D)
- 14/14 tests passed

Fixed: constraint_solver.h duplicate declaration, fea_mesh.h comment syntax

Pending: M2 surface editing (retrying)
2026-07-27 09:08:01 +08:00

96 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
/**
* @file surface_editing.h
* @brief 曲面编辑 — Match Surface(曲面匹配)
*
* 沿共享边界自动调整 target 曲面的控制点,使其与 reference 曲面达到
* G0(位置)、G1(切平面)、G2(曲率)或 G3(曲率变化率)连续性。
*
* 对标 CATIA / NX 的 Match Surface 功能。
*
* @ingroup curves
*/
#include "vde/curves/nurbs_surface.h"
#include "vde/core/point.h"
#include <vector>
namespace vde::curves {
using core::Point3D;
using core::Vector3D;
// ═══════════════════════════════════════════════════════════
// Match Surface — 曲面匹配
// ═══════════════════════════════════════════════════════════
/// 连续性等级
enum class ContinuityLevel {
G0 = 0, // 位置连续(C0
G1 = 1, // 切平面连续(C1
G2 = 2, // 曲率连续(C2
G3 = 3 // 曲率变化率连续(C3
};
/// 边界索引:0=umin, 1=umax, 2=vmin, 3=vmax
enum class BoundaryEdge {
UMin = 0,
UMax = 1,
VMin = 2,
VMax = 3
};
/// 曲面匹配选项
struct MatchSurfaceOptions {
ContinuityLevel continuity = ContinuityLevel::G1; ///< 目标连续性等级
int rows_to_adjust = 0; ///< 待调整控制点排数(0=自动,G0→1, G1→1, G2→2, G3→3
double tolerance = 1e-6; ///< 收敛容差
int boundary_samples = 20; ///< 边界采样点数
bool preserve_weights = true; ///< 是否保持权重不变
bool align_orientation = true; ///< 是否自动对齐曲面朝向
};
/// 曲面匹配结果
struct MatchSurfaceResult {
NurbsSurface matched_surface; ///< 匹配后的 target 曲面
double max_position_error = 0.0; ///< 最大 G0 位置误差
double max_tangent_error = 0.0; ///< 最大 G1 切平面角度误差(弧度)
double max_curvature_error = 0.0; ///< 最大 G2 曲率偏差
double max_derivative_error = 0.0; ///< 最大 G3 曲率变化率偏差
bool g0_ok = false;
bool g1_ok = false;
bool g2_ok = false;
bool g3_ok = false;
int rows_adjusted = 0; ///< 实际调整的控制点排数
std::vector<Point3D> control_displacements; ///< 所有控制点位移
};
/**
* @brief 曲面匹配
*
* 自动调整 target 曲面边界附近的控制点,使其沿 specified edge 与
* reference 曲面达到指定的连续性(G0/G1/G2/G3)。
*
* 算法:
* - G0: 将 target 边界控制点投影到 reference 边界
* - G1: 调整第1排控制点使切平面匹配
* - G2: 调整第1-2排控制点使曲率匹配
* - G3: 调整第1-3排控制点使曲率变化率匹配(最小二乘优化)
*
* @param target 待匹配曲面(边界控制点将被修改)
* @param reference 参考曲面(保持不变)
* @param edge target 曲面要匹配的边界
* @param options 匹配选项
* @return 匹配结果(含修改后曲面和误差统计)
*
* @note G3 需要修改 3 排控制点;G2 修改 2 排;G1/G0 修改 1 排
* @ingroup curves
*/
[[nodiscard]] MatchSurfaceResult match_surface(
const NurbsSurface& target,
const NurbsSurface& reference,
BoundaryEdge edge,
const MatchSurfaceOptions& options = {});
} // namespace vde::curves