给定若干数据点(0,1,·····,m),希望生成一条b样条曲线,尽可能的去逼近这些点。需要通过反求出控制点(0,1,···,n)生成逼近的b样条曲线。
如图蓝色点的为给定需要逼近的数据点,红色的线为b样条曲线。
推导公式:
- 将给定的数据点进行参数化(使用向心参数法)
- 通过参数化后的数据点,推导出节点向量(下图中有公式先推d,m+1数据点个数,n+1为控制点个数,p为生成的b样条次数。节点向量中,有p+1个0,p+1个1,以及1到n-p个推导出的节点向量)
- 构建矩阵N(m-1,n-1),矩阵R_matrix(n-1,3),即可反求出控制点(1,n-1)。(将第一个数据点作为第一个控制点,将最后一个数据点作为最后一个控制点,加入反求出的控制点集中)矩阵运算使用eigen库。R_matrix与R有关,xyz为自定义的结构体,保存xyz坐标,datapoint为数据点,BasicFunctionValue为b样条基函数,u_k为数据点的参数化,R的代码如下:
for (int i = 1; i <= m - 1; i++) { xyz temp; temp.x = datapoint.at(i).x - BasicFunctionValue(U_k.at(i), 0, p) * datapoint.at(0).x - BasicFunctionValue(U_k[i], n, p) * datapoint.at(m).x; temp.y = datapoint.at(i).y - BasicFunctionValue(U_k.at(i), 0, p) * datapoint.at(0).y - BasicFunctionValue(U_k[i], n, p) * datapoint.at(m).y; temp.z = datapoint.at(i).z - BasicFunctionValue(U_k.at(i), 0, p) * datapoint.at(0).z - BasicFunctionValue(U_k[i], n, p) * datapoint.at(m).z; R.push_back(temp); }
#全文参考《非均匀有理b样条》第二版 清华大学出版社