Window图形编程基础 实验3文档格式.docx
- 文档编号:17830535
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:15
- 大小:981.58KB
Window图形编程基础 实验3文档格式.docx
《Window图形编程基础 实验3文档格式.docx》由会员分享,可在线阅读,更多相关《Window图形编程基础 实验3文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
创建基于MFC的SingleDocument应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求:
1、用户可以通过菜单选择绘图颜色;
2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形;
实验设计
1.创建应用程序框架
1)创建BasicCG工程文件
2)制作菜单
对象标志符
消息
函数名
所属类
ID_LINE_DDA
COMMAND
OnLineDda
CBasicCGView
ID_LINE_BRESENHAM
OnLineBresenham
ID_CIRCLE_BRESENHAM
OnCircleBresenham
ID_CIRCLE_MIDPOINT
OnCircleMidpoint
ID_ELLIPSE_BRESENHAM
OnEllipseBresenham
ID_ELLIPSE_MIDPOINT
OnEllipseMidpoint
表2-1需添加的工具栏按钮消息处理程序
选择菜单Meun,双击IDR_MAINFRAME,在出现的窗口中添加属性。
在菜单名字添加“图形绘制”:
并在此菜单中添加功能选项,设置下拉菜单:
最后得到的界面为:
新建一个图形类。
选择菜单InsertNewclass,Classtype选择“GenericClass”,Name输入类名,
如“CMyCG。
然后OK
此时,可以在VC开发平台左边的工作区中,看到新建的类了,如下图
2.实现绘图功能
1)向视图类中添加自定义的成员变量
最后得到:
向新建的图形类中添加成员函数(实际就是加入实验要求实现的图形生成算法的实现代码)。
在工作区中直接鼠标右键单击,选择“AddMemberFunction…”项,如下图:
添加成员函数
voidEllipseMidpoint(CDC*pDC,intx0,inty0,inta,intb,COLORREFcolor)
voidLineDDA(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor)
voidLineBresenham(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor)
voidCircleMidpoint(CDC*pDC,intx0,inty0,intr,COLORREFcolor)
2)在视图类CPP文件的构造函数中初始化成员变量
3.实现交互式绘图
1)鼠标消息响应函数框架
添加OnLButtonDown()函数
添加OnMouseMove()函数
2.图形绘制算法
1)DDA绘制直线
voidCBasicCGView:
:
LineDDA(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor)
{
intlength,i;
floatx,y,dx,dy;
length=abs(x1-x0);
if(abs(y1-y0)>
length)//直线斜率大于1,交换坐标
length=abs(y1-y0);
dx=(float)(x1-x0)/length;
dy=(float)(y1-y0)/length;
x=x0+0.5;
y=y0+0.5;
for(i=1;
i<
=length;
i++)
{
pDC->
SetPixel((int)x,(int)y,color);
x=x+dx;
y=y+dy;
}
//pDC->
MoveTo(x0,y0);
LineTo(x1,y1);
}
2)Bresenham画直线
LineBresenham(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor)
intlength,i,tx,ty;
length)
x=x0;
y=y0;
for(i=0;
i=i++)
{
pDC->
x=x+dx;
}
3)Bresenham绘制圆
CircleBresenham(CDC*pDC,intx0,inty0,intr,COLORREFcolor)
intx,y;
floatd;
x=0;
y=r;
d=3-2r;
CirPot(pDC,x0,y0,x,y,color);
while(d<
0)
if(d<
{
d+=4*x+6;
x++;
}
else
d+=4*(x-y)+10;
y--;
CirPot(pDC,x0,y0,x,y,color);
}
intCBasicCGView:
CirPot(CDC*pDC,intx0,inty0,intx,inty,COLORREFcolor)
SetPixel((x0+x),(y0+y),color);
SetPixel((x0+y),(y0+x),color);
SetPixel((x0+y),(y0-x),color);
SetPixel((x0+x),(y0-y),color);
SetPixel((x0-x),(y0-y),color);
SetPixel((x0-y),(y0-x),color);
SetPixel((x0-y),(y0+x),color);
SetPixel((x0-x),(y0+y),color);
return0;
4)中点法绘制圆
CircleMidpoint(CDC*pDC,intx0,inty0,intr,COLORREFcolor)
d=1.25-r;
while(x<
=y)
d+=2*x+3;
d+=2*(x-y)+5;
5)中点法绘制椭圆
EllipseMidpoint(CDC*pDC,intx0,inty0,inta,intb,COLORREFcolor)
floatd1,d2;
y=b;
d1=b*b+a*a*(-b+0.25);
SetPixel(x+x0,y+y0,color);
while(b*b*(x+1)<
a*a*(y-0.5))
if(d1<
d1+=b*b*(2*x+3);
d1+=(b*b*(2*x+3)+a*a*(-2*y+2));
y--;
SetPixel(x0+x,y0+y,color);
SetPixel(x0+x,y0-y,color);
SetPixel(x0-x,y0+y,color);
SetPixel(x0-x,y0-y,color);
}//上半部分
d2=(b*(x+0.5))*(b*(x+0.5))+(a*(y-1))*(a*(y-1))-(a*b)*(a*b);
while(y>
if(d2<
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
d2+=a*a*(-2*y+3);
}//下半部分
四、实验结果分析
图2-1图形绘制菜单
图2-2图形绘制效果
五、实验结论
1.DDA与Bresenham直线算法的比较
1)Bresenham算法的特点是:
不必计算直线之斜率,因此不做除法;
不用浮点数,只用整数;
只做整数加减法和乘2运
算,而乘2运算可以用硬件移位实现。
Bresenham算法速度很快,并适于用硬件实现.
2)DDA算法的特点:
该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。
五、参考文献
[1]计算机图形学实验指导书。
[2]《计算机图形学》作者:
杨钦徐永安翟红英出版社:
清华大学出版社
[3]计算机图形学实验模板。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Window图形编程基础 实验3 Window 图形 编程 基础 实验