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

2018-12-27 19:01

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

-- 11

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

-- 12

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

-- 13

其中,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()函数会自动将起

-- 14

点和终点相连形成封闭的多边形,而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);

3.2.3 画笔与画刷

(1)画笔

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

创建画笔包括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。

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

样式 PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_DASHDOTDOT PS_NULL 创建实线笔 创建虚线笔,只有当画笔宽度小于或等于1时有效 创建点线笔,只有当画笔宽度小于或等于1时有效 点划线笔,只有当画笔宽度小于或等于1时有效 双点划线笔,只有当画笔宽度小于或等于1时有效 创建NULL笔,不绘制任何图形 说 明 -- 15


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

下一篇:【精品】2018年高考语文非连续性文本阅读

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

马上注册会员

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