计算机图形学实验指导书(vc++版)

计算机图形学实验指导书(vc++版)
计算机图形学实验指导书(vc++版)

实验指导书

刘文涛

2013

目录

第一章图形学实验环境和要求 (4)

1.1 VC++实验环境 (4)

1.1.1 基本环境 (4)

1.1.1 开发图形程序的一般流程 (7)

1.1.3 基本绘图函数介绍 (11)

1.2 OpenGL (22)

1.2.1 OpenGL介绍 (22)

1.2.2 OpenGL开发环境 (24)

1.2.3 OpenGL函数 (24)

1.2.4 回调函数 (25)

1.2.4 一个典型OpenGL例程 (26)

1.3 实验要求 (29)

1.3.1 实验内容 (29)

1.3.2 实验方法 (29)

1.3.3 实验效果 (30)

第二章直线生成算法 (30)

2.1 实验原理 (30)

2.1.1 DDA算法 (30)

2.1.2 Bresenham算法 (30)

2.2 实验内容 (30)

2.3 参考示例程序 (30)

第三章圆和椭圆生成算法 (32)

3.1 实验原理 (32)

3.2 实验内容 (32)

3.3 参考示例程序1 (32)

3.4 参考示例程序2 (33)

第四章裁剪算法 (35)

4.1 实验原理 (35)

4.2 实验内容 (35)

4.3 示例程序 (35)

4.3.1 参考例子1 (35)

4.3.2参考例子2 (38)

第五章二维变换 (40)

5.1 实验原理 (40)

5.2 实验内容 (40)

5.3 示例程序 (40)

5.3.1参考例子1 (40)

第六章三维变换 (44)

6.1 实验原理: (44)

6.2 实验内容 (45)

6.3示例程序 (45)

第七章填充算法 (47)

7.1 实验原理: (47)

7.2 实验内容 (47)

7.3示例程序 (47)

第八章曲线曲面 (50)

8.1 实验原理 (50)

8.2 实验内容 (50)

8.3示例程序 (51)

8.3.1 参考例子(1) (51)

8.3.2 参考例子(2) (52)

8.3.3 参考例子(3) (54)

8.3.4 参考例子(4) (56)

第九章真实感图形绘制 (59)

9.1 实验原理 (59)

9.2 实验内容 (59)

9.3示例程序 (59)

9.3.1参考例子(1) (59)

9.3.2参考例子(2) (61)

9.3.3参考例子(3) (63)

第十章动画 (66)

10.1 实验原理 (66)

10.2 实验内容 (66)

10.3示例程序 (66)

10.3.1 参考例子 (66)

参考文献: (72)

第一章图形学实验基础

1.1 VC++实验环境

1.1.1 基本环境

Microsoft Visual C++ 6.0 是微软推出的功能强大的可视化C/C++语言编译器,运行在Windows 9x/2000/NT等平台上,可以建立32位应用程序。运用这个强大的工具,可以很快地建立具有图形界面、能够运行于Windows操作系统上、有很复杂的功能的程序。在VC 中提供了Windows编程所需的Windows API,以及建立在其基础之上的类库--Microsoft Foundation Classes(MFC),前者是编写32位Windows程序所必需的应用程序接口,而后者提供了建立较大规模软件的解决方案,正逐渐成为许多C++编译器进行Windows软件开发的工业标准。另外,Visual C++还提供了可视化的编辑工具,使无论是源代码的编辑,还是应用程序界面设计,都变得十分简单。VC还具有强大的Debug功能,对于调试程序来说,使用VC的Debug工具将使工作量大大降低。而在其提供的各种功能中,与图形学直接相关的部分,是其提供的设备无关性和丰富的绘图功能。

Windows是图形界面的操作系统,Windows程序可以使用系统提供的图形设备界面(Graphics Device Interface,GDI)绘制比Turbo C中美观、丰富得多的图形,而且其实现十分的简单。另外,Visual C++中还提供了对OpenGL图形编程的支持,可以简单快速的实现3维场景的渲染,为其加上光照、纹理、雾效等等。后面还要详细介绍OpenGL相关内容。

在Windows这样一个图形界面操作系统中,图形操作是十分重要的。图形是Windows

