另外一种画圆的算法:算法的数学原理:我们知道圆的内接三角形中,如果有一条边是直径,那么该边所对应的角度是直角。而在解析几何中,对任意两条斜率存在的直线,如果它们相互垂直,那么它们的斜率相乘为-1,而倘若是在园外(稍微在圆外一点),则夹角变小,斜率相乘小于-1(待会儿给出证明),倘若在园内一点,则夹角变大,斜率相乘大于-1,如图:证明:(由于只需要画出1/8圆即能画出整个圆,因此以下以第二个八分圆证明)对于B点设(r为圆的半径)则,。对于B’点设其中则同理可得,对于B”点以上是对该数学方法的证明下面我们讨论一下具体的描点,如图:设我们已经画出了P点(P在第二个八分圆的圆弧上),则我们设P(x,y),则下一个应该描的点应该是P1或P2,我们取P1和P2的中点Pmid,我们只需要判断出Pmid与圆的关系即可判断应取P1还是P2了,如图:按照前面的论证方法,我们分别算出了,因为是否在圆上是以斜率相乘是否为-1为分界线的,所以我们令,则只需判断出是否大于0即可我们观察到,对于第二个八分圆,分母恒成立,则我们只需要判断分子是否大于0即可,当分子时,则Pmid在圆外,取P2当分子时,则Pmid在圆内,取P1如果相等,则我们约定取P2这样就可以画出圆来了,但是效率太低了,我们可以稍加改进,将其改变成增量的形式因为我们已经取了P点,则我们可以分情况讨论在P点之前一次的取点情况,共有两种情况,一是P’点,二是P”点,则对应这两种情况:如果是P’点,则计算的是P’mid点的斜率相乘的结果如果是P”点,则计算的是P”mid点的斜率相乘的结果我们设a为每一次的斜率相乘加1后的分子的值,则对应于P’mid而对应于P”mid而我们所需要求的Pmid点的由此,我们便将a的值表示成了增量的形式,通过判断a的正负来判断该点是在圆内还是圆外,具体的c代码算法部分如下所示:floata,x,y,r,espinon=0.00001;inttag;//tag是用来判别前一个点是P’还是P”的x=0;//tag==1,表示取的是P’,tag==0,表示取得是P”r=100;y=r;pDC->SetPixel(0,y,RGB(x,y,((x+y)/2)));a=(y-0.5)*(y-0.5)+(x+1)*(x+1)-r*r;if(a>espinon){pDC->SetPixel(x+1,y-1,RGB(x,y,((x+y)/2)));x++,y--;tag=1;}else{pDC->SetPixel(x+1,y,RGB(x,y,((x+y)/2)));x++;tag=0;}while(x<=y){switch(tag){case0:a+=2*x+1;break;case1:a+=2*x-2*y+1;}if(a>espinon){pDC->SetPixel(x+1,y-1,RGB(x,y,((x+y)/2)));x++,y--;tag=1;}else{pDC->SetPixel(x+1,y,RGB(x,y,((x+y)/2)));x++;tag=0;}}下图为用该算法画出的圆(圆心坐标是(100,,100),半径是100):算法的分析到此为止