圆在计算机生成的算法可以通过中点画圆法实现:
假设圆的方程为:x2+y2=r2
则有函数:F(x,y)=x2+y2-r2
当F(x,y)>0时,对应的点(x,y)在圆外;当F(x,y)<0时,对应的点(x,y)在圆外;
当F(x,y)=0时,对应的点(x,y)在圆上。
在第一象限上半1/8圆弧,如果已得到圆弧的象素点P(xp,yp),则下一可能的象素点是P1(xp+1,yp)和
P2(xp+1,yp-1)。究竟是P1还是P2 ,由P1和P2的中点M(xp+1,yp-0.5)的函数值F(xm,ym)来决定:
如果F(xm,ym)<0,说明圆弧在P1和M之间,取P1点为下一象素。
且下一象素的F(xp+2,yp-0.5)=F(xp+1,yp-0.5)+2xp+3
如果F(xm,ym)≥0,说明圆弧在P2和M之间,则取P2为下一象素。
且下一象素的F(xp+2,yp-1.5)=F(xp+1,yp-0.5)+2(xp-yp)+5
而F(1,r-0.5) = 1.25-r
计算机生成圆的C语言代码如下:
#include
#include
#include
#include
#include
void init(void); void CALLBACK reshape(GLsizei w,GLsizei h); void CALLBACK display(void); void MidCircle(int x0, int y0, int r); void init(void) { glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); } void CALLBACK reshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); } //画完整圆的子程序 void MidCircle(int x0, int y0, int r) //圆心为(x0, y0),半径为r { int x,y; float f; x=0;y=r;f=1.25-r; glBegin(GL_POINTS); glVertex2d(x0*10,(y0+r)*10); glVertex2d(x0*10,(y0-r)*10); glVertex2d((x0+r)*10,y0*10); glVertex2d((x0-r)*10,y0*10); glEnd(); while(x<=y){ if(f<0) f+=2*x+3; else{ f+=2*(x-y)+5; y--; } x++; glBegin(GL_POINTS); glVertex2d((x0+x)*10,(y0+y)*10); glVertex2d((x0-x)*10,(y0+y)*10); glVertex2d((x0+x)*10,(y0-y)*10); glVertex2d((x0-x)*10,(y0-y)*10); glVertex2d((x0+y)*10,(y0+x)*10); glVertex2d((x0-y)*10,(y0+x)*10); glVertex2d((x0+y)*10,(y0-x)*10); glVertex2d((x0-y)*10,(y0-x)*10); glEnd(); } } void CALLBACK display(void) { int i; int x0=5 ,y0=5 ,r=3; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-10.0, 110.0, -10.0, 110.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //画10*10的网格 glColor3f(0.0f,1.0f,0.0f); //绿色 for(i=0; i<=10; i++) //10条水平线 { glBegin(GL_LINES); glVertex2d( 0.0,i*10.0); glVertex2d(100.0, i*10.0); glEnd(); } glBegin(GL_LINES); //10条竖线 for(i=0; i<=10; i++) { glVertex2d(i*10.0, 0.0); glVertex2d(i*10.0, 100.0); } glEnd(); //把判断出圆的点画在生成的网格上 glColor3f(1.0f,1.0f,1.0f); //白色 glPointSize(10.0f); //点的大小 MidCircle(x0, y0, r);//调用画圆的子程序 glFlush(); } void main(void) { auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow("GL_0_2d"); init(); auxReshapeFunc(reshape); auxMainLoop(display); }