中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法。画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆。
类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处:
(1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3;
(2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5;
(3) d0=1-r,即点(0,r)代入圆中的值。
根据上述条件可以得出中点画圆代码(编程环境:codeblacks+EGE库):
1 #include <iostream> 2 #include <graphics.h> 3 using namespace std; 4 //进行对称点打亮 5 void wholeColor(int xc,int yc,int x,int y,int color) 6 { 7 putpixel(xc+x,yc+y,color);putpixel(xc+y,yc+x,color); 8 putpixel(xc-x,yc+y,color);putpixel(xc-y,yc+x,color); 9 putpixel(xc+x,yc-y,color);putpixel(xc+y,yc-x,color); 10 putpixel(xc-x,yc-y,color);putpixel(xc-y,yc-x,color); 11 } 12 //画圆 13 void circle(int xc,int yc,int r,int color) 14 { 15 int x=0,y=r,d=1-r; 16 wholeColor(xc,yc,x,y,color); 17 while(x<=y) 18 { 19 if(d<0) //走正右方 20 { 21 d+=2*x+3; 22 x++; 23 }else{ //走右下方 24 25 d+=2*(x-y)+5;x++;y--; 26 } 27 wholeColor(xc,yc,x,y,color); 28 } 29 } 30 31 int main() 32 { 33 initgraph(640,480); //图形库初始化 34 circle(200,300,56,RED); //中点坐标和半径,颜色 35 getch(); //等待用户操作 36 closegraph(); //关闭图形 37 return 0; 38 }