计算机图形学实验指导书.docx
- 文档编号:8219540
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:109
- 大小:810.44KB
计算机图形学实验指导书.docx
《计算机图形学实验指导书.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验指导书.docx(109页珍藏版)》请在冰豆网上搜索。
计算机图形学实验指导书
《计算机图形学》
实验与课程设计
运城学院计算机科学与技术系
2004年12月1日
目录
前言
实验1VisualC++图形程序设计6
一、实验目的6
二、实验任务6
三、基础知识和实验步骤6
3.1VisualC++6.0应用程序开发方法6
3.1.1VisualC++的集成开发环境6
3.1.2应用程序工程的建立方法7
3.1.3输入源程序进行程序设计10
3.2图形设备接口和图形程序设计12
3.2.1图形设备接口简介12
3.2.2绘制基本图形13
3.2.3画笔与画刷17
3.2.4文本显示21
3.3鼠标编程22
3.3.1鼠标消息处理22
3.3.2捕捉鼠标23
3.3.3鼠标编程综合示例23
3.4菜单程序设计28
3.4.1菜单编辑器29
3.4.2菜单消息响应31
3.4.3综合示例31
四、实验总结34
实验二基本图形(元)生成技术
(一)35
一、实验目的35
二、实验任务35
三、基本知识和实验步骤35
任务一:
实现DDA画线程序35
任务二、放大10倍后,算法演示程序36
任务三、加入鼠标功能,实现交互式画直线38
四、实验结果和分析40
五、实验总结40
实验三基本图形(元)生成技术
(二)41
一、实验目的41
二、实验任务41
三、实验内容41
任务一:
中点画圆法的扫描转换算法41
任务二:
添加鼠标程序,实现交互式画圆43
任务三:
编写中点画椭圆法的扫描转换程序45
任务四:
添加鼠标程序,实现交互式画椭圆47
四、实验结果、分析和总结48
实验四基本图形处理技术
(一)49
一、实验目的49
二、实验任务49
三、实验步骤49
四、实验结果、分析和总结52
实验五基本图形处理技术
(二)53
一、实验目的53
二、实验任务53
三、实验步骤53
任务一:
编码裁剪算法的程序设计53
任务二:
用鼠标实现交互式裁剪效果56
四、实验结果和总结59
实验六交互式技术和用户接口60
一、实验目的60
二、实验任务60
三、实验内容和实验步骤60
任务一:
菜单程序设计60
任务二:
AutoCAD交互式绘图简介64
四、实验总结69
实验七曲线与曲面70
一、实验目的70
二、实验任务70
三、实验内容和实验步骤70
任务一:
抛物线程序设计70
任务二:
Hermite曲线程序设计71
任务三:
Bezier曲线的算法实现72
任务四:
三次B样条曲线的算法实现77
实验八二维几何变换79
一、实验目的79
二、实验任务79
三、实验内容和实验步骤79
任务一:
根据数学模型,编写几何变换程序79
任务二:
利用鼠标实现交互式移动图形82
四、实验分析和总结84
实验1VisualC++图形程序设计
一、实验目的
VisualC++是在MicrosoftC的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今VisualC++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。
本章以VisualC++6.0为对象,主要介绍VisualC++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对VisualC++的学习,掌握VisualC++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
二、实验任务
1.学习VisualC++图形程序设计的方法;
2.掌握VisualC++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程、橡皮筋交互技术、画刷与画笔以及菜单设计等;
三、基础知识和实验步骤
3.1VisualC++6.0应用程序开发方法
介绍VisualC++6.0集成开发环境,以一个简单的实例介绍利用VisualC++应用程序工程建立方法和程序设计框架。
3.1.1VisualC++的集成开发环境
从开始菜单中启动VisualC++6.0,进入开发集成环境。
打开一个项目后,可以看到VisualC++6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图3.1所示。
标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。
菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。
工具栏列出了常用的菜单命令功能和对象方法。
工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。
输出窗口显示项目建立过程中所产生的各种信息。
屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。
图3.1VisualC++6.0集成开发环境
3.1.2应用程序工程的建立方法
VisualC++提供了一种称为AppWizard的工具,利用该工具,用户可以方便地按照自己的需要创建符合需要的应用程序框架。
在这个基础上,用户可以进一步将自己编写的程序加入到这个框架中,实现用户程序的功能。
下面介绍建立VcApp应用程序框架的方法,其它应用程序的方法都与此类似。
第一步:
启动VisualC++,选择工程方法
从开始菜单中选择VisualC++,进入VisualC++集成环境。
从文件菜单中选择新建(New)命令,弹出图3-2对话框。
切换到工程(Projects)标签,项目类型选择MFCAppWizard(exe),输入工程的名字(如VcApp),选择项目放置的位置,然后单击“确定”按钮。
图3-2VisualC++的New对话框
第二步:
设置应用程序的特性。
这些设置包括六个问题,每一个问题都有不同的选项供选择。
一个问题选择完后,通过“下一步”(Next)选择下一个问题,直到六个问题选择完毕。
还可以通过“上一步”(Back)返回上一个问题重新选择。
下面继续上面的例子,在单击“确定”按钮后,弹出第一个问题窗口,如图3-3所示。
第一个问题是建立什么类型的应用程序,有三个选项:
单个文档(Singledocument)、多重文档(Multipledocument)和基本对话(Dialogbased)。
单个文档应用程序主窗口中只有一个窗口,多重文档可以在主窗口中开多个子窗口,基本对话主窗口是一个对话框。
例中选择单个文档,单击“确定”,进入下一个问题,如图3-4所示。
第二个问题是数据库的支持,是否用ODBC存取数据库,有四个选项:
不包括数据库的支持(None)、仅包含ODBC头文件(Headerfilesonly)、指定一个数据库但没有文件支持和指定一个数据库但需要文件支持。
当选择了后两项,则需要用户选择一个已经建立的数据库。
例中不需要数据库支持,选择第一个选项“否”,进入第三个问题,如图3-5所示。
图3-3第一个问题:
选择应用程序的类型
图3-4第二个问题:
选择是否要用ODBC支持
第三个问题是对ActiveX的支持。
有五个选项:
(1)没有对ActiveX的支持;
(2)ActiveX容器,它可以包含链接和嵌入对象。
容器不能为其它的ActiveX程序提供支持,它只能维护嵌入对象;(3)微型服务器(Mini-server),应用程序不能独立运行,只能被调用为其它程序建立ActiveX对象。
(4)完整服务器(Full-server),它能够独立运行,并能够为其它应用程序建立ActiveX对象。
(5)容器和服务器,一个应用程序可以同时是容器和服务器。
在例子中,选择第一个选项,没有对ActiveX的支持,单击“下一个”(Next)进入下一个问题。
图3-5第三个问题:
选择是否对ActiveX的支持
第四个问题是应用程序的特性和高级选项,如图3-6所示。
图3-6应用程序的特性和高级选项
例中全部采用默认选项,进入下一个问题。
第五个问题是项目的风格、原文件注释和MFC库类型,如图3-7所示。
在例子中全部采用默认选项,进入第六个问题。
第六个问题是确定类名和文件名,如图3-8所示。
基于第一个问题到第五个问题的回答,AppWizard会把将要建立的新类的名称通知用户。
AppWizard将为应用程序建立四个新类,CVcAppApp是应用程序类,它是CWinApp的派生类。
CMainFrame是一个拥有应用程序主窗口的类。
CVcAppDoc和CVcAppView是该应用程序的文档和视图类。
这些名字用户可以改变。
最后单击“完成”(Finish),显示所建项目的信息,单击“确定”后,项目建立完成。
图3-7项目的风格、原文件注释和MFC库类型
图3-8通知MFC产生的类名称
3.1.3输入源程序进行程序设计
应用程序项目工程建立以后,就为应用程序的开发建立了一个框架,这是不输入任何程序代码,对该项目程序进行编译和运行,可以生成一个完整的窗口程序。
用户根据项目工程中的不同类,输入自己设计的程序代码,完成用户的程序设计。
例如,从VcAppClasses中找到CVcAppView的OnDraw()函数,如图3-9所示。
双击OnDraw()函数,这时系统会打开VcAppView.cpp文件,而且光标正置于OnDraw()函数中,在其中输入下列语句:
pDc->TextOut(30,30,”同学们好,欢迎使用VC++编程!
”);
编译并运行该程序,运行结果如图3-10所示。
图3-9输入程序源代码
图3-10运行结果
3.2图形设备接口和图形程序设计
3.2.1图形设备接口简介
在Windows系统中,程序都是通过一个叫做图形设备接口(GDI,GraphicsDeviceInterface)的抽象接口和硬件打交道,Windows会自动将设备环境表映射到相应的物理设备,并且会提供正确的输入/输出指令。
GDI是Windows系统核心的三种动态链接库之一,它管理Windows系统的所有程序的图形输出。
在Windows系统中,GDI向程序员提供了高层次的绘图函数,只要掌握这些绘图函数,就可以很方便地进行图形程序设计。
另一个概念是设备描述表(DC,DeviceContext)。
DC是一个数据结构,当程序向GDI设备中绘图时,需要访问该设备的DC。
MFC将GDI的DC封装在C++类中,包括CDC类和CDC派生类,这些类中的许多成员都是对本地GDI绘图函数进行简单封装而形成的内联函数。
DC的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,DC还要处理绘图属性的设置,如文本的颜色等。
程序员可以通过调用专门的GDI函数修改绘图属性,如SetTextColor()函数。
CDC类是GDI封装在MFC中最大的一个类,它表示总的DC。
表3.1列出了CDC中的一些常用绘图函数。
表3.1CDC类中常用绘图函数
函数
描述
使用频率
Arc()
椭圆弧
****
BitBlt()
把位图从一个DC拷贝到另一个DC
*
Draw3dRect()
绘制三维矩形
**
DrawDragRect()
绘制用鼠标拖动的矩形
**
DrawEdge()
绘制矩形的边缘
**
DrawIcon()
绘制图标
***
Ellipse()
绘制椭圆
****
FillRect()
绘制用给定的画刷颜色填充矩形
***
FillRgn()
绘制用给定的画刷颜色填充区域
***
FillSolidRed()
绘制用给定的颜色填充矩形
***
FloodFill()
用当前的画刷颜色填充区域
***
FrameRect()
绘制矩形边界
**
FrameRgn()
绘制区域边界
**
GetBKColor()
获取背景颜色
*****
GetCurrentBitmap()
获取所选位图的指针
**
GetCurrentBrush()
获取所选画刷的指针
***
GetCurrentFont()
获取所选字体的指针
***
GetCurrentPalette()
获取所选调色板的指针
***
GetCurrentPen()
获取所选画笔的指针
***
GetCurrentPosition()
获取画笔的当前位置
****
GetDeviceCaps()
获取显示设备能力的信息
**
GetMapMode()
获取当前设置映射模式
***
Getpixel()
获取给定像素的RGB颜色值
*****
GetPolyFillMode()
获取多边形填充模式
***
GetTextColor()
获取文本颜色
****
GetTextExtent()
获取文本的宽度和高度
**
GetTextMetrics()
获取当前文本的信息
**
GetWindow()
获取DC窗口的指针
**
GrayString()
绘制灰色文本
***
LineTo()
绘制直线
******
MoveTo()
设置当前画笔位置
******
Pie()
绘制饼图
***
Polygon()
绘制多边形
***
PolyLine()
绘制一组直线
***
RealizePalette()
将逻辑调色板映射到系统调色板
**
Rectangle()
绘制矩形
****
RoundRect()
绘制圆角矩形
***
SelectObject()
选择GDI绘图对象
**
SelectPalette()
选择逻辑调色板
**
SelectStockObject()
选择预定义图形对象
**
SetBkColor()
设置背景颜色
******
SetMapMode()
设置映射模式
***
SetPixel()
把像素设定为给定的颜色
******
SetTextColor()
设置文本颜色
******
StretchBlt()
把位图从一个DC拷贝到另一个DC,并根据需要扩展或压缩位图
*
TextOut()
绘制字符串文本
*****
这些函数的语法和使用可以通过MSDN帮助查询。
3.2.2节主要介绍Windows中基本图形,包括电、直线、圆、圆弧、矩形、椭圆、扇形、折线等程序设计
3.2.2绘制基本图形
(1)画点
SetPixel()函数可以在指定的坐标位置按指定的颜色画点。
函数原型说明如下:
其中,(X,Y)为点的坐标位置,crColor参数为点的颜色值。
如果函数调用成功,则函数返回像素的颜色值,否则返回值为-1。
颜色值通过RGB(Red,Green,Blue)来设置,其中三个参数取值0~255。
例如,在VcAPP项目中,在CVcAppView类中的OnDraw()函数中加入下列画点语句:
//绘制一组彩色点
//绘制一组彩色点
pDC->TextOut(20,20,"point:
");
pDC->SetPixel(100,20,RGB(255,0,0));
pDC->SetPixel(110,20,RGB(0,255,0));
pDC->SetPixel(120,20,RGB(0,0,255));
pDC->SetPixel(100,20,RGB(255,255,0));
pDC->SetPixel(100,20,RGB(255,0,255));
pDC->SetPixel(100,20,RGB(0,255,255));
pDC->SetPixel(100,20,RGB(0,0,0));
pDC->SetPixel(100,20,RGB(255,255,255));
运行程序,查看运行结果。
(2)画直线和折线
画直线需要LineTo()和MoveTo()两个函数的配合使用。
LineTo()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。
直线的颜色通过画笔的颜色来设定,在后面介绍。
LineTo()函数原型说明如下:
直线的终点位置由(nXEnd,nYEnd)指定。
如果函数调用成功,那么该点就成为当前位置,并返回TRUE,否则返回FALSE。
MoveTo()函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:
示例:
在CVcAppView类中的OnDraw()函数中加入下列画点语句:
//绘制直线
pDC->TextOut(20,60,"Line:
");
pDC->MoveTo(20,90);
pDC->LineTo(160,90);
Polyline()函数用来画一条折线,而PolyPolyline()函数则用来画多条折线,它们的函数原型说明如下:
在Polyline()函数中,lppt是指向折线顶点数组的指针,而cPoints是折线顶点数组中的顶点数。
例如,绘制一条具有4个顶点的折线,程序如下:
POINTpolylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};
pDC->Polyline(polylinepoint,4);
在PolyPolyline()函数中,lppt是指向保存顶点数组的指针,而各条折线的顶点数则保存在lpdwPolyPoints参数所指向的数组中,最后的cCount参数指定折线的数目。
例如:
POINTpolypolylinePt[9]={{95,160},{120,185},{120,250},{145,160},{120,185},
{90,185},{150,185},{80,210},{160,210}};
DWORDdwPolyPoints[4]={3,2,2,2};//分四段折线,分别占用3,2,2,2个顶点
pDC->PolyPolyline(polypolylinePt,dwPolyPoints,4);
注:
由于一条折线至少需要2个顶点,因此dwPolyPoints数组中的数不应该小于2。
(3)画弧线和曲线
通过Arc()函数画弧线或整个椭圆。
椭圆限定在一个矩形内,称为外接矩形。
Arc()函数的圆形说明如下:
其中,(nLeftRect,nTopRect)是外接矩形的左上角坐标值,(nRightRect,nBottomRect)是外接矩形的右下角坐标值。
而椭圆中心与点(nXStartArc,nYStartArc)所构成的射线与椭圆的交点成为弧线的起点,椭圆中心与点(nXEndArc,nYEndArc)所构成的射线与椭圆的交点成为弧线的终点。
椭圆上从始点到终点就形成一条弧线。
在Windows系统中,弧线从始点到终点的方向是逆时针方向,但可以通过SetArcDirection()函数将绘制弧线方向设置为顺时针方向。
示例,用Arc()绘制圆、圆弧和椭圆,程序如下:
for(i=0;i<6;i++)
{
pDC->Arc(260-5*i,70-5*i,260+5*I,70+5*i,260+5*i,70,260+5*i,70);
}
for(i=3;i<6;i++)
{
pDC->Arc(260-10*i,70-10*i,260+10*i,70+10*i,
(int)260+10*i*cos(60*3.1415926/180),
(int)70+10*i*sin(60*3.1415926/180),
(int)260+10*i*cos(60*3.1415926/180),
(int)70-10*i*sin(60*3.1415926/180));
pDC->Arc(260-10*i,70-10*i,260+10*i,70+10*i,
(int)260-10*i*cos(60*3.1415926/180),
(int)70-10*i*sin(60*3.1415926/180),
(int)260-10*i*cos(60*3.1415926/180),
(int)70+10*i*sin(60*3.1415926/180));
}
Bezier曲线是最常见的非规则曲线之一。
Bezier曲线属于三次曲线,需要四个控制顶点来确定一条Bezier曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。
PolyBezier()函数可以画出一条或多条Bezier曲线,其函数原型说明如下:
其中,lppt参数是曲线控制顶点所组成的数组,cPoints参数表示lppt数组中的顶点数,一条Bezier曲线需要四个控制顶点。
如果lppt数组用于画多条Bezier曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。
示例,给出四个控制顶点,画出一条Bezier曲线和特征多边形。
//绘制Bezier曲线
POINTpolyBezier[4]={{20,310},{60,240},{120,300},{160,330}};
pDC->Polyline(polyBezier,4);
pDC->PolyBezier(polyBezier,4);
(4)画封闭曲线
Windows中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。
Rectangle()函数用来画矩形,其函数原型说明如下:
其中,参数nLeftRect和nTopRect给出了矩形左上角的坐标,而nRightRect和nBottomRect则给出矩形的右下角坐标。
Ellipse()函数的作用则是画椭圆形。
在Ellipse()函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。
函数说明如下:
其中的参数说明与Rectangle()函数相同。
RoundRect()函数用来画圆角矩形,其函数的原型说明如下:
其中的前四个参数与Rectangle()函数相同,nWidth表示圆角的宽度,nHeight表示圆角的高度。
Polygon()函数用来画封闭的任意多边形,其函数原型说明如下:
其中的参数说明与Polyline()函数相同。
但两个函数有区别,Polygon()函数会自动将起点和终点相连形成封闭的多边形,而Polyline()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。
示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下:
//绘制矩形、圆角矩形、椭圆和多边形
pDC->Rectangle(190,270,250,310);
pDC->RoundRect(265,270,330,310,30,20);
pDC->Ellipse(260-50,200-30,260+50,200+30);
POINTpolygonPts[3]={{390,160},{430,220},{350,210}};
pDC->Polygon(polygonPts,3);
3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 指导书