1、计算机图形学实验报告实验名称: 菜单设计期末论文 课程名称: 计算机图形学 姓名: 学号: 专业班级: 日期: 2011.10.18 地点: 成绩: 地点: 计算机图形学实验报告 .11 实验目的 .31.1 学习 VC+菜单资源编辑器,菜单程序设计举例; .31.2 学习 Autocad 绘图的基本方法,了解常用的交互式技术; .31.3 学会区域填充; .31.4 学会颜色设置。 .32 实验内容 .3步骤 1: .3步骤 2: .3步骤 3: .4步骤 4:绘制直线 .4步骤 5:主要函数的设计 .45.1 加入成员变量 m_item,用于表示绘图选择项, .45.2 在构造函数中初始化
2、变量; .45.3 添加菜单驱动函数: .45.4 在 OnDraw()中不进行绘图,主要靠鼠标绘图。 55.5 鼠标左击和移动程序 .53 程序运行结果 .54 主要代码 .84.1 直线 .84.1.1 在 CMy_jhsView()中添加变量。 .84.1.2 在 OnDraw(CDC* pDC)中调用函数。 .84.1.3 DDAMouseLine 的定义 .84.2 圆 .94.2.1 在 CMy_jhsView()中添加变量。 .94.1.2 在 OnLButtonDown 中添加代码 .94.1.3 MidpointCircle 的定义 .94.3 椭圆 .104.3.1 在 C
3、My_jhsView()中添加变量。 .104.3.2 在 OnLButtonDown 中添加代码 .104.3.3 MidpointEllise 的定义 .114.4 区域填充 .124.4.1 在 CMy_jhsView()中添加变量。 .124.4.2 在 OnDraw(CDC* pDC)中调用函数。 .124.3.3 floodfill4 的定义 .124.5 颜色设置 .144.5.1 在 CMy_jhsView()中添加变量。 .144.5.2 Redraw 的定义 .145 实验心得 .141 实验目的了解常用的图形交互技术及实现方法,学习用户接口的程序设计。1.1 学习 VC+
4、菜单资源编辑器,菜单程序设计举例;1.2 学习 Autocad 绘图的基本方法,了解常用的交互式技术;1.3 学会区域填充;1.4 学会颜色设置。2 实验内容下面通过一个实例将绘图命令放在用户界面的菜单中,通过选择绘图命令来绘图。步骤 1:创建 jhs 应用程序工程文件,选择单文档应程序;步骤 2:利用 Resource View 设计菜单,如图 6-8 所示;图 6-8 菜单设计示例菜单 选项绘图( / 0:不绘图,1:直线,2:圆,3:椭圆,4:矩形;5.2 在构造函数中初始化变量;5.3 添加菜单驱动函数:方法是右击 CjhsView 类,选择消息映射函数(add window mess
5、age handler)。在弹出的对话框中的 class or object to handle 列表中选择 m_ine,按下“add and edit ”,并在弹出的对话框中输入菜单驱动函数的名字(OnMLine),按下 “确定 ”键。同理,建立画圆的菜单驱动程序OnMCircle。5.4 在 OnDraw()中不进行绘图,主要靠鼠标绘图。5.5 鼠标左击和移动程序3 程序运行结果a.直线b.交互式画圆c.交互式画椭圆d.区域填充e.颜色设置4 主要代码4.1 直线4.1.1 在 CMy_jhsView()中添加变量。/绘制直线m_p1.x=0; m_p1.y=0; /起点m_p2.x=0;
6、 m_p2.y=0; /终点m_ist=0; /0,第 1 点;1,第 2 点;4.1.2 在 OnDraw(CDC* pDC)中调用函数。if(m_item=1)pDC-SelectStockObject(NULL_BRUSH);DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(0,0,0); / 调用自定义的成员函数,用鼠标画直线4.1.3 DDAMouseLine 的定义void CMy_jhsView:DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color
7、)int length,i;float x,y,dx,dy;length=abs(x1-x0);if (abs(y1-y0)length)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;iSetPixel(int)x,(int)y,color);x=x+dx;y=y+dy;/pDC-MoveTo(x0,y0);/pDC-LineTo(x1,y1);4.2 圆4.2.1 在 CMy_jhsView()中添加变量。/绘制圆m_bO.x=0; m_bO.y=0
8、; /圆心m_bR.x=0; m_bR.y=0; /圆上的点m_ist=0; /圆心与圆上的点区别m_r=0; /圆的半径4.1.2 在 OnLButtonDown 中添加代码if(m_item=2)CDC *pDC=GetDC();pDC-SelectStockObject(NULL_BRUSH);if (!m_ist) /绘制圆m_bO=m_bR=point; /纪录第一次单击鼠标位置,定圆心m_ist+;elsem_bR=point; /记录第二次单击鼠标的位置,定圆周上的点m_ist-; / 为新绘图作准备m_r=ComputeRadius(m_bO,m_bR);MidpointCir
9、cle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0);ReleaseDC(pDC); /释放设备环境4.1.3 MidpointCircle 的定义void CMy_jhsView:MidpointCircle(CDC *pDC, int x0, int y0, int r, COLORREF color)int x,y;float d;x=0;y=r;d=1.25-r;CirPot(pDC,x0,y0,x,y,color);while (xSetROP2(R2_NOT); /设置异或绘图模式,并保存原来绘图模式pDC-SelectStockObject(NULL_BR
10、USH);if(m_ist=1)CPoint prePnt,curPnt;prePnt=RightBottom; /获得鼠标所在的前一位置curPnt=point;/绘制橡皮筋线CenterPoint.x=(LeftTop.x+prePnt.x)/2;CenterPoint.y=(LeftTop.y+prePnt.y)/2;a=(int)abs(prePnt.x-LeftTop.x)/2;b=(int)abs(prePnt.y-LeftTop.y)/2;MidpointEllise(pDC,CenterPoint.x,CenterPoint.y,a,b,RGB(255,0,0);/用异或模式重
11、复画圆,擦出所画的圆/用当前点作为右下角点,画椭圆 CenterPoint.x=(LeftTop.x+curPnt.x)/2;CenterPoint.y=(LeftTop.y+curPnt.y)/2;a=(int)abs(curPnt.x-LeftTop.x)/2;b=(int)abs(curPnt.y-LeftTop.y)/2;MidpointEllise(pDC,CenterPoint.x,CenterPoint.y,a,b,RGB(255,0,0);/用当前位置作为圆周上的点画圆RightBottom=point;pDC-SetROP2(nDrawmode); /恢复原绘图模式ReleaseDC(pDC); /释放设备环境