的主体。所有的信息,包括文本,最终都是由图形来实现的。在Windows程序中,并不是把图形直接画到硬件上去,而是使用一个与硬件无关的设备环境来表示逻辑的设备。在绘图工作开始之前,必须申请一个设备环境。Win32 API提供了4种设备环境:

显示器环境:支持图形在视频显示器上绘制

信息环境:用于检索设备数据

内存环境:支持在位图上进行图形操作

打印机环境:支持在打印机或绘图仪上进行图形操作

Windows体系结构的一个重要组件是图形设备界面(Graphics Device Interface,GDI)。GDI为Windows提供了所有的基本绘图函数。在Windows的GDI函数中,使用设备环境来作为一个参数。GDI通过调用相应设备的驱动程序来响应Windows绘图函数的调用。这种机制实现了硬件无关性,即无需自己编写底层驱动程序代码,因为Windows本身已经包含了这些驱动程序。

Microsoft基础类库(Microsoft Foundation Classes,MFC)是专门用来为Windows开发C++图形界面应用程序的类库。它是随着面向对象的编程技术的产生而产生的。Windows API是一种过程接口,当面向对象的编程技术出现之后,就需要为Win32程序建立一种面向对象的接口。1992年,Microsoft公司开发了面向对象的应用程序框架(Application Frameworks,AFX),后来演变成了MFC。实际上,MFC的内部大部分仍然是通过Windows API 来实现的。

使用MFC提供的基于对话框程序的模版,我们可以迅速建立一个适于绘图而且具有较好的交互性的应用程序框架。

图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。

GDI负责Windows的所有图形输出,包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面。

三种图形输出类型

应用程序可以使用GDI创建三种类型的图形输出:矢量输出、光栅图形输出和文本输出。

矢量图形输出

矢量图形输出指的是创建线条和填充图形,包括点、直线、曲线、多边形、扇形和矩形的绘制。

光栅输出

光栅图形的输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。在屏幕上表现为对若干行和列的像素的操作,在打印机上则是若干行和列的点阵的输出。

光栅图形输出的优点是速度很快,它是直接从内存到显存的拷贝操作。缺点是需要额外的内存空间。Windows在绘制界面时使用了大量的光栅输出。

文本输出

与DOS字符方式下的输出不同,Windows是按图形方式输出的。这样,在输出文本时,必须以逻辑坐标为单位计算文本的输出位置,而不是象DOS下以文本行为单位输出文本。这比DOS下的文本输出要难一些。

但是,按图形方式输出文本也给文本输出带来很大的灵活性。用户可以通过调用各种GDI函数,制造出各种文本输出效果,包括加粗、斜体、设置颜色等。

Windows还提供了一种TrueType(写真字体)。TrueType字体用一组直线和曲线命令及一些参数来描述字体的轮廓。Windows可以通过参数来调整直线的长度和曲线的形状,从而实现对字体的自由缩放。

介绍MFC中与GDI有关的类:

为了支持GDI绘图,MFC提供了两种重要的类:设备上下文类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。

1)设备上下文类

设备上下文类包括CDC和它的派生类CClientDC、CPaintDC、CWindowDC、CMetaFileDC。

CDC是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。CDC类封装了所有图形输出函数,包括矢量、光栅和文本输出。

CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:

CClientDC dc(this);//this一般指向本窗口或当前活动视图

dc.TextOut(10,10,str,str.GetLength());

//利用dc输出文本,如果是在CScrollView中使用,还要注意调

//用OnPrepareDC(&dc)调整设备上下文的坐标。

CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。

EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。除非要自己绘制窗口边框和按钮(如一些CD播放程序等),否则一般不用它。

CMetaFileDC专门用于图元文件的绘制。图元文件记录一组GDI命令,可以通过这一组GDI命令重建图形输出。使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中。

2)图形对象类

图形对象类包括CGdiObject、画笔、刷子、字体、位图、调色板、区域等。CGdiObject 是图形对象类的基类,但该类不能直接为应用程序所使用。要使用GDI对象,必须使用它的派生类:画笔、刷子、字体、位图、区域等等。

使用图形对象要注意两点:

1.同其他MFC对象一样,GDI对象的创建也要分为两步:第一步,是定义一个GDI绘图对象类的实例;第二步调用该对象的创建方法真正创建对象。

