C++实现B样条基函数的递归算法
/****************************************************************** 功能:输入代码实现Bspline函数的基函数
提示:(1) 参考P231页的BSpline曲线的基函数 (2) 采用递归的方法实现 (3) 调用 float Divide( float l_Operand, float r_Operand)实现除法, Divide函数处理了'除数为0'的情况
参数解释: t,k,m----参考BSpline函数的定义 nodes----节点矢量(t0, t1, t2, t3......);
*******************************************************************/ float CFreeform_CurveView::BKM (float t, int k, int m, float nodes[]) {
//添加代码.......................................
float value;
if(m == 1)
{
if (t >= nodes[k] && t < nodes[k + 1])
value = 1;
else
{
value = 0;
}
}
else if (m>1)
{
value=(Divide((t-nodes[k]),(nodes[k+m-1]-nodes[k]))*BKM(t,k,m-1,nodes)+
Divide((nodes[k + m] - t), (nodes[k + m] - nodes[k + 1]))*BKM(t, k + 1, m - 1, nodes));
}
return value;
} // 实现BSpline函数的基函数 float CFreeform_CurveView::BKM(float t, int k, int m, float nodes[]) { float value; if (m == 1) { // 当m为1时,只有一个基函数,即线性的B样条函数 if (t >= nodes[k] && t < nodes[k + 1]) value = 1; else value = 0; } else if (m > 1) { // 递归调用BKM函数,计算多项式的值 value = (Divide((t - nodes[k]), (nodes[k + m - 1] - nodes[k])) * BKM(t, k, m - 1, nodes) + Divide((nodes[k + m] - t), (nodes[k + m] - nodes[k + 1])) * BKM(t, k + 1, m - 1, nodes)); }
return value;
}
// Divide函数用于处理除数为0的情况 float Divide(float l_Operand, float r_Operand) { if (r_Operand == 0) { return 0; } else { return l_Operand / r_Operand; } }
原文地址: https://www.cveoy.top/t/topic/neym 著作权归作者所有。请勿转载和采集!