2016-10-22 21 views
2

私は、Bスプライン曲線をプロットするためにC++で曲線を生成するプログラムを作成しようとしています。これは私のコードのようです。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

だから私は持っている必要がありますよりも道に多くの時間を投資した後、私は最終的に私は逃した私の教科書に並んで答えを見つけました。明らかに、曲線は、uの値がuVec[d-1]uVec[n]の間にのみ定義されています。

関連する問題