计算机图形学实验指导书(3)

2019-09-01 23:26

3.2 图形设备接口和图形程序设计

3.2.1 图形设备接口简介

在Windows系统中,程序都是通过一个叫做图形设备接口(GDI, Graphics Device Interface)的抽象接口和硬件打交道,Windows会自动将设备环境表映射到相应的物理设备,并且会提供正确的输入/输出指令。

GDI是Windows系统核心的三种动态链接库之一,它管理Windows系统的所有程序的图形输出。在Windows系统中,GDI向程序员提供了高层次的绘图函数,只要掌握这些绘图函数,就可以很方便地进行图形程序设计。

另一个概念是设备描述表(DC, Device Context)。DC是一个数据结构,当程序向GDI设备中绘图时,需要访问该设备的DC。MFC将GDI的DC封装在C++类中,包括CDC类和CDC派生类,这些类中的许多成员都是对本地GDI绘图函数进行简单封装而形成的内联函数。

DC的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,DC还要处理绘图属性的设置,如文本的颜色等。程序员可以通过调用专门的GDI函数修改绘图属性,如SetTextColor()函数。

CDC类是GDI封装在MFC中最大的一个类,它表示总的DC。表3.1列出了CDC中的一些常用绘图函数。

表3.1 CDC类中常用绘图函数 函 数 Arc() BitBlt() Draw3dRect() DrawDragRect() DrawEdge() DrawIcon() Ellipse() FillRect() FillRgn() FillSolidRed() FloodFill() FrameRect() FrameRgn() GetBKColor() GetCurrentBitmap() GetCurrentBrush() GetCurrentFont() GetCurrentPalette() GetCurrentPen() GetCurrentPosition() GetDeviceCaps() 椭圆弧 把位图从一个DC拷贝到另一个DC 绘制三维矩形 绘制用鼠标拖动的矩形 绘制矩形的边缘 绘制图标 绘制椭圆 绘制用给定的画刷颜色填充矩形 绘制用给定的画刷颜色填充区域 绘制用给定的颜色填充矩形 用当前的画刷颜色填充区域 绘制矩形边界 绘制区域边界 获取背景颜色 获取所选位图的指针 获取所选画刷的指针 获取所选字体的指针 获取所选调色板的指针 获取所选画笔的指针 获取画笔的当前位置 获取显示设备能力的信息 描 述 使用频率 **** * ** ** ** *** **** *** *** *** *** ** ** ***** ** *** *** *** *** **** ** -- 7

GetMapMode() Getpixel() GetPolyFillMode() GetTextColor() GetTextExtent() GetTextMetrics() GetWindow() GrayString() LineTo() MoveTo() Pie() Polygon() PolyLine() RealizePalette() Rectangle() RoundRect() SelectObject() SelectPalette() SelectStockObject() SetBkColor() SetMapMode() SetPixel() SetTextColor() StretchBlt() TextOut() 获取当前设置映射模式 获取给定像素的RGB颜色值 获取多边形填充模式 获取文本颜色 获取文本的宽度和高度 获取当前文本的信息 获取DC窗口的指针 绘制灰色文本 绘制直线 设置当前画笔位置 绘制饼图 绘制多边形 绘制一组直线 将逻辑调色板映射到系统调色板 绘制矩形 绘制圆角矩形 选择GDI绘图对象 选择逻辑调色板 选择预定义图形对象 设置背景颜色 设置映射模式 把像素设定为给定的颜色 设置文本颜色 *** ***** *** **** ** ** ** *** ****** ****** *** *** *** ** **** *** ** ** ** ****** *** ****** ****** 把位图从一个DC拷贝到另一个DC,并根据需* 要扩展或压缩位图 绘制字符串文本 ***** 这些函数的语法和使用可以通过MSDN帮助查询。3.2.2节主要介绍Windows中基本图形,包括点、直线、圆、圆弧、矩形、椭圆、扇形、折线等程序设计

3.2.2 绘制基本图形

(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,\

-- 8

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,\ 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个顶点

-- 9

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=1;i<6;i++) {

pDC->Arc(260-5*i,70-5*i,260+5*i,70+5*i,0,0,0,0); }

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);

-- 10

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

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

POINT polyBezier[4]={{20,310},{60,240},{120,300},{160,230}}; 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()函数会自动将起

-- 11


计算机图形学实验指导书(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:灾害地质学实习 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: