前面两篇文章分享的是比较实用的贝塞尔曲线,下面我们重点介绍的是B样条曲线的定义、性质及编程实现。
首先,如何理解B样条?
1. 样条插值,三对角方程(函数、参数);
2. 给定划分,所有的B样条的全体组成一个线性空间,线性空间有基函数,这就是B样条的基函数;
3. 由B样条基函数代替bezier曲线中的Bernstein基函数,即B样条曲线。
由此可知:
• 代码实现
// 确定参数u所在的节点区间下标
int Knots::FindSpan(double u, int p) {
/* 特殊情况 */
mnN = mvU.size() - p - 1;
if ( u>= mvU[mnN])
return mnN - 1;
if ( u
return p;
// if (fabs(u-mvU[mvU.size() - p - 1]) < 1e-4 ){
// return mnN-1;
// }
int low = p;
int high = mvU.size() - p - 1;
int mid = floor((low+high) / 2);
while(u < mvU[mid] || u >= mvU[mid + 1])/* 进行二分搜索 */
{
if (u < mvU[mid])
high = mid;
else
low = mid;
mid = floor((low+high) / 2);
}
return