B-样条基函数的金字塔算法实现(通式)
2006-11-09 15:28
218 查看
/*
@remark 根据计算B-样条基函数,金字塔算法通式
@para num 多项式的阶数
@para t 参数
@para SectNum B-样条分段的段号
@para PolynomialsValues 生成的多项式系数
@return 生成正确返回true,否则返回flase
*/
bool BSplineBase ( int stage, double t, int SectNum, std::deque<double>& PolynomialsValues )
{
double parentL, parentR, delta, cPL, cPR, value;
double tCurLeft, tCurRight;
int i, j, oldLength;
// 参数检查
delta = 1.0/(2*stage-1);
tCurLeft = (3+SectNum) * delta;
tCurRight = tCurLeft - delta;
PolynomialsValues.push_back ( 1 );
// 开始计算
for ( i=0; i<stage; ++i ){
oldLength = PolynomialsValues.size();
if ( oldLength == 1 )
parentL = parentR = PolynomialsValues[0];
else{
parentL = PolynomialsValues[0];
parentR = PolynomialsValues[1];
}
// 左边缘单独处理
cPL = tCurLeft - tCurRight;
value = Normalize( parentL * (tCurLeft-t) / cPL, 4 );
PolynomialsValues.push_back ( value );
// 处理中间部分
tCurLeft += delta;
for ( j=0; j<oldLength-1; ++j ){
parentL = PolynomialsValues[j];
parentR = PolynomialsValues[j+1];
cPL = tCurLeft - delta - tCurRight;
cPR = tCurLeft - tCurRight - delta;
value = ((t-tCurRight)*parentL)/cPL + ((tCurLeft-t)*parentR)/cPR;
PolynomialsValues.push_back ( Normalize( value, 4 ) );
tCurLeft += delta;
tCurRight += delta;
}
// 右边缘单独处理
tCurLeft -= delta;
cPR = tCurLeft - tCurRight;
value = Normalize( parentR * (t - tCurRight) / cPR, 4 );
PolynomialsValues.push_back ( value );
// 删除上一行的内容
PolynomialsValues.erase ( PolynomialsValues.begin(), PolynomialsValues.begin()+oldLength );
// 改变左右系数
tCurLeft = (3+SectNum) * delta;
tCurRight = tCurLeft - (i+2)*delta;
}
return true;
}
三次B样条:
@remark 根据计算B-样条基函数,金字塔算法通式
@para num 多项式的阶数
@para t 参数
@para SectNum B-样条分段的段号
@para PolynomialsValues 生成的多项式系数
@return 生成正确返回true,否则返回flase
*/
bool BSplineBase ( int stage, double t, int SectNum, std::deque<double>& PolynomialsValues )
{
double parentL, parentR, delta, cPL, cPR, value;
double tCurLeft, tCurRight;
int i, j, oldLength;
// 参数检查
delta = 1.0/(2*stage-1);
tCurLeft = (3+SectNum) * delta;
tCurRight = tCurLeft - delta;
PolynomialsValues.push_back ( 1 );
// 开始计算
for ( i=0; i<stage; ++i ){
oldLength = PolynomialsValues.size();
if ( oldLength == 1 )
parentL = parentR = PolynomialsValues[0];
else{
parentL = PolynomialsValues[0];
parentR = PolynomialsValues[1];
}
// 左边缘单独处理
cPL = tCurLeft - tCurRight;
value = Normalize( parentL * (tCurLeft-t) / cPL, 4 );
PolynomialsValues.push_back ( value );
// 处理中间部分
tCurLeft += delta;
for ( j=0; j<oldLength-1; ++j ){
parentL = PolynomialsValues[j];
parentR = PolynomialsValues[j+1];
cPL = tCurLeft - delta - tCurRight;
cPR = tCurLeft - tCurRight - delta;
value = ((t-tCurRight)*parentL)/cPL + ((tCurLeft-t)*parentR)/cPR;
PolynomialsValues.push_back ( Normalize( value, 4 ) );
tCurLeft += delta;
tCurRight += delta;
}
// 右边缘单独处理
tCurLeft -= delta;
cPR = tCurLeft - tCurRight;
value = Normalize( parentR * (t - tCurRight) / cPR, 4 );
PolynomialsValues.push_back ( value );
// 删除上一行的内容
PolynomialsValues.erase ( PolynomialsValues.begin(), PolynomialsValues.begin()+oldLength );
// 改变左右系数
tCurLeft = (3+SectNum) * delta;
tCurRight = tCurLeft - (i+2)*delta;
}
return true;
}
三次B样条:
相关文章推荐
- 拉格朗日插值的金字塔算法实现
- LK光流算法中是怎么使用金字塔的(就一个截图,大概明白点就行,毕竟有函数不必自己实现)
- bezier逼近的金字塔算法实现
- java每日一练(金字塔算法实现)
- 面试算法java方式实现打印金字塔三角形
- 数据结构与算法-----堆栈-使用链表(链式结构)实现
- 【字符串处理算法】将输入字符串中的各个单词反序的算法设计及C代码实现
- nachos 3.4 实现抢占式多级队列反馈算法
- 基于图的推荐算法及python实现
- C++ 快速排序实现(算法导论)
- [7] 金字塔(Pyramid)图形的生成算法
- python实现红包裂变算法
- 笔试算法题(02):N阶阶乘 & 双向循环链表实现
- 算法第四版 P426 无环加权有向图最短路径算法实现
- PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)
- KMP字符串模式匹配算法实现
- Imooc_Java实现消息摘要算法加密_2-2MD算法实现
- Hadoop学习之PageRank算法并行实现
- 数据结构经典算法汇总___图的邻接表实现
- 将一组数据中的元素打乱,可以当成洗牌的算法,也可以用去实现拼图游戏当中随机位置的产生