2014-03-25 39 views
0

我正在使用Bresenham的算法繪製圓圈。此代碼有效,但我需要實心圓,不僅是邊框。在OpenGL中填充了一些顏色的Bresenham圓圈

這是我的代碼:

void setPixel(int x,int y) { 
    glBegin(GL_POINTS); 
    glColor3f(0.0f, 1.0f, 0.0f); 
    glPointSize (20.0); 
    glVertex2i(x,y); 
    glEnd(); 
} 

void BresenhamKrug(int xCenter, int yCenter,int r){ //napravite parametarski poziv 
int x=0,y=r; 
int d=3-(2*r); 

glColor3f(0.5,0.3,1.); 


while(x<=y) 
{ 
    setPixel(xCenter+x,yCenter+y); setPixel(xCenter+y,yCenter+x); 
    setPixel(xCenter-x,yCenter+y); setPixel(xCenter+y,yCenter-x); 
    setPixel(xCenter-x,yCenter-y); setPixel(xCenter-y,yCenter-x); 
    setPixel(xCenter+x,yCenter-y); setPixel(xCenter-y,yCenter+x); 

    if (d<0) 
     d += (4*x)+6; 
    else{ 
      d += (4*(x-y))+10; 
      y--; 
    } 

    x++; 
} 
glFlush(); 
} 

有沒有辦法做到這一點?

+0

這是功課嗎?因爲如果不是這樣,Bresenham通過即時模式點繪製進行光柵化是使用OpenGL繪製圓的效率最低的方法。 – datenwolf

+0

不,我用bresenham點,一些圖片。因爲我想用這個算法來繪製圓圈。 –

回答

2

您可以將點存入數組並繪製多邊形,或者使用triangle fans

glBegin(GL_POLYGON); 

或:

void BresenhamKrug(int xCenter, int yCenter,int r){ //napravite parametarski poziv 
    int x=0,y=r; 
    int d=3-(2*r); 

    glColor3f(0.5,0.3,1.); 

    glBegin(GL_POLYGON); 

    while(x<=y) 
    { 
     glVertex2i(xCenter+x,yCenter+y); glVertex2i(xCenter+y,yCenter+x); 
     glVertex2i(xCenter-x,yCenter+y); glVertex2i(xCenter+y,yCenter-x); 
     glVertex2i(xCenter-x,yCenter-y); glVertex2i(xCenter-y,yCenter-x); 
     glVertex2i(xCenter+x,yCenter-y); glVertex2i(xCenter-y,yCenter+x); 

     if (d<0) 
      d += (4*x)+6; 
     else{ 
       d += (4*(x-y))+10; 
       y--; 
     } 

     x++; 
    } 
    glEnd(); 
    glFlush(); 
} 

,但不知道一個簡單的圓形方程不會有足夠的.. drawing circle,光柵化通過openGL的是handled

+0

它不是確切的圓圈,但它非常接近,因爲佈雷西姆阿爾格是非常好的。 –

0

最簡單的解決方案是修改算法,以便代替在邊緣周圍繪製像素,而是用線連接點。

void drawLine(const float x1, const float y1, const float x2, const float y2) { 
    const bool steep = (fabs(y2 - y1) > fabs(x2 - x1)); 
    if(steep) { 
     std::swap(x1, y1); 
     std::swap(x2, y2); 
    } 

    if(x1 > x2) { 
     std::swap(x1, x2); 
     std::swap(y1, y2); 
    } 

    const float dx = x2 - x1; 
    const float dy = fabs(y2 - y1); 

    float error = dx/2.0f; 
    const int ystep = (y1 < y2) ? 1 : -1; 
    int y = (int)y1; 

    const int maxX = (int)x2; 

    for(int x=(int)x1; x<maxX; x++) { 
     if(steep) { 
      setPixel(y,x); 
     } 
     else { 
      setPixel(x,y); 
     } 

     error -= dy; 
     if(error < 0) { 
      y += ystep; 
      error += dx; 
     } 
    } 
} 

void BresenhamKrug(int xCenter, int yCenter,int r){ //napravite parametarski poziv 
    int x=0,y=r; 
    int d=3-(2*r); 
    glColor3f(0.5,0.3,1.); 
    while(x<=y) { 
     drawLine(xCenter+x,yCenter+y, xCenter+y,yCenter+x); 
     drawLine(xCenter-x,yCenter+y, xCenter+y,yCenter-x); 
     drawLine(xCenter-x,yCenter-y, xCenter-y,yCenter-x); 
     drawLine(xCenter+x,yCenter-y, xCenter-y,yCenter+x); 
     if (d<0) 
      d += (4*x)+6; 
     else{ 
      d += (4*(x-y))+10; 
      y--; 
     } 
     x++; 
    } 
    glFlush(); 
} 

對於所有的意圖和目的,Bresenham的線算法可能是最合適的。

+0

OpenGL已經提供了線條和實心三角形柵格化。沒有必要重塑那個輪子。 – datenwolf

+0

鑑於海報明顯不顧性能,我假設問題是尋找圍繞Bresenham的算法解決方案,而不是關於OpenGL基元的講座。 – blockchaindev