java b样条_深入理解B样条曲线(上)

本文介绍了B样条曲线作为贝塞尔曲线的改进,旨在解决局部控制的问题。B样条曲线通过控制点实现局部影响,公式较复杂,涉及Cox-deBoor递归公式。文章以均匀周期性B样条为例,详细展示了计算过程,强调了B样条曲线的控制点不影响整体曲线的特点,并提供了在线演示。
摘要由CSDN通过智能技术生成

计算机中绘制曲线,通过贝塞尔曲线已经满足了我们大部分需求,但是其存在某些缺点,比如移动某一个控制点会导致整个曲线发生变化,即无法局部控制曲线的走向。所以 B 样条曲线(B-Spline)为了解决贝塞尔曲线的缺陷应运而生。

不了解贝塞尔曲线的同学,可以去看我以前写的另外一篇文章《深入理解贝塞尔曲线》,后面的内容会假设你已经了解并掌握贝塞尔曲线的相关内容。

什么是 B 样条曲线?

解释 B 样条曲线之前,首先要解释一下什么是样条。样条是通过一组指定点集而生成平滑曲线的柔性带。 简单地说,B 样条曲线就是通过控制点局部控制形状的曲线。不太理解的同学可以通过本文底部的 demo 查看 B 样条曲线中,控制点对曲线绘制的影响。

B 样条曲线比贝塞尔曲线的设计要复杂许多,我们先通过他们的公式大致比较一下贝塞尔曲线与 B 样条曲线的区别:

贝塞尔曲线:

equation?tex=%5Cvec%7BP(t)%7D%20%3D%20%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D%5Cvec%7Bp_i%7DB_%7Bi%2Cn%7D(t)%2Ct%5Cin%5B0%2C1%5D

B 样条曲线:

equation?tex=%5Cvec%7BP(t)%7D%3D%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D%5Cvec%7Bp_i%7DB_%7Bi%2Cd%7D(t)%2C%5C%20%E5%85%B6%E4%B8%AD%0At_%7Bmin%7D%5Cleq%7Bt%7D%5Cleq%7Bt_%7Bmax%7D%7D%2C%0A2%5Cleq%7Bd%7D%5Cleq%7Bn%7D

先简单介绍一下上述公式的组成:

equation?tex=%5Cvec%7BP(t)%7D表示曲线上的点坐标向量。

equation?tex=n为控制点

equation?tex=%5Cvec%7Bp_i%7D数量。

equation?tex=%5Cvec%7Bp_i%7D为控制点坐标(

equation?tex=i 从 0 开始)。

equation?tex=B_%7Bi%2Cn%7D(t)为控制点坐标影响权重的多项式系数(式中

equation?tex=i 代表坐标的索引,

equation?tex=n 代表多项式最高的幂数)。

equation?tex=d影响 B 样条曲线的次数:

equation?tex=d%20-%201就是曲线的次数。

equation?tex=t是绘制曲线时的取值。

仔细观察这两个公式,我们可以看到以下的相同点:

都是求和公式。

都有一个

equation?tex=B_%7Bi%2Cx%7D(_t)的多项式系数(式中贝塞尔曲线 x=n,B 样条曲线 x=d)。

可以看出有以下几个不同点:

贝塞尔曲线的多项式幂数与控制点数量一致,而 B 样条曲线的多项式幂数更自由。

贝塞尔曲线

equation?tex=t的取值为固定的

equation?tex=%5B0%2C1%5D,而 B 样条曲线是在最大和最小节点值之间。

计算多项式

公式中其他值其实都比较清晰,问题的关键是需要搞清楚那个多项式

equation?tex=B_%7Bi%2Cn%7D(t)是什么!

计算这个多项式,我们使用到了Cox-deBoor 递归公式,公式内容如下(需要注意一点,如果遇到分母为 0的情况时,需要特殊处理为整体值为 0):

equation?tex=B_%7Bk%2C1%7D(u)%3D%0A%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%0A1%2C%20%26%20u_k%7B%5Cleq%7Du%7B%5Cleq%7Du_%7Bk%2B1%7D%20%5C%5C%0A%5C%5C%0A0%2C%20%26%20%E5%85%B6%E4%BB%96%0A%5Cend%7Bmatrix%7D%5Cright.

equation?tex=B_%7Bk%2Cd%7D(u)%3D%0A%5Cfrac%7Bu-u_k%7D%7Bu_%7Bk%2Bd-1%7D-u_k%7DB_%7Bk%2Cd-1%7D(u)%2B%5Cfrac%7Bu_%7Bk%2Bd%7D-u%7D%7Bu_%7Bk%2Bd%7D-u_%7Bk%2B1%7D%7DB_%7Bk%2B1%2Cd-1%7D(u)

从这个公式可以看出,递归公式的差异主要体现在

equation?tex=u_k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值