当前位置: 首页 > news >正文

三次B样条曲线在参数u(u 不是原始节点向量中的节点)处打断成两条B样条曲线的方法

当一条三次B样条曲线在参数 u 处打断(u 不是原始节点向量中的节点),需要将其分割为两条新的B样条曲线时,可以使用 节点插入算法(Knot Insertion) 来实现。该方法基于 B样条的局部性质和节点插入理论,确保分割后的两条曲线在几何上与原曲线完全一致。

1. 基本定义
  • 曲线次数:p = 3(三次)
  • 控制点:P₀, P₁, ..., Pₙ
  • 节点向量:U = [u₀, u₁, ..., uₘ],其中 m = n + p + 1 = n + 4
  • 待插入参数:u ∈ (uₖ, uₖ₊₁),且 u ∉ U(即 u 不是原节点)

目标:

  • 将原曲线在参数 u 处打断
  • 得到两条新B样条曲线:
    • 第一条:对应参数区间 [u₀, u]
    • 第二条:对应参数区间 [u, uₘ]
2. 步骤一:确定节点区间

找到整数 k,使得: uₖ ≤ u < uₖ₊₁

这个 k 表示 u 所在的非均匀区间编号。

3. 步骤二:节点插入算法(Boehm 算法)

由于 u 不在原节点向量中,需插入一次(重数 r = 1),生成新的控制点和节点向量。

新节点向量 U':

U' = [u₀, u₁, ..., uₖ, u, uₖ₊₁, ..., uₘ]

总长度增加 1。

新控制点 Qᵢ 计算:

设新控制点为 Q₀, Q₁, ..., Qₙ₊₁

计算公式如下:

对于 i = 0 到 n:

  • 若 i ≤ k−3,则 Qᵢ = Pᵢ
  • 若 i ≥ k+1,则 Qᵢ = Pᵢ₋₁
  • 若 i = k−2, k−1, k,则按以下公式计算:

  αᵢ = (u − uᵢ) / (uᵢ₊₃ − uᵢ)
Qᵢ = αᵢ · Pᵢ + (1 − αᵢ) · Pᵢ₋₁

例如:

  • Qₖ₋₂ = αₖ₋₂·Pₖ₋₂ + (1−αₖ₋₂)·Pₖ₋₃
  • Qₖ₋₁ = αₖ₋₁·Pₖ₋₁ + (1−αₖ₋₁)·Pₖ₋₂
  • Qₖ = αₖ·Pₖ + (1−αₖ)·Pₖ₋₁

其余点平移:

  • Q₀ 到 Qₖ₋₃ 不变(若存在)
  • Qₖ₊₁ 到 Qₙ₊₁ 对应 Pₖ 到 Pₙ
4. 步骤三:分割为两条B样条曲线

插入节点 u 后,曲线在 u 处成为一个“角点”(但仍是 C² 连续,因仅插入一次),可安全分割。

第一段曲线(从起点到 u)
  • 控制点:Q₀, Q₁, ..., Qₖ
  • 控制点数量:k + 1
  • 节点向量:U₁ = [u₀, u₁, ..., uₖ, u, u, u, u]
    (重复 u 共 p+1 = 4 次,以闭合区间)
  • 参数范围:[u₀, u]
第二段曲线(从 u 到终点)
  • 控制点:Qₖ, Qₖ₊₁, ..., Qₙ₊₁
  • 控制点数量:n + 2 − k
  • 节点向量:U₂ = [u, u, u, u, uₖ₊₁, ..., uₘ]
    (开头重复 u 四次)
  • 参数范围:[u, uₘ]
5. 可选:提升 u 的重数至 p(用于分段端点插值)

若希望新曲线在 u 处精确经过断点 Qₖ(即端点插值),需将 u 的重数提升至 p = 3(或 p+1 = 4)。

可通过重复插入 u 节点最多 3 次(因原重数为 0)。

每次插入后更新控制点,最终 u 成为多重节点,Qₖ 即为曲线在 u 处的实际位置。

6. 总结流程(可直接操作)
  1. 找到 k 使得 uₖ ≤ u < uₖ₊₁
  2. 计算 αᵢ = (u − uᵢ)/(uᵢ₊₃ − uᵢ),i = k−2, k−1, k
  3. 插入节点 u,生成新控制点 Q₀ 到 Qₙ₊₁
  4. 分割控制点:
    • 第一段:Q₀ ... Qₖ
    • 第二段:Qₖ ... Qₙ₊₁
  5. 构造新节点向量(两端补全 u 的重复)
  6. 得到两条独立的三次B样条曲线
http://www.dtcms.com/a/456614.html

相关文章:

  • 清华字节开源HuMo: 打造多模态可控的人物视频,输入文字、图片、音频,生成电影级的视频,Demo、代码、模型、数据全开源。
  • Python私教FastAPI+React构建Web应用03 FARM技术栈介绍
  • win11+4060安装cuda,cuda toolkit,cudnn
  • Python小说图片PDF生成器开发详解
  • 一款小巧的绿色内存自动清理软件
  • 开源 C++ QT QML 开发(十一)通讯--TCP服务器端
  • 计算机毕业设计java共享茶室预约微信小程序 微信小程序中的共享茶室预订平台 茶室共享预约小程序的设计与开发
  • 《投资-104》价值投资者的认知升级与交易规则重构 - 如何从投资的角度选择创业的方向?
  • 网站底部素材临沂市平邑县建设局网站
  • 光通信|OAM-波长可控交叉连接
  • Redshift中锁定表的查询与处理
  • 利用AI+大数据的方式分析恶意样本(四十六)
  • 解码Linux环境搭建
  • 第8章:定时任务与触发器——让 Bot 主动服务
  • Javaweb--Vue
  • 大数据模糊计算
  • 2021年408真题易错知识点整理
  • 【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库
  • 凡科网站是骗子跨境网站开发公司
  • vite性能优化
  • git添加远程仓库报错To add an exception for this directory解决方案-优雅草卓伊凡
  • 手机AIDE使用OpenCV
  • AI智能体(Agent)大模型入门【9】--如何在pycharm等其他编译软件调用ocr工具【只写后端代码不演示】
  • 浅析SpringBoot框架常见未授权访问漏洞
  • 有什么可以做翻译的网站点的排版设计网站
  • 第五十三章 ESP32S3 TCPClient 实验
  • 中国突破柔性电池技术瓶颈:可弯折20000次引领能源存储革命
  • 网站制作公司的宣传海报品牌免费网站建设
  • 基于模板缓冲的矢量贴地显示
  • flink keyby使用与总结 基础片段梳理