2.创建对象:使用该对象,首先要调用CDC::SelectObject()将它选入到设备上下文中,同时保存原来的设置到一个GDI对象指针比如说pOldObject中。在使用完后,再用SelectObject(pOldObject)恢复原来的设置。但是,如果该设备上下文是用户自己创建的,则不必恢复原来设置,因为框架会在该设备上下文生存期结束时删除该设备上下文,同时也就删除了原来存放于该设备上下文中的绘图对象设置。

下面介绍各种对象的用法:

画笔(CPen):封装GDI画笔,可被选中设备上下文中当前所用得笔。画笔用于绘制对象的边框以及直线和曲线。缺省画笔画一条与一个像素等宽的黑色实线。

要使用画笔,首先要定义一个画笔:

CPen pen;

然后创建画笔。创建画笔有两种方法:

一是使用CPen::CreatePen(int nPenStyle,int nWidth,DWORD crColor)进行初始化。第一个参数是笔的风格。nPenStyle可选值有:

PS_SOLID 实线

PS_DOT 虚线

PS_INSIDEFRAME 在一个封闭形状的框架内画线,若设定的颜色不能在调色板种找到且线宽大于1,Windows会使用一种混色。

PS_NULL 空的画笔,什么也不画

第二个参数是线的宽度,按逻辑单位。若线宽设为0,则不管是什么映射模式下,线宽始终为一个像素。第三个参数是线的颜色,可以选16种VGA颜色中的一种。颜色的设置用一个RGB宏来指定。

RGB宏形式如下

COLORREF RGB(cRed,cGreen,cBlue)

cRed、cGreen、cBlue分别代表颜色的RGB三个分量,它们的取值在0-255之间。可以使用RGB组合成各种色彩。

这样,要指定一个淡黄色的宽度为逻辑单位1的实心笔,可以调用:

pen.CreatePen(PS_SOLID,1,BR_YELLOW);

创建笔的另一个方法是使用库存对象。SelectStockObject可从以下库存笔中选择一个:

BLACK_PEN 黑笔

NULL_PEN 空笔(不画线或边框)

WHITE_PEN 白笔

注:库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、刷子、字体等。

刷子(CBrush):封装GDI刷子,可用作设备上下文中当前刷子。刷子用来填充一个封闭图形对象(如矩形、椭圆)的内部区域。缺省的刷子将封闭图形的内部填充成全白色。我们以前所创建的窗口内部都是白色就是窗口使用缺省刷子填充的结果。

可以用以下几种方法创建刷子:

(1)CreateSolidBrush(DWORD crColor)创建一个实心刷子,用一种颜色填充一个内部区域。

(2)CreateHatchBrush(int nIndex,DWORD crColor);创建一个带阴影的刷子,nIndex 代表一种影线模式:

(3)用CreatePatternBrush(CBitmap* pBitmap)

用一个位图作刷子,一般采用8X8的位图,因为刷子可以看作8X8的小位图。当Windows 桌面背景采用图案(如weave)填充时,使用的就是这种位图刷子。

(4)同样可以使用SelectStockObject()从库存刷子中选取一个:

BLACK_BRUSH 黑色刷子

WHITE_BRUSH 白色刷子

DKGRAY_BRUSH 暗灰刷子

GRAY_BRUSH 灰色刷子

LTGRAY_BRUSH 淡灰色刷子

NULL_BRUSH 空刷子,内部不填充

字体(CFont):封装了GDI字体对象,用户可以建立一种GDI字体,并使用CFont的成员函数来访问它。关于CFont类,我们在前面已经作了一些介绍,这里不再赘述,读者可以参见前一章内容。

位图(CBitmap):封装一GDI位图,它提供成员函数装载和操作位图。

调色板(CPalette):封装GDI调色板,它保存着系统可用的色彩信息,是应用程序和彩色输出设备上下文的接口。

区域CRgn类:封装GDI区域。区域是窗口内的一块多边形或椭圆形的区域。CRgn用于设备环境(通常是窗口)内的区域操作。CRgn通常与CDC的有关剪裁(clipping)的成员函数配合使用。

1.1.1 开发图形程序的一般流程

