经典算法——绘制空心圆

在TurboC中,可以使用各种现成的函数绘制各种各样有趣漂亮的图形,而在VC中则比较难以实现。但是,我们可以用“*”当作点,连点成线,用来绘制各种线条或者图形。这就得看算法了,所谓算法就是解决问题的方法。这里呢,我们就一起来看看,在Visual C++6.0中,如何利用“*”绘制一个空心圆。大家有什么好的建议或者意见,都可以在我的评论栏里给我留言,希望我们相互学习,共同进步。


image.png


第一步:建立坐标系


根据上一次绘制余弦曲线的经验,我们可以把横轴(行方向)设为X坐标,纵轴(列方向)设为Y坐标。利用圆的公式:R²=X²+Y²,每一个y的值都会对应一个唯一的x值。同样,我们必须要理解,那就是先有算法后有程序,所以具体怎么实现,我们得先在草稿上表示出来,然后再依此来编写程序,具体情况如下图所示:

image.png

我们的方案是,先绘制左半边的图形,后绘制右半边的图形。Y从10到(-10)逐一递减,根据公式,每一个Y的值的会对应一个唯一的X值,我们再再对应的点上画上星号“*”,其余均输出空格即可。这里,我们设置圆的半径为10,所以整个图形的宽度是20。具体情况如下图所示:

image.png


第二步:设置横轴和纵轴(X,Y坐标轴)的步距

这里我们设置半径为10,所以Y的范围我们设为[10,-10],步距为1,总共20行。横坐标X的步距也是1,总共20列,但是考虑到屏幕的行间距和列间距不相等,所以我们还得加个调节系数,使m = 2.2*sqrt(100-y*y),其中,2.2就是调节系数。具体情况如下图:

image.png


第三步:用*号绘制空心圆

具体实现程序如下图所示,我们需要注意的是,调节系数不一定是2.2,不同的电脑有可能不一样,所以大家可以在2.2附近找,找到一个更合适的就行,调节系数不好,圆就不圆。图示如下:

image.png

运行结果如下图所示:

image.png


下面复习一下圆的相关知识:


圆的方程


在平面直角坐标系中,以点O(a,b)为圆心,以r为半径的圆的标准方程是(x-a)2+(y-b)2=r2
特别地,以原点为圆心,半径为r(r>0)的圆的标准方程为x2+y2=r2
方程x2+y2+Dx+Ey+F=0可变形为(x+D/2)2+(y+E/2)2=(D2+E2-4F)/4.故有:
(1)当D2+E2-4F>0时,方程表示以(-D/2,-E/2)为圆心,以image.png为半径的圆;
(2)当D2+E2-4F=0时,方程表示一个点(-D/2,-E/2);
(3)当D2+E2-4F<0时,方程不表示任何图形。
3、圆的参数方程
以点O(a,b)为圆心,以r为半径的圆的参数方程是 x=a+r·cosθ, y=b+r·sinθ, (其中θ为参数)
圆的端点式
若已知两点A(a1,b1),B(a2,b2),则以线段AB为直径的圆的方程为 (x-a1)(x-a2)+(y-b1)(y-b2)=0
圆的离心率e=0,在圆上任意一点的曲率半径都是r。
经过圆 x2+y2=r2上一点M(a0,b0)的切线方程为 a0·x+b0·y=r2
在圆(x2+y2=r2)外一点M(a0,b0)引该圆的两条切线,且两切点为A,B,则A,B两点所在直线的方程也为 a0·x+b0·y=r2
4、圆的三点式方程:过不共线的三点A(x1,y1),B(x2,y2),C(x3,y3)的圆的方程为

image.png

周长:C=2πr (r半径)

面积:S=πr²

半圆周长:C=πr+2r

半圆面积:S=πr²/2


下面用GDI绘制圆的代码:


  1. /此函数使用画图的库画一个圆  

  2. //参数使用 center_x 圆心x坐标、center_y 圆心y坐标、radius 半径、color 所使用的颜色  

  3. //绘图思想:  

  4. //把圆看成是以圆心为原点、x y分别为两坐标轴的一个函数。对于上半圆 y=sqrt(radius*radius-x*x);对于下半圆y=-sqrt(radius*radius-x*x)  

  5. //因此 遍历圆的图形所经历的所有x坐标[-radius,radius] ;求出上下两个y坐标值y1,y2 ;分别往上、下半圆上画点(x,y1) 、(x,y2)即可实现圆的绘制  

  6. //在实现中,由于在x轴边界处y点过于稀疏,因此变换坐标轴x<->y ; 重复上述绘图过程 即可实现正常圆的绘制  

  7. void Glib_Circle(int center_x,int center_y,  int radius,int color)  

  8. {  

  9.     int var,offset;  

  10.     //右方边界限制  

  11.     if(radius>SCR_XSIZE_TFT-center_x )  

  12.     {  

  13.         radius = SCR_XSIZE_TFT-center_x ;  

  14.     }     

  15.     //下方边界限制  

  16.     if( radius>SCR_YSIZE_TFT-center_y )  

  17.     {  

  18.         radius = SCR_YSIZE_TFT-center_y ;  

  19.     }  

  20.     //左方边界限制  

  21.     if(radius>center_x )  

  22.         radius = center_x;  

  23.     //右方边界限制  

  24.     if(radius>center_y)  

  25.         radius = center_y;  

  26.     //遍历x/y轴 向x/y两侧的圆上的点写像素  

  27.     for(var = -radius ;var<radius;var++)  

  28.     {  

  29.         offset = sqrt(radius*radius - var*var);  

  30.         PutPixel(center_x+var,center_y+offset,color);  

  31.         PutPixel(center_x+var,center_y-offset,color);  

  32.         PutPixel(center_x+offset,center_y+var,color);  

  33.         PutPixel(center_x-offset,center_y+var,color);  

  34.     }  

  35.       

  36. }  


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864