Bresenham 的圆形绘制算法的这个实现有什么问题?
What's wrong in this implementation of Bresenham’s circle drawing algorithm?
我已经实现了 Bresenham 的圆算法。但是这段代码只输出了一个白色的window。不绘制圆形边界的单个像素。
此函数绘制 8 个对称点。
void plot_point(int x, int y, int xc, int yc)
{
glBegin(GL_POINTS);
glVertex2i(xc+x, yc+y);
glVertex2i(xc+x, yc-y);
glVertex2i(xc+y, yc+x);
glVertex2i(xc+y, yc-x);
glVertex2i(xc-x, yc-y);
glVertex2i(xc-y, yc-x);
glVertex2i(xc-x, yc+y);
glVertex2i(xc-y, yc+x);
glEnd();
}
此函数计算 x,y 坐标。
void bresenham_circle(int r)
{
int x = 0, y = r, dx;
plot_point(x, y, 0, 0);
dx = 3 - 2*r;
x += 1;
if(dx >= 0)
y -= 1;
while(x < y)
{
plot_point(x, y, 0, 0);
if(dx < 0)
dx += 4*x + 6;
else
dx += 4*(x-y) + 10;
if(dx >= 0)
y -= 1;
x += 1;
}
glFlush();
}
编辑:
这是 main() 和 display() 函数:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.0);
int radius = 8;
bresenham_circle(radius);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(640,480);
glutCreateWindow("Bresenham's Circle");
glClearColor(1.0, 1.0, .5, 1.0);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
我试过画一些单点,甚至在 space [(-1, -1), (1, 1)] 中,但仍然没有出现。
我这边工作正常:
确保你设置了合理的 projection/modelview 矩阵 + 圆半径(和 clear-color/draw-color),然后再放下你的圆几何:
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );
总计:
#include <GL/glut.h>
void plot_point( int x, int y, int xc, int yc )
{
glBegin( GL_POINTS );
glVertex2i( xc + x, yc + y );
glVertex2i( xc + x, yc - y );
glVertex2i( xc + y, yc + x );
glVertex2i( xc + y, yc - x );
glVertex2i( xc - x, yc - y );
glVertex2i( xc - y, yc - x );
glVertex2i( xc - x, yc + y );
glVertex2i( xc - y, yc + x );
glEnd();
}
void bresenham_circle( int r )
{
int x = 0, y = r, dx;
plot_point( x, y, 0, 0 );
dx = 3 - 2 * r;
x += 1;
if( dx >= 0 )
y -= 1;
while( x < y )
{
plot_point( x, y, 0, 0 );
if( dx < 0 )
dx += 4 * x + 6;
else
dx += 4 * ( x - y ) + 10;
if( dx >= 0 )
y -= 1;
x += 1;
}
}
void display()
{
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}
我已经实现了 Bresenham 的圆算法。但是这段代码只输出了一个白色的window。不绘制圆形边界的单个像素。
此函数绘制 8 个对称点。
void plot_point(int x, int y, int xc, int yc)
{
glBegin(GL_POINTS);
glVertex2i(xc+x, yc+y);
glVertex2i(xc+x, yc-y);
glVertex2i(xc+y, yc+x);
glVertex2i(xc+y, yc-x);
glVertex2i(xc-x, yc-y);
glVertex2i(xc-y, yc-x);
glVertex2i(xc-x, yc+y);
glVertex2i(xc-y, yc+x);
glEnd();
}
此函数计算 x,y 坐标。
void bresenham_circle(int r)
{
int x = 0, y = r, dx;
plot_point(x, y, 0, 0);
dx = 3 - 2*r;
x += 1;
if(dx >= 0)
y -= 1;
while(x < y)
{
plot_point(x, y, 0, 0);
if(dx < 0)
dx += 4*x + 6;
else
dx += 4*(x-y) + 10;
if(dx >= 0)
y -= 1;
x += 1;
}
glFlush();
}
编辑: 这是 main() 和 display() 函数:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.0);
int radius = 8;
bresenham_circle(radius);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(640,480);
glutCreateWindow("Bresenham's Circle");
glClearColor(1.0, 1.0, .5, 1.0);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
我试过画一些单点,甚至在 space [(-1, -1), (1, 1)] 中,但仍然没有出现。
我这边工作正常:
确保你设置了合理的 projection/modelview 矩阵 + 圆半径(和 clear-color/draw-color),然后再放下你的圆几何:
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );
总计:
#include <GL/glut.h>
void plot_point( int x, int y, int xc, int yc )
{
glBegin( GL_POINTS );
glVertex2i( xc + x, yc + y );
glVertex2i( xc + x, yc - y );
glVertex2i( xc + y, yc + x );
glVertex2i( xc + y, yc - x );
glVertex2i( xc - x, yc - y );
glVertex2i( xc - y, yc - x );
glVertex2i( xc - x, yc + y );
glVertex2i( xc - y, yc + x );
glEnd();
}
void bresenham_circle( int r )
{
int x = 0, y = r, dx;
plot_point( x, y, 0, 0 );
dx = 3 - 2 * r;
x += 1;
if( dx >= 0 )
y -= 1;
while( x < y )
{
plot_point( x, y, 0, 0 );
if( dx < 0 )
dx += 4 * x + 6;
else
dx += 4 * ( x - y ) + 10;
if( dx >= 0 )
y -= 1;
x += 1;
}
}
void display()
{
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}