我们以一个最简单的例子来讲解,本例子是画一条直线和一个圆。

1.创建一个新的工程

【file】->【new】->【projects】->【MFC AppWizard [exe]】,新建一个工程名字为test。如图所示

然后点击【ok】,选择【Single Document】,如图所示

再点击【finish】按钮即可,显示新建工程的信息窗口,如图所示

点击【ok】即可,此时一个新的工程就建立了,但是一个空的工程,没有实际内容,我们要实现绘图功能,只需要在类CtestView的函数OnDraw()中添加绘图语句即可,我们添加下列三行语句,如图所示:

pDC->SetPixel (250,250,RGB(0,0,0)); //画一个象素点

pDC->LineTo(300,200); //画直线线

pDC->Ellipse (100,100,150,150); //画圆

此时编译并运行此工程,运行结果如图所示:

1.1.3 基本绘图函数介绍

(1)画点

SetPixel()函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:

COLORREF CDC:: SetPixel(int X, int Y, COLORREF crColor);

其中,(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()函数原型说明如下:BOOL CDC:: LineTo(int nXEnd, int nYEnd);

直线的终点位置由(nXEnd, nYEnd)指定。如果函数调用成功,那么该点就成为当前位置,并返回TRUE,否则返回FALSE。

MoveTo()函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:BOOL CDC:: MoveTo (int X, int Y);

示例:在CVcAppView类中的OnDraw()函数中加入下列画点语句:

//绘制直线

pDC->TextOut(20,60,"Line:");

pDC->MoveTo(20,90);

pDC->LineTo(160,90);

Polyline()函数用来画一条折线,而PolyPolyline()函数则用来画多条折线,它们的函数原型说明如下:

BOOL CDC::Polyline(COUST POINT *lppt, int cPoints);

BOOL CDC::PolyPolyline(COUST POINT * lppt, COUST DWORD *lpdwPolyPoints,

DWORD cCount);

在Polyline()函数中,lppt是指向折线顶点数组的指针,而cPoints是折线顶点数组中的顶点数。例如,绘制一条具有4个顶点的折线,程序如下:

POINT polylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};

pDC->Polyline(polylinepoint,4);

在PolyPolyline()函数中,lppt是指向保存顶点数组的指针,而各条折线的顶点数则保存在lpdwPolyPoints参数所指向的数组中,最后的cCount参数指定折线的数目。例如:POINT polypolylinePt[9]={{95,160},{120,185},{120,250},{145,160},{120,185},

{90,185},{150,185},{80,210},{160,210}};

DWORD dwPolyPoints[4]={3,2,2,2}; //分四段折线,分别占用3,2,2,2个顶点

pDC->PolyPolyline(polypolylinePt, dwPolyPoints, 4);

注:由于一条折线至少需要2个顶点,因此dwPolyPoints数组中的数不应该小于2。(3)画弧线和曲线

通过Arc()函数画弧线或整个椭圆。椭圆限定在一个矩形内,称为外接矩形。Arc()函数的圆形说明如下:

BOOL CDC:: Arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,

int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc);

