1、7单击“完成”,创建了一项空的工程-绘图应用程序主框架。运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:1生成解决方案点击“生成-生成解决方案”, 生成了Debug版的可运行程序。2调试运行程序点击菜单“调试开始执行(不调试)”, 执行Debug版的可运行程序。结果如下:生成Release解决方案步骤如下:点击“生成-批生成”。2勾选“Release”,单击“生成”,生成可以独立于Visual C+ 2005外运行的.exe程序。3查看目录,sample.exe是Release版,单击即可以运行。运行结果:1弹出菜单设计器单击“解决方案管理器”窗口中的资源文件Sa
2、mple.rc,弹出资源视图,2插入一项菜单双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。右健单击菜单设计器的“帮助”,选择“新插入”,插入一项菜单。在新插入的菜单项的“Caption” 中输入“绘图”。3输入ID输入“打开”菜单项,输入“直线”菜单项,在“直线”菜单项下输入“DDA”菜单,“DDA”菜单的ID为ID_LINE_DDA。IDCaption功能ID_LINE_DDADDA用DDA发绘制直线4调出类视图窗口单击菜单“视图-类视图”, 在“解决方案管理器”窗口中出现“类视图”窗口。4生成菜单消息响应函数在类视图窗口,单击Csample
3、0View类,单击事件按钮,5选择ID_LINE_DDA的COMMAND,添加OnLineDDA事件。6进入代码编辑器在void Csample0View:OnLineDda()中的 / TODO: 在此添加命令处理程序代码处输入的自己代码:AfxMessageBox(Hello World,MB_OK,NULL);7修改项目字符集属性选择“项目”菜单-属性-,弹出“属性”对话框,选择“配置属性 -常规-字符集”,改为“未设置”。8运行结果重新生成解决方案,运行结果如下。 在此添加命令处理程序代码处输入的代码:/ TODO: Add your command handler code here
4、CClientDC *pdc=new CClientDC(this); CPen pen; pen.CreatePen(PS_DOT,1,RGB(255,0,0); CPen *oldpen=(CPen*)pdc-SelectObject(&pen);int x,y;y=100;for(x=100;xSetPixelV(x,y,RGB(255,0,0); pdc-DeleteDC();运行结果如下。四、 实验结果:创建绘图应用程序主框架结果应用程序编译运行结果五、 回答如下问题:解释以下每条命令的含义/定义一个指针类型的CClientDC对象,客户区设备上下文用于客/户区的输出,与特定窗口关联
5、CPen pen;/定义一个画笔对象pen.CreatePen(PS_DOT,1,RGB(255,0,0);/赋予pen对象以风格CPen *oldpen=(CPen*)pdc-/pdc-/画出像素坐标为(x,y),风格为红色的一点六、 其它的实验内容:答:工具条按钮的添加七、 实验中发现的问题及你解决的方法:发现的问题:调试过程中出现如下错误解决的方法:重新生成解决方案,如还出现则多生成几次。实验一 直线的生成算法1理解DDA算法2理解中点Bresenham算法3理解改进的Bresenham算法4了解DDA和Bresenham算法的区别,以及生成图形的差异原因二、实验内容:设计DDA算法程序
6、设计中点Bresenham算法程序改进的Bresenham算法添加函数:void DDALine(int Xa, int Ya, int Xb, int Yb)/DDA算法void CSampleView:DDALine(int Xa, int Ya, int Xb, int Yb) CClientDC *pdc=new CClientDC(this); float delta_x,delta_y; int dx,dy,steps,k; dx=Xb-Xa; dy=Yb-Ya; if(abs(dx)abs(dy) steps=abs(dx); else steps=abs(dy); delta_
7、x=(float)dx/(float)steps; delta_y=(float)dy/(float)steps; x=Xa; y=Ya; for(k=1;k 添加事件响应函数:/ 消息响应函数DDA算法程序的设计画直线OnDdaLine() DDALine(100,100,300,300);void LineBresenhams(int Xa,int Ya,int Xb,int Yb)/Bresenhams算法程序的设计画直线的实现LineBresenhams(int Xa,int Ya,int Xb,int Yb) CClientDC *pdc=new CClientDC(this); i
8、nt dx=abs(Xa-Xb); int dy=abs(Ya-Yb); int p=2*dy-dx; int twody=2*dy; int twodydx = 2*(dy-dx); int x,y,xend; if(XaXb) x=Xb; y=Yb; xend=Xa; else x=Xa;y=Ya; xend=Xb; while(xxend) x+; if(p0) e-=2*dx; /菜单响应函数生成直线ImproveBresenhams算法OnImprove() ImproveBresenhams(200,100,300,300);DDA算法的缺点是什么?DDA算法的缺点是:它的y和斜率
9、k必须用浮点数表示,而且每一步都必须对y进行舍入取整,这不利于用硬件实现。添加工具栏按钮DDA,Bresenham,Bresenham改进画直线在SampleView.cpp中添加代码:ON_COMMAND(ID_BUTTONDDALine,OnDda)ON_COMMAND(ID_BUTTONBresenham,OnBresenham)ON_COMMAND(ID_BUTTONImprovedBresenham,OnImprovedbresenham)调试点击工具栏按钮查看效果。在生成Release文件时出现错误,但调试时没有错误。查了资料,现在还没有解决。实验二:圆和椭圆的生成算法 B401机
10、房 时间: 星期四 节次: 第一大节 1、了解Bresenham法生成圆和椭圆方法2、掌握Bresenham生成圆和椭圆算法的基本思想、推导和算法Bresenham法生成圆Bresenham法生成椭圆步骤1:添加菜单“实验二”,子菜单如下:圆 ID_Circle步骤2:在SampleView类中添加函数bool CircleLine(x1,y1,r)实现代码:bool CSampleView:CircleLine(int x1, int y1, int r) int x,y,d; x = 0; y = r; d = 3 - 2 * r; while(x y) SetPixelV(x+x1,y+
11、y1,RGB(255,0,0);SetPixelV(y+x1,x+y1,RGB(255,0,0);SetPixelV(-y+x1,x+y1,RGB(255,0,0);SetPixelV(-x+x1,-y+y1,RGB(255,0,0);SetPixelV(-x+x1,y+y1,RGB(255,0,0);SetPixelV(-y+x1,-x+y1,RGB(255,0,0);SetPixelV(y+x1,-x+y1,RGB(255,0,0);SetPixelV(x+x1,-y+y1,RGB(255,0,0); if(d 0) d += 4 * x + 6; else d += 4 * (x - y
12、) + 10; y -; x +; if(x = y) return true;步骤3;添加画圆菜单响应函数:OnCircle() CircleLine(200,200,100);步骤四:调试运行。椭圆:ID_Ellipse在SampleView类中添加函数void Ellipse(int x1,int y1,int a, int b)/ 画椭圆的函数Ellipse(int x1,int y1,int a, int b) float d1,d2; int x,y; x=0; y=b; d1=b*b+a*a*(-b+0.25);SetPixelV(x+x1 ,y+y1 ,RGB(255,0,0)
13、;SetPixelV(-x+x1 ,-y+y1 ,RGB(255,0,0);SetPixelV(x+x1 ,-y+y1,RGB(255,0,0);SetPixelV(-x+x1 ,y+y1,RGB(255,0,0); while(b*b*(x+1)a*a*(y-0.5) if(d10) if(d2MoveTo(scx(0),scy(-ymax/2);LineTo(scx(0),scy(ymax/2);MoveTo(scx(-xmax/2),scy(0.0);LineTo(scx(xmax/2),scy(0.0); for(int x=0;=1;x=x+20) parallel(x,x/2);
14、for (i=0;iMoveTo(scx(x2i),scy(y2i);LineTo(scx(x2i+1),scy(y2i+1);旋转函数的添加,在CSampleView类里添加旋转函数void Rotate();/ 旋转再依次添加辅助函数及变量public: int scx(double xj); int scy(double yj); double affinex(double x,double y,double d); double affiney(double x,double y,double d); void parallel(double dx,double dy); double f33; /成员变量 double xmax; double ymax; void rotate(double theta);在SampleView.cpp中依次实现他们,函数如下:/平移函数Pan() static double x1=0.