计算机图形学圆的生成算法的实现Word文档格式.docx
《计算机图形学圆的生成算法的实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学圆的生成算法的实现Word文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
![计算机图形学圆的生成算法的实现Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/8428a3f0-00e5-4fc3-ab05-b4f827478b92/8428a3f0-00e5-4fc3-ab05-b4f827478b921.gif)
<
1)圆的特征
圆的定义为到给定中心位置
距离为
的点集。
圆心位于原点的圆有4条对称轴:
和
。
若已知圆弧上一点
,可以得到其关于4条对称轴的其他7个点,这种性质称为八对称性。
b5E2RGbCAP
2.实现各种圆的生成算法,包括中点生成算法、Bresenham生成算法等。
程序运行后的菜单界面如图所示。
p1EanqFDPw
圆生成图形的程序运行界面
首先创建工程名为“圆的生成算法的实现”的单文档应用程序框架,操作步骤如下:
1)创建单文档应用程序框架。
启动VisualC++,选择“文件/新建”菜单命令,在弹出的新建对话框中单击“工程”标签;
选择.MFCAppWizard(exe>
,在“工程名称”编辑框中输入“圆的生成算法的实现”<
也可以使用英文名称),选择所要存放的位置后,单击“确定”按钮,出现Stept1对话框;
选择“单个文档”选项,单击“下一步”按钮,在接着的Stept2~Stept5中,均可以直接单击“下一步”按钮完成应用程序框架的构建。
也可以在Stept1步选择“单文档”<
Singledocument)后,直接单击“完成”按钮完成。
DXDiTa9E3d
2)添加菜单项及消息处理函数
在工作区中的ResourceView标签中,单击Menu项左边的“+”,然后双击其子项IDR_MAINFRAME,弹出编辑主菜单项,根据表1中定义的菜单项资源来编辑菜单,利用MFCClassWizard为应用程序添加与菜单项相关的消息处理函数。
RTCrpUDGiT
菜单标题
菜单项标题
菜单项ID
消息
消息处理函数
圆的生成
中点画圆
ID_MIDPOINTCIRCLE
COMMAND
OnMidpointcircle
Bresenham画圆
ID_BRESENHAMCIRCLE
OnBresenhamcircle
椭圆的生成
中点画椭圆
ID_MIDPOINTELLISPE
OnMidpointellispe
表1生成圆和椭圆的菜单项资源及消息处理函数
3)添加程序代码
在CMyView.cpp文件中相应的位置添加各算法的程序代码,在VisualC++的MFC中绘制图形,一般可以调用一个“CDC”类,从CDC开始,添加代码。
5PCzVD7HxA
中点算法画圆。
利用中点画圆算法画出圆心在
、半径为R的圆,其VC程序设计代码如下:
voidCMyView:
:
OnMidpointcircle(>
{
CDC*pDC=GetDC(>
intx0=150,y0=120,r=100,color=RGB(0,0,255>
x,y,d。
x=0。
y=r。
d=1-r。
pDC->
SetPixel(x,y,color>
while(x<
=y>
{
if(d<
0>
d+=2*x+3。
else{d+=2*(x-y>
+5。
y--。
}
x++。
pDC->
SetPixel(x+x0,y+y0,color>
SetPixel(-x+x0,y+y0,color>
SetPixel(-x+x0,-y+y0,color>
SetPixel(x+x0,-y+y0,color>
SetPixel(y+x0,x+y0,color>
SetPixel(-y+x0,x+y0,color>
SetPixel(-y+x0,-x+y0,color>
SetPixel(y+x0,-x+y0,color>
}
ReleaseDC(pDC>
Bresenham算法画圆。
利用Bresenham画圆算法画出圆心在
jLBHrnAILg
OnBresenhamcircle(>
intx0=100,y0=100,x,y,r=80,c=0。
floate,d。
e=3-2*r。
if(e<
{e=e+4*x+6。
x++。
else{e=e+4*(x-y>
+10。
SetPixel(x+x0,y+y0,c>
SetPixel(-x+x0,y+y0,c>
SetPixel(-x+x0,-y+y0,c>
SetPixel(x+x0,-y+y0,c>
SetPixel(y+x0,x+y0,c>
SetPixel(-y+x0,x+y0,c>
SetPixel(-y+x0,-x+y0,c>
SetPixel(y+x0,-x+y0,c>
中点算法画椭圆。
设中心在
,长半轴为
,短半轴为
其VC程序设计代码如下:
OnMidpointellispe(>
intx0=200,y0=100,a=120,b=60,x,y,color=100。
floatd1,d2。
y=b。
d1=b*b+a*a*(-b+0.25>
while(b*b*(x+1>
a*a*(y-0.5>
>
if(d1<
=0>
{d1+=b*b*(2*x+3>
else{d1+=b*b*(2*x+3>
+a*a*(-2*y+2>
d2=b*b*(x+0.5>
*(x+0.5>
+a*a*(y-1>
*(y-1>
-a*a*b*b。
while(y>
if(d2<
{d2+=b*b*(2*x+2>
+a*a*(-2*y+3>
else{d2+=a*a*(-2*y+3>
四、实验结果分析
调试是程序成功后,运行结果如下:
中点算法生成的圆<
蓝色圆弧)如图3-2,Bresenham算法生成的圆<
黑色圆弧)如图3-3,中点算法生成的椭圆如图3-4。
xHAQX74J0X
图3-2中点法画圆效果图
图3-3Bresenham算法画圆效果图
图3-4中点法画椭圆效果图
其中中点画圆法实现原理:
构造圆函数
,并构造判别式:
若
,则应取
为下一像素,而且再下一像素的判别式为:
为下一像素,而且下一像素的判别式为:
这里讨论的是按顺时针方向生成第二个八分圆,则第一个像素是
,判别式
的初始值
而Bresenham画圆法与中点画圆算法类似,考虑圆心在原点,半径为
的8分圆,取
为起点,按顺时针方向生成圆。
在这种情况下,从
开始,每步增加1,
直至
结束。
相应的
有两种选择:
或
选择的原则是考察理想的
值是否靠近
LDAYtRyKfE
通过本次“圆的生成”实验,在李老师的悉心指导下,我深刻的理解了圆生成的基本原理,对几种常用的圆生成算法有了更进一步的认识,了解了VisualC++等编程环境中常用控件命令与绘图函数,提高了自己独立动手操作的能力,同时大大激发了我对计算机图形学进一步学习的强大兴趣。
Zzz6ZB2Ltk
申明:
所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。