2016-10-22 153 views
2

我正试图编写一个程序来生成C++中的曲线来绘制B样条曲线。这是我的代码看起来像。C++中的B样条

void drawBSplineCurve(vector<point> poly) 
{ 
    int n, d; 
    cout << "Enter degree of curve: "; 
    cin >> d; 
    n = poly.size(); 
    vector<double> uVec; 
    int i; 
    for(i=0;i<n+d;i++) 
    { 
     uVec.push_back(((double)i)/(n+d-1)); 
    } 
    double x, y, basis, u; 
    for(u=0;u<=1;u+=0.0001) 
    { 
     x = 0; 
     y = 0; 
     for(i=0;i<poly.size();i++) 
     { 
      basis = blend(uVec, u, i, d); 
      x += basis*poly[i].x; 
      y += basis*poly[i].y; 
     } 
     putpixel(roundOff(x), roundOff(y), YELLOW); 
    } 
} 

double blend(vector<double> &uVec, double u, int k, int d) 
{ 
    if(d==1) 
    { 
     if(uVec[k]<=u && u<uVec[k+1]) 
      return 1; 
     return 0; 
    } 
    double b; 
    b = ((u-uVec[k])/(uVec[k+d-1]-uVec[k])*blend(uVec, u, k, d-1)) + ((uVec[k+d]-u)/(uVec[k+d]-uVec[k+1])*blend(uVec, u, k+1, d-1)); 
    return b; 
} 

然而,正如你可以从我的输出曲线,由于某些原因看,往往会开始,并在原点结束(y轴反转)。任何帮助这个原因,将不胜感激。谢谢:d

Output

+0

你使用哪个图形库? –

+0

这是旧的'graphics.h'。可悲的是,我们被教导在大学里使用它。 – naman1901

+0

我认为你的'uvec'是错误的。它不应该在开始和结束时有重复的价值吗?此外,注意'blend()'中的零除。 –

回答

2

因此投资比我应该有办法更多的​​时间后,我终于找到了答案,在我的书,我错过了一条线。显然,该曲线仅限于uVec[d-1]uVec[n]之间的u值。

相关问题