用Bresenham算法画圆的步骤为:
(1)求误差初值,p1=3-2r; i=1;画点(0, r);
(2)求下一个光栅位置:xi+1=xi+1;if pi<0则yi+1=yi;否则yi+1=yi-1;
(3)画点(xi+1, yi+1);
(4)计算下一个误差:if pi<0则pi+1=pi+4xi+6;否则pi+1=pi+4(xi-yi)+10;
(5)i=i+1; if x=y则end;否则返2)。
代码如下:
#include <GL/glut.h>
#include <stdio.h>
int r;
void IntMidPointCircle(int r);
void myDisplay(void){
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(1);
glBegin(GL_POINTS);
glColor3f(0.0f,0.0f,1.0f);
IntMidPointCircle(r);
glEnd();
glFlush();
}
void CirclePoints(int x,int y){
glVertex2i(x,y);
glVertex2i(y,x);
glVertex2i(-x,y);
glVertex2i(y,-x);
glVertex2i(x,-y);
glVertex2i(-y,x);
glVertex2i(-x,-y);
glVertex2i(-y,-x);
}
void IntMidPointCircle(int r){
int x,y,d;
x = 0;
y = r;
d = 1 - r;
CirclePoints(x,y);
while(x < y){
if(d < 0)
d += 2 * x + 3;
else{
d += 2 * (x - y) + 5;
y--;
}
x++;
CirclePoints(x,y);
}
}
int main(int argc,char *argv[]){
scanf("%d",&r);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("HELLO WORLD!");
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-500.0, 500.0,-500.0, 500.0);
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}