#pragma once /** * @file control_point_edit.h * @brief 曲面编辑 — Control Point Edit(控制点编辑) * * 直接修改 NURBS 曲面的指定控制点位置,返回一个新的修改后曲面。 * 保持所有权重大于 0,自动处理退化曲面。 * * 对标 CATIA / Rhino 的控制点编辑功能。 * * @ingroup curves */ #include "vde/curves/nurbs_surface.h" #include "vde/core/point.h" #include #include namespace vde::curves { using core::Point3D; using core::Vector3D; // ═══════════════════════════════════════════════════════════ // Control Point Edit — 控制点编辑 // ═══════════════════════════════════════════════════════════ /// 控制点编辑结果 struct ControlPointEditResult { NurbsSurface modified_surface; ///< 修改后的曲面 std::vector displacements; ///< 各控制点的实际位移 double max_displacement = 0.0; ///< 最大控制点位移 int points_modified = 0; ///< 实际修改的控制点数 bool weights_preserved = true; ///< 是否所有权重保持 > 0 }; /** * @brief 控制点编辑 * * 修改 NURBS 曲面的指定控制点位置,保持所有权重大于 0, * 返回一个新的修改后曲面。原始曲面保持不变。 * * 算法: * 1. 复制原始曲面的控制点网格和权重网格 * 2. 将指定索引的控制点移动到新位置 * 3. 确保所有权重 >= 1e-12(防止除零) * 4. 保留原有的节点向量和阶次 * 5. 返回新的 NurbsSurface * * @param surface 输入 NURBS 曲面 * @param cp_indices 待修改控制点的 (i, j) 索引列表 * @param new_positions 新位置列表,与 cp_indices 一一对应 * @return 编辑结果 * * @pre cp_indices 和 new_positions 大小一致 * @pre 所有索引在 [0, nu]×[0, nv] 范围内 * @note 所有权重保持 > 0,若输入权重 ≤ 0 则自动修正为 1e-12 * @ingroup curves */ [[nodiscard]] ControlPointEditResult control_point_edit( const NurbsSurface& surface, const std::vector>& cp_indices, const std::vector& new_positions); } // namespace vde::curves