计算机图形学实验一Word下载.docx
《计算机图形学实验一Word下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
直线生成程序设计的步骤如下:
为编程实现上述算法,本程序利用最根本的绘制元素〔如点、直线等〕,绘制图形。
如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。
图1-1根本图形生成的程序运行界面
2.创立工程名称为“根本图形的生成〞单文档应用程序框架
〔1〕启动VC,选择“文件〞|“新建〞菜单命令,并在弹出的新建对话框中单击“工程〞标签。
〔2〕选择MFCAppWizard(exe),在“工程名称〞编辑框中输入“根本图形的生成〞作为工程名称,单击“确定〞按钮,出现Step1对话框。
〔3〕选择“单个文档〞选项,单击“下一个〞按钮,出现Step2对话框。
〔4〕承受默认选项,单击“下一个〞按钮,在出现的Step3~Step5对话框中,承受默认选项,单击“下一个〞按钮。
〔5〕在Step6对话框中单击“完成〞按钮,即完成“根本图形的生成〞应用程序的所有选项,随后出现工程信息对话框〔记录以上步骤各选项选择情况〕,如图1-2所示,单击“确定〞按钮,完成应用程序框架的创立。
图1-2信息程序根本
3.编辑菜单资源
设计如图1-1所示的菜单项。
在工作区的ResourceView标签中,单击Menu项左边“+〞,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。
此时VC已自动建好程序框架,如图1-2所示。
表1-1菜单资源表
菜单标题
菜单项标题
标示符ID
直线
DDA算法生成直线
ID_DDALINE
Bresenham算法生成直线
ID_BRESENHAMLINE
中点算法生成直线
ID_MIDPOINTLINE
4.添加消息处理函数
利用ClassWizard〔建立类向导〕为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。
表1-2菜单项的消息处理函数
菜单项ID
消息
消息处理函数
CONMMAN
OnDdaline
OnMidpointline
OnBresenhamline
5.程序结构代码,在CMyView.cpp文件中相应位置添加如下代码:
//DDA算法生成直线
voidCMyView:
:
OnDdaline()
{
CDC*pDC=GetDC();
//获得设备指针
intxa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0);
//定义直线的两端点,直线颜色
intx,y;
floatdx,dy,k;
dx=(float)(xb-xa),dy=(float)(yb-ya);
k=dy/dx,y=ya;
if(abs(k)<
1)
{
for(x=xa;
x<
=xb;
x++)
{pDC->
SetPixel(x,int(y+0.5),c);
y=y+k;
}
}
if(abs(k)>
=1)
for(y=ya;
y<
=yb;
y++)
SetPixel(int(x+0.5),y,c);
x=x+1/k;
}
ReleaseDC(pDC);
说明:
〔1〕以上代码理论上通过定义直线的两端点,可得到任意端点之间的一直线,但由于一般屏幕坐标采用右手系坐标,屏幕上只有正的x,y值,屏幕坐标与窗口坐标之间转换知识请参考第3章。
〔2〕注意上述程序考虑到当k1的情形x每增加1,y最多增加1;
当k>
1时,y每增加1,x相应增加1/k。
在这个算法中,y与k用浮点数表示,而且每一步都要对y进展四舍五入后取整。
//中点算法生成直线
OnMidpointline()
intxa=300,ya=200,xb=450,yb=300,c=RGB(0,255,0);
floata,b,d1,d2,d,x,y;
a=ya-yb,b=xb-xa,d=2*a+b;
d1=2*a,d2=2*(a+b);
x=xa,y=ya;
pDC->
SetPixel(x,y,c);
while(x<
xb)
{if(d<
0){x++,y++,d+=d2;
else{x++,d+=d1;
pDC->
ReleaseDC(pDC);
〔1〕其中d是xp,yp的线性函数。
为了提高运算效率,程序中采用增量计算。
具体算法如下:
假设当前像素处于d>
0情况,那么取正右方像素P1(xp+1,yp),判断下一个像素点的位置,应计算d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;
,其中增量为a。
假设d<
0时,那么取右上方像素P2〔xp+1,yp+1〕。
再判断下一像素,那么要计算d2 =F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5) + c=d+a+b,增量为a+b。
〔2〕画线从(x0,y0)开场,d的初值d0=F(x0+1,y0+0.5)=F(x0,y0)+a+0.5b,因F(x0,y0)=0,那么d0=a+0.5b。
〔3〕程序中只利用d的符号,d的增量都是整数,只是初始值包含小数,用2d代替d,使程序中仅包含整数的运算。
//Bresenham算法生成直线
OnBresenhamline()
intx1=100,y1=200,x2=350,y2=100,c=RGB(0,0,255);
inti,s1,s2,interchange;
floatx,y,deltax,deltay,f,temp;
x=x1;
y=y1;
deltax=abs(x2-x1);
deltay=abs(y2-y1);
if(x2-x1>
=0)s1=1;
elses1=-1;
if(y2-y1>
=0)s2=1;
elses2=-1;
if(deltay>
deltax){
temp=deltax;
deltax=deltay;
deltay=temp;
interchange=1;
elseinterchange=0;
f=2*deltay-deltax;
SetPixel(x,y,c);
for(i=1;
i<
=deltax;
i++){
if(f>
=0){
if(interchange==1)x+=s1;
elsey+=s2;
f=f-2*deltax;
else{
if(interchange==1)y+=s2;
elsex+=s1;
f=f+2*deltay;
〔1〕以上程序已经考虑到所有象限直线的生成。
〔2〕Bresenham算法的优点如下:
①不必计算直线的斜率,因此不做除法。
②不用浮点数,只用整数。
③只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。
④Bresenham算法的运算速度很快。
圆弧生成程序设计的步骤如下:
〔1〕创立应用程序框架,以上面建立的单文档程序框架为根底。
〔2〕编辑菜单资源。
在工作区的ResourceView标签中,单击Menu项左边“+〞,然后双击其子项IDR_MAINFRAME,并根据表1-3中的定义添加编辑菜单资源。
此时建好的菜单如图1-3所示。
图1-3程序主菜单
表1-3菜单资源表
圆
中点画圆
ID_MIDPOINTCIRCLE
Bresenham画圆
ID_BRESENHAMCIRCLE
〔3〕添加消息处理函数。
利用ClassWizard〔建立类向导〕为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-4建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。
表1-4菜单项的消息处理函数
OnMidpointcircle
OnBresenhamcircle
〔4〕程序结构代码,在CMyView.cpp文件中的相应位置添加如下代码。
OnMidpointcircle()//中点算法绘制圆,如图1-4所示
图1-4中点算法绘制圆
//TODO:
Addyourcommandhandlercodehere
intxc=300,yc=300,r=50,c=0;
floatd;
x=0;
y=r;
d=1.25-r;
SetPixel((xc+x),(yc+y),c);
SetPixel((xc-x),(yc+y),c);
SetPixel((xc+x),(yc-y),c);
SetPixel((xc-x),(yc-y),c);
SetPixel((xc+y),(yc+x),c);
SetPixel((xc-y),(yc+x),c);
SetPixel((xc+y),(yc-x),c);
SetPixel((xc-y),(yc-x),c);
while(x<
=y)
{if(d<
0)d+=2*x+3;
else{d+=2*(x-y)+5;
y--;
x++;
Se