/****************************************************************** 功能:输入代码实现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; } }

C++实现B样条基函数的递归算法

原文地址: https://www.cveoy.top/t/topic/neym 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录