2013-03-24 214 views
12

我設法實現了二次和三次貝塞爾曲線。它們非常簡單,因爲我們有一個公式。現在我想用泛化到代表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

紅色曲線是三次貝塞爾。藍色的應該是四階Bezier,它和立方Bezier一樣,但在這種情況下,它們是不一樣的!

編輯: 我忘了注意,左下角點爲(0,0)

+1

看起來你正在失去,因爲小浮點值的精度。 – 2013-03-24 14:55:32

回答

4

在公式中的總和......

enter image description here

...從0到n,即對於n階貝塞爾則需要n + 1個百分點。

你有4點,所以你正在繪製一個三階貝塞爾曲線。

在你的代碼中的錯誤是在這裏:

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

它應該是:

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

否則,你只能從0到n-1迭代。

3rd-order bezier

編輯:

出於興趣,你越來越形狀彷彿失蹤(5日)點在(0,0)是相同的,因爲這是唯一的一點,會毫無貢獻你的總和......

4th-order bezier with 5th point at origin

+0

但是當'j'達到'nbPoint'時,'p [j]'超過了Point數組的極限? – Jonas 2013-03-24 16:02:38

+0

是的 - 你需要添加第5點來製作第4階貝塞爾曲線。所以p需要大小爲nbPoint + 1。 – 2013-03-24 16:06:40

+0

是的,我現在明白了。謝謝。 – Jonas 2013-03-24 16:07:54

2

您正在嘗試構建僅四點一四階的貝塞爾曲線。難怪它不工作。

+3

這是一個怎樣的答案? – 2015-03-15 19:16:10

+1

這不提供問題的答案。要批評或要求作者澄清 ,請在其帖子下面留言。 - [來自評論](https://stackoverflow.com/review/low-quality-posts/16357822) – 2017-06-08 07:43:43

+0

@DonaldDuck:這簡潔而正確地回答了問題。理查德·英格利斯的答案比較好,包括所有這些精美的圖片和所有內容,但是如果你讀了這個答案的第一句話,你會發現它和我的基本相同。 – TonyK 2017-06-08 11:58:02