2013-03-24 45 views
12

私は、2次と3次のベジェ曲線を実装することができました。私たちは数式を持っているので、これはかなり簡単です。今、私は一般化を使用してn次ベジェ曲線を表現したい:n次ベジェ曲線?

enter image description here

enter image description here

enter image description here

私が使用しています出力をレンダリングするビットマップライブラリ、ここに私のコードです:

// binomialCoef(n, k) = (factorial(n)/(factorial(k) * factorial(n- k))) 
unsigned int binomialCoef(unsigned int n, const unsigned int k) 
{ 
    unsigned int r = 1; 

    if(k > n) 
     return 0; 

    for(unsigned int d = 1; d <= k; d++) 
    { 
     r *= n--; 
     r /= d; 
    } 

    return r; 
} 

void nBezierCurve(Bitmap* obj, const Point* p, const unsigned int nbPoint, float steps, const unsigned char red, const unsigned char green, const unsigned char blue) 
{ 
    int bx1 = p[0].x; 
    int by1 = p[0].y; 
    int bx2; 
    int by2; 

    steps = 1/steps; 

    for(float i = 0; i < 1; i += steps) 
    { 
     bx2 = by2 = 0; 
     for(int j = 0; (unsigned int)j < nbPoint; j++) 
     { 
      bx2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].x); 
      by2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].y); 
     } 

     bresenhamLine(obj, bx1, by1, bx2, by2, red, green, blue); 

     bx1 = bx2; 
     by1 = by2; 
    } 

    // curve must end on the last anchor point 
    bresenhamLine(obj, bx1, by1, p[nbPoint - 1].x, p[nbPoint - 1].y, red, green, blue); 
} 

ここで点のセットは、レンダリングするためにです:

Point ncurv[] = { 
        20, 200, 
        70, 300, 
        200, 400, 
        250, 200 
       }; 

、ここでは出力です:

enter image description here

赤い曲線は、立方ベジエです。青いものは4次ベジエであると考えられますが、これは3次ベジエと同じですが、この場合は同じではありませんか?

EDIT: 私は、左下のポイントは、あなたはわずか4ポイントに4次ベジェ曲線を構築しようとしている(0、0)

+1

が見える...あなたの合計に何も寄与しません。 –

答えて

4

あなたの式で合計...

enter image description here

は...すなわちn次のために、0からnまで実行されます。

あなたは4点を持っていますので、3次ベジェを描画しています。

あなたのコード内のエラーはここにある:

for(int j = 0; (unsigned int)j < nbPoint; j++) 

それは次のようになります。

for(int j = 0; (unsigned int)j <= nbPoint; j++) 

そうあなただけのn-0から1に反復しています。

3rd-order bezier

EDIT:関心のうち

それはそれだろう点だけだから欠落している(第5回)のポイントは、(0,0)にあったかのように、あなたが取得した形状が同じですあなたが小さいため、浮動小数点値の正確さを失っているように

4th-order bezier with 5th point at origin

+0

しかし、 'j'が' nbPoint'に達すると 'p [j]'はPoint配列の限界を超えていますか? – Jonas

+0

はい - 4次ベジェを作るには5番目の点を追加する必要があります。ですから、pはnbPoint + 1の大きさでなければなりません。 –

+0

はい、私は今理解しています。ありがとうございました。 – Jonas

2

であることに注意することを忘れていました。それがうまくいかないのは不思議ではない。あなたは、n + 1ポイントを必要とするベジェ

+3

これはどのように答えですか? –

+1

これは質問に対する答えを提供しません。著者からの批判または明確化要求 を投稿するには、投稿の下にコメントを残してください。 - [レビューから](https://stackoverflow.com/review/low-quality-posts/16357822) –

+0

@DonaldDuck:これは、質問を簡潔かつ正確に回答します。リチャード・イングリスの答えは、すべての素敵な写真やすべてでより良いですが、その答えの最初の文章を読むと、それは本質的に私と同じであることがわかります。 – TonyK

関連する問題