昨天是第19天,主要是用C++写CAD作业,生成B样条曲线,没有学C++,昨天调的差不多了,但是差最后一步,但今天已经解决了,主要问题是没有定义0/0=0,我参照网上写法,如果分母等于零,则令分母等于1,继续计算即可,以下为代码:
#include<iostream> #include<vector> using namespace std; //计算B样条曲线 class Bspline { public: Bspline(int n,int p); ~Bspline(); void U_generate(); int u_find(double u); void N0_calculate(double u);//计算N(i,0) double N_calculate(int c, int t,double u);//计算N(c,t,u) void point_calculate();//计算点坐标 //private: int n, p, m; vector<double>U;//断点 double N0[20]; //vector<double>N0; /// double P[6][2] = { {0,0},{0,1},{1,1},{1,-1},{2,-1},{2,0} };//控制点 double N[20][2] = { 0 }; vector<vector<double>>N; vector<double>interpoint; vector<vector<double>>interpoints; }; Bspline:: Bspline(int n = 6, int p = 2) :n(n), p(p) { m = n + p + 1; }; Bspline::~Bspline() {}; void Bspline::U_generate()//调试无误 { for (int i = 1; i <= p+1; i++) U.push_back(0); for (double i = 1/(double(n-p)); i <= 1-1/(double(n-p)); i += 1/(double(n-p))) U.push_back(i); for (int i = 1; i <= p+1; i++) U.push_back(1); } int Bspline::u_find(double u)//调试无误 { //U_generate(); int low = 0, high = 9, mid = int((low + high) / 2); while (u < U[mid] || u >= U[mid+1]) { if (u <= U[mid]) { high = mid; mid = int((low + high) / 2); } else { low = mid; mid = int((low + high) / 2); } } return mid; } void Bspline::N0_calculate(double u)//调试无误 { int k = u_find(u); for (int z = 0; z < n + p; z++) if (z == k) N0[z] = 1; //N0.push_back(1); else N0[z] = 0; //N0.push_back(0); } double Bspline::N_calculate(int c, int t,double u)//计算Ni,p(u),好像没错 { N0_calculate(u); if (c + t >= n + p) return 0; else if (t == 0) return N0[c]; else if ((U[c + t] - U[c])<1e-8&& (U[c + t + 1] - U[c + 1])>1e-8) return (u - U[c])*N_calculate(c, t - 1, u)+ ((U[c + t + 1] - u) / (U[c + t + 1] - U[c + 1])) * N_calculate(c + 1, t - 1, u); else if ((U[c + t] - U[c]) > 1e-8 && (U[c + t + 1] - U[c + 1]) < 1e-8) return ((u - U[c]) / (U[c + t] - U[c])) * N_calculate(c, t - 1, u)+ (U[c + t + 1] - u)*N_calculate(c + 1, t - 1, u); else if ((U[c + t] - U[c]) < 1e-8 && (U[c + t + 1] - U[c + 1]) < 1e-8) return (u - U[c])*N_calculate(c, t - 1, u) + (U[c + t + 1] - u)*N_calculate(c + 1, t - 1, u); else return ((u - U[c]) / (U[c + t] - U[c])) * N_calculate(c, t - 1, u) + ((U[c + t + 1] - u) / (U[c + t + 1] - U[c + 1])) * N_calculate(c + 1, t - 1, u); } void Bspline::point_calculate() { for (int k = 0; k <= 1; k++) { int s = 0; for (double u = 0; u <= 1; u+=0.1) { for (int i = 0; i <= n; i++) { N[s][k] += N_calculate(i, p, u) * P[i][k]; } s++; } } } int main() { int o = 0; Bspline ss(6,2); ss.U_generate(); cout<<"测试"<<ss.N_calculate(3, 2, 0.55)<< ss.N_calculate(0, 2, 0.99) <<endl;//测试N ss.point_calculate(); for (int i = 0; i <= 10; i++) { for (int j = 0; j <= 1; j++) { cout << ss.N[i][j]; if (j % 2 != 1) cout << ","; } cout << endl; } for (int i = 0; i < 8; i++) cout << ss.N0[i]; }看来经过一段时间的学习C++还是有些进步。