其中,(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曲线,其函数原型说明如下:

BOOL CDC:: PolyBezier(CONST POINT * lppt, DWORD cPoints);

其中,lppt参数是曲线控制顶点所组成的数组,cPoints参数表示lppt数组中的顶点数,一条Bezier曲线需要四个控制顶点。如果lppt数组用于画多条Bezier曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。

示例,给出四个控制顶点,画出一条Bezier曲线和特征多边形。

//绘制Bezier 曲线

POINT polyBezier[4]={{20,310},{60,240},{120,300},{160,330}};

pDC->Polyline(polyBezier,4);

pDC->PolyBezier(polyBezier,4);

(4)画封闭曲线

Windows中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。

Rectangle()函数用来画矩形,其函数原型说明如下:

BOOL CDC:: Rectangle(int nLeftRect, int nTopRect,

int nRightRect, int nBottomRect);

其中,参数nLeftRect和nTopRect给出了矩形左上角的坐标,而nRightRect和nBottomRect则给出矩形的右下角坐标。

Ellipse()函数的作用则是画椭圆形。在Ellipse()函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下:BOOL CDC:: Ellipse(int nLeftRect, int nTopRect,

int nRightRect, int nBottomRect);

其中的参数说明与Rectangle()函数相同。

RoundRect()函数用来画圆角矩形,其函数的原型说明如下:

BOOL CDC:: RoundRect(int nLeftRect, int nTopRect,

int nRightRect, int nBottomRect,

int nWidth, int nHeight);

其中的前四个参数与Rectangle()函数相同,nWidth表示圆角的宽度, nHeight表示圆角的高度。

Polygon()函数用来画封闭的任意多边形,其函数原型说明如下:

BOOL CDC:: Polygon((COUST POINT *lpPoints, int cCount);

其中的参数说明与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);

POINT polygonPts[3]={{390,160},{430,220},{350,210}};

pDC->Polygon(polygonPts,3);

(5)画笔

当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。

创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen 类中,这样画笔就能够被视为对象进行处理。下面介绍创建画笔的方法。

方法一:直接构造一个CPen对象,并将定义画笔的参数传给它,例如:

CPen pen(PS-SOLID,1,RGB(255,0,0));

创建一个宽度为一个像素、实线和红色的画笔。

方法二:首先声明一个没有初始化的CPen类对象,然后再用CreatePen()函数定义画笔的属性。例如,

CPen Pen;

Pen->CreatePen (PS-SOLID,1,RGB(255,0,0));

方法三:先声明一个CPen类对象和一个描述画笔结构的LOGPEN类对象,并填入画笔的属性值,然后调用CreatePenIndirect()函数来创建画笔。如下所示:

CPen Pen;

LOGPEN LogPen;

LogPen.lopnStyle=PS_SOLID;

LogPen.lopnWidth=1;

LogPen.lpenColor=RGB(255,0,0);

Pen.CreatePenIndirect(&LogPen);

如果画笔被成功创建,那么两个函数返回TRUE,否则返回FALSE。

画笔包括样式、宽度和颜色三个属性。表列出了GDI画笔的样式。

表GDI画笔的样式

画笔的宽度用像素个数来确定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT参数要求画笔宽度只能为1,其它参数可以创建任意宽度的画笔。画笔的颜色是一个24位的RGB颜色,由RGB(rColor,gColor,bColor)来定义,三个参数取值0~255。

Windows预定义了三个实线、1个像素宽的画笔,它们是WHITE_PEN、BLACK_PEN 和NULL_PEN,程序中可以直接使用这些画笔,方法如下:

CPen Pen;

Pen.CreateStockObject(WHITE_PEN);

示例:在屏幕上绘制三组直线,第一组按不同线型绘制,第二组按不同宽度绘制,第三组按不同颜色绘制。程序如下:

//画笔的样式、宽度和颜色

int i1;

int nPenStyle[]=

{

PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,

PS_INSIDEFRAME,

};

CPen *pNewPen;

CPen *pOldPen;

//用不同样式的画笔

for (i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(nPenStyle[i1],1,RGB(0,0,0)))

{

pOldPen=pDC->SelectObject(pNewPen); //选择新笔,并保存旧笔

//画直线

pDC->MoveTo(20,60+i1*20);

pDC->LineTo(160,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//用不同的宽度的笔绘图

for(i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(PS_SOLID,i1+1,RGB(0,0,0)))

{

pOldPen=pDC->SelectObject(pNewPen);

//画直线

pDC->MoveTo(200,60+i1*20);

pDC->LineTo(340,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//设置颜色表

struct tagColor

{

int r,g,b;

} color[7]=

{

{255,0,0},{0,255,0},{0,0,255},

{255,255,0},{255,0,255},{0,255,255},{0,0,0},

};

//用不同颜色绘图

for(i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(PS_SOLID,2,RGB(color[i1].r,color[i1].g,color[i1].b))) {

pOldPen=pDC->SelectObject(pNewPen);

//画直线

pDC->MoveTo(380,60+i1*20);

pDC->LineTo(520,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//画笔程序结束

(6)画刷

在进行区域填充或绘制封闭图形时,需要用到画刷。MFC把GDI画刷封装在CBrush 类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。

纯色画刷绘图使用单色来定义,颜色由RGB()函数来确定。纯色画刷可以采用直接声明的方法,例如:

CBrush Brush(RGB(255,0,0)); 创建一个红色画刷。

也可以采用分步方法,由CreateSolidBrush()函数创建。

CBrush Brush;

Brush->Create->CreateSolidBrush(RGB(255,0,0));

Windows预定义了七种画刷,包括:BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH。可以参照CPen类的方法,采用CreateStockObject()来使用预定义的画刷。

阴影画刷使用预定义的六种阴影样式进行绘图。表列出了六种阴影样式。

表六种阴影样式

示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制100单位的矩形,并且用白色45度交叉线阴影将其填充,程序如下:

//画刷程序

pDC->Rectangle(300,300,400,400); //缺省的画刷,白色

//纯色画刷

CBrush *pNewBrush1;

CBrush *pOldBrush1;

pNewBrush1=new CBrush;

if (pNewBrush1->CreateSolidBrush(RGB(255,0,0)))

{

//选择新画刷

pOldBrush1=pDC->SelectObject(pNewBrush1);

//绘制矩形

pDC->Rectangle(200,200,300,400);

//恢复原有画刷

pDC->SelectObject(pOldBrush1);

}

delete pNewBrush1;

//阴影画刷

CBrush Brush(HS_DIAGCROSS,RGB(255,255,255));

CBrush *pOldBrush;

pOldBrush=pDC->SelectObject(&Brush);

pDC->SetBkColor(RGB(192,192,192));

pDC->Rectangle(0,0,100,100);

pDC->SelectObject(pOldBrush);

(7)文本显示

Windows可以显示很多数据,包括在窗口中显示文本信息。由于文本是以图像的形式显示在窗口中的,因此需要处理设备描述表(DC),另外还需要对文本字体的处理,包括:文本的显示、文本的颜色、字符的间距和文本的对齐方式等。

在拥有一个设备描述表以后,就可以调用TextOut()函数来显示文本行。例如:

pDC->TextOut(20,20,”This is a line of text.”);

TextOut()函数的三个参数分别是输出文本的X坐标和Y坐标以及输出文本串。

(2)设置文本颜色

在默认情况下,Windows绘制黑色文本。可以通过SetTextColor()函数改变文本的颜色。例如:

CDC *pDC=GetDC(); //声明一个设备描述表pDC1

pDC->SetTextColor(RGB(255,0,0)); //设置文本颜色为红色

可以通过GetTextColor()函数检索到当前文本的颜色,例如:

COLORREF color=pDC->GetTextColor();

SetBkColor()和GetBkColor()函数用于设置背景颜色和获取当前的背景颜色。

(8)设置字符间距

SetTextCharacterExtra()函数用来设置文本字符的间距,GetTextCharacterExtra()用来获得当前文本字符的间距,函数说明如下:

pDC-> SetTextCharacterExtra(space);

int space=pDC-> GetTextCharacterExtra();

其中,space表示在文本字符之间使用的额外空间的像素数。

(3)设置文本的对齐方式

SetTextAlign()函数用于设置显示文本的对齐方式,函数说明如下:

pDC->SetTextAlign(alignment);

其中,alignment参数取值:TA_LEFT、TA_CENTER和TA_RIGHT,分别表示左对齐、居中方法和右对齐。Alignment参数取值:TA_TOP、TA_BOTTOM和TA_BASELINE分别表示文本在垂直方向的对齐方式,上对齐、下对齐和字符的基线对齐。

1.1.4 VC++绘图实验

(1)实验内容:绘制金刚石图案。

N=3

N=4

N=5

N=10

N=30

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.360docs.net/doc/cd6314947.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include #include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void)

{ glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学课程教学大纲

《计算机图形学》课程教学大纲一、课程基本信息 课程代码:110053 课程名称:计算机图形学 英文名称:Computer Graphics 课程类别:专业课 学时:72 学分: 适用对象:信息与计算科学专业本科生 考核方式:考试(平时成绩占总成绩的30%) 先修课程:高级语言程序设计、数据结构、高等代数 二、课程简介 中文简介: 计算机图形学是研究计算机生成、处理和显示图形的学科。它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据已经成为信息领域的一个重要发展趋势。通过本课程的学习,使学生掌握计算机图形学的基本原理和基本方法,理解图形绘制的基本算法,学会初步图形程序设计。 英文简介: Computer Graphics is the subject which concerned with how computer builds, processes and shows graphics. Its importance has been shown in people’s more and more intensively need for harmony human-machine interface. Graphics user interface has become an important part of software. It is a significant trend to show abstract conception or data in graphics way. Through the learning of this course, students could master Computer Graphics’basic theories and methods,understand graphics basic algorithms and learn how to design basic graphics program. 三、课程性质与教学目的 《计算机图形学》是信息与计算科学专业的一门主要专业课。通过本课程的学习,使学生掌握基本的二、三维的图形的计算机绘制方法,理解光栅图形生成基本算法、几何造型技术、真实感图形生成、图形标准与图形变换等概念和知识。学会图形程序设计的基本方法,为图形算法的设计、图形软件的开发打下基础。 四、教学内容及要求 第一章绪论 (一)目的与要求 1.掌握计算机图形学的基本概念; 2.了解计算机图形学的发展、应用; 3.掌握图形系统的组成。

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

《计算机图形学》 课程实验指导(1)

《计算机图形学》课程实验指导 一.实验总体方案 1.教学目标与基本要求 (1)掌握教材所介绍的图形算法的原理; (2)掌握通过具体的平台实现图形算法的方法,培养相应能力; (3)通过实验培养具有开发一个基本图形软件包的能力。 2. 实验平台与考核 实验主要结合OpenGL设计程序实现各种课堂教学中讲过的图形算法为主。程序设计语言主要以C/C++语言为主,开发平台为Visual C++。 每次实验前完成实验报告的实验目的、实验内容、实验原理、实验代码四部分并接受抽查,实验完成后完成实验结果、实验体会两部分,本次实验课结束前提交。 3. 实验步骤 (1) 预习教材与实验指导相关的算法理论及原理; (2) 仿照教材与实验指导提供的算法,利用VC+OpenGL进行实现; (3) 调试、编译、运行程序,运行通过后,可考虑对程序进行修改或改进。 二. 实验具体方案 实验预备知识 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1)与C语言紧密结合: OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL 作图甚至比TC更加简单; 2)强大的可移植性: 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。而OpenGL 不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关; 3) 高性能的图形渲染: OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个非常优秀的图形软件接口。OpenGL官方网站(英文)https://www.360docs.net/doc/cd6314947.html, 下面将对Windows下的OpenGL编程进行简单介绍。如下是学习OpenGL前的准备工作:1.选择一个编译环境 现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual C++ 作为学习OpenGL的实验环境。 2.安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/cd6314947.html,/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤: 1)将下载的压缩包解开,将得到5个文件 2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

计算机图形学实验报告

.

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学课程总结教材

计算机图形学报告 前言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 其从狭义上是来说是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。由于计算机图形学在许多领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。 计算机图形学的发展趋势包括以下几个方面: 1、与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点; 2、研究和谐自然的三维模型建模方法; 3、利用日益增长的计算性能,实现具有高度物理真实的动态仿真; 4、研究多种高精度数据获取与处理技术,增强图形技术的表现; 5、计算机图形学与图像视频处理技术的结合; 6、从追求绝对的真实感向追求与强调图形的表意性转变。 1、三维物体的表示 计算机图形学的核心技术之一就是三维造型三维物体种类繁多、千变万化,如树、花、云、石、水、砖、木板、橡胶、纸、大理石、钢、玻璃、塑料和布等等。因此,不存在描述具有上述各种不同物质所有特征的统一方法。为了用计算机生成景物的真实感图形,就需要研究能精确描述物体特征的表示方法。根据三维物体的特征,可将三维物体分为规则物体和非规则物体两类。 三维实体表示方法通常分为两大类:边界表示和空间分割表示,尽管并非所有的表示都能完全属于这两类范畴中的某一类。边界表示(B-reps)用一组曲面来描述三维物体,这些曲面将物体分为内部和外部。边界表示的典型例子是多边形平面片和样条曲面。空间分割表示(Space-Partitioning)用来描述物体内部性质,将包含一物体的空间区域分割为一组小的、非重叠的、连续实体(通常是立方体)。三维物体的一般空间分割描述是八叉树表示。本章主要介绍三维物体的各种表示方法及其特点。

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

相关文档
最新文档