Заполненный круг Брезенхема цветом в OpenGL

Я использую этот алгоритм Брезенхэма, чтобы нарисовать круг. Этот код работает, но мне нужно заполнить круг, а не только границы.

Это мой код:

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

Решение

Вы можете сохранить свои точки в массиве и вместо этого нарисовать многоугольник, или поклонники треугольника.

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();
}

но не уверен, что простого кругового уравнения было бы недостаточно.круг рисования, растеризация обрабатываются от openGL.

2

Другие решения

Самое простое решение состоит в том, чтобы изменить алгоритм так, чтобы вместо того, чтобы рисовать пиксели вокруг края, вы вместо этого соединяли точки с линиями.

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();
}

Для всех намерений и целей линейный алгоритм Брезенхэма, вероятно, является наиболее подходящим для этого.

0