2009-11-10 Graphics Lab.PKU 1
第三讲 一个简单的二维光栅图形软件包
3.1 用图形软件包绘图
3.2 基本的交互处理
3.3 光栅操作
SRGP( Simple Raster Graphics Package)
应用
模型
应用
程序 SRGP
图形
硬件
设备
输出流
输入流
2009-11-10 Graphics Lab.PKU 2
3.1 用图形软件包绘图
图元的声明
图元的属性
填充图元及属性
保存和恢复图元的属性
字符
2009-11-10 Graphics Lab.PKU 3
3.1 用图形软件包绘图
? 图元的声明
– 绘图纸,屏幕,
– 坐标系
– 扫描转换:将顶点(参数表示的图形)转换为点阵表示的图

扫描转换顶点(参数)表示的图形
用户
点阵表示
的图形
显示系统
2009-11-10 Graphics Lab.PKU 4
3.1用图形软件包绘图
? 基本图元绘制:点、直线段、折线、
多边形,圆弧、字符。
? 数据类型:
Struct Point{ int x,y;}
typedef int * VertexCoordList;
typedef Point *VertexList;
2009-11-10 Graphics Lab.PKU 5
Void PutPixel(int x,int y,int color);
//画点函数,color,颜色值。
Void LineCoord(int x0,int y0,int x1,int y1);
Void Line (Point *pnt0,Point * pnt1);
//画线函数
Void polylineCoord( int vertexCount,VertexCoordList xArray,
VertexCoordList yArray);
Void polyline(int vertexCount,VertexList vertices)
//画折线函数 。
2009-11-10 Graphics Lab.PKU 6
Void MarkerCoord(int x,int y);
Void Marker(Point *pt);
//端点做标记。
Void Polygon(int VertexCount,VertexList
vertices);
//画多边形。
Void RectanglePoint(Point* leftBottom,
Point* rightTop);
//画矩形
2009-11-10 Graphics Lab.PKU 7
Void CircleArc(Point *center,int radius,
int startAngle,int endAngle)
//画圆弧
Void EllipseArc(Rectangle *externRect,
int startAngle,int endAngle)
//画椭圆
( x3,y3)
(x4,y4)
Typedef struct{ Point leftBottom,rightTop;} Rectangle
2009-11-10 Graphics Lab.PKU 8
图元属性
? 线型和线宽
? Void SetLineStyle(enum LineStyle lineStyle);
? Void SetLineWidth(int lineWidth);
? 枚举变量 lineStyple
? 预定义之线型 CONTINUOUS,DASHED,DOTTED
? 图元在显示时被扫描转换成离散的像素写入帧缓冲
器中,线型控制可看作有选择地写像素的位屏蔽器
(bit marker),--位屏蔽器为‘ 0’表示帧缓存中相应的像素值不变
(即透明),为‘ 1’表示用线段的颜色值代替帧缓存中相应的像素值。
2009-11-10 Graphics Lab.PKU 9
图元属性
? SRGP中,设置 颜色 属性有三种方式:
? 三种指定颜色的方式
– 通过查色表索引值
– 通过颜色名称
– 通过红、绿、兰三分量
Void SetColorByName(cnum Colors colorName);
//使用逻辑颜色名,实际对应的颜色取决于系统查色表
Void SetColor(int colorIndex);
//直接使用整数值来指定,colorIndex即是指向查色表某表项的
索引值
Void SetColor(int red,int green,int blue);
//直接赋颜色分量值(对真彩色系统而言 )
2009-11-10 Graphics Lab.PKU 10
填充图元及其属性
封闭的图元有二种绘制方式
-- 线画图:只画出边框;
-- 填充图:填充其内部区域;
Void FillRectangle(Rectangle *rec);//矩形
Void FillPolygon(int vertexCount,VertexList Vertices);
//多边形
Void FillEllipse(Rectangle * extentRect); // 椭圆
Void FillEllipseArc (Rectangle * extentRect,int startAngle,int endAngle);
//扇形
2009-11-10 Graphics Lab.PKU 11
?填充方式设置(控制填充图元的外观)
Void SetFillStyle(enum FillStyle fillstyle)
FillStyle定义如下:
enum FillStyle{
SOILD,//以当前前景色均匀填充图元
BITMAP_PATTERN_OPAQUE,// 以规则排列的位图填充;
BITMAP_PATTERN_TRANSPARENT,
PIXMAP_ PATTERN} //以规则排列的像素图填充;
位图:二值图像 像素图:多值图像
SRGP提供位图 /像素图资源表
填充图元及其属性(续)
2009-11-10 Graphics Lab.PKU 12
以规则排列的位图填充
BITMAP_PATTERN_OPAQUE //不透明方式
对应位图中,1”的像素用前景色(即当前设定的颜
色)
显示;对应位图中,0”的像素用背景色 显示。背景色由函

void SetBackgroundColor(int colorIndex)设定
BITMAP_PATTERN_TRANSPARENT //透明方式
对应位图中,1”的像素依然用前景色显示;对应位

中,0”的像素,颜色保持不变。 无论是以位图还是像素图填充图元,图元所呈现的颜色总依赖于当前系统查色表的内容,因为位图 /像素图中保存的仅
仅是颜色的索引值。
2009-11-10 Graphics Lab.PKU 13
保存和恢复图元的属性
目的:为了提高程序的模块化程度 … …
? Void InquireAttributes(AttributeGroup *group);
? Void SetAttributes(AttributeGroup *group);
//AttributeGroup 为 SRGP定义的结构,其中包括:
前景色、背景色、线型、线宽、填充方式、查色表
等 SRGP支持的所有属性。
2009-11-10 Graphics Lab.PKU 14
字符
? 属性,字体 (宋体,楷体 … ), 字形 (粗体,斜体 … ), 字型 ( 7 X 9,16
X 24… ), 字间距、行间距 。
? 点阵字符的参数
Void OutText(Point *origin,char *text)//产生一个字符串,
其中的 x坐标标明串中第一个字符的左边界,y坐标确定基线位置。
Void SetFont(int fontindex)
//设置当前的字体和字型
2009-11-10 Graphics Lab.PKU 15
? 基本原则
? 逻辑输入设备
? 输入方式
取样方式
事件驱动方式
? 设置输入方式属性
3.2 基本的交互处理
2009-11-10 Graphics Lab.PKU 16
? 交互系统设计的基本原则:
1,提供简单一致的交互操作序列 ;(menu,button…)
2,交互的每一阶段,清晰显示可选项;
3,样式简洁,选项有层次、简单;
4,给用户适当的反馈( highlight,光标形状 … );
5,允许用户取消操作( Undo)
解决方法:菜单、按钮、加亮、变灰、光标变化等等
基本的交互处理(续)
2009-11-10 Graphics Lab.PKU 17
基本的交互处理(续)
逻辑输入设备:
设备无关性与软件可移植性
? SRGP所支持的逻辑输入设备有:
定位设备、键盘设备。
? 逻辑输入设备到实际物理设备的映射由
设备驱动程序完成
2009-11-10 Graphics Lab.PKU 18
?输入方式:取样方式、事件驱动。
取样输入设备的状态,效率不高,
中断驱动:何时处理中断?增加程序设计难度
事件驱动:后台监控程序,事件队列。主动处理。
基于事件驱动方法
的程序结构,
基本的交互处理 (续)
初始化输入设备 ;
do{
waitEvent(event);
switch(event)
{ case EVENT1,procedure1;
break;
case EVENT2,procedure2;
break;
…;}
}while (TRUE);
2009-11-10 Graphics Lab.PKU 19
设置输入设备的输入方式
Void SetInputMode(enum Device inputDevice,enum InputMode intputMode)
枚举变量 Device与 InputMode的定义为:
enum Device{
LOCATOR,//定位设备
KEYBOARD,// 键盘设备
…};
enum InputMode {
INACTIVE,//非激活状态
SAMPLE,//取样方式
EVENT}; //事件驱动方式
基本的交互处理 (续)
2009-11-10 Graphics Lab.PKU 20
基本的交互处理(续)
设置输入设备的属性
Void SetLocatorEchoType(enum EchoType echoType)
//定位设备 反馈方式的设置
echoType取值,
NO_ECHO —— 无反馈
CURSOR —— 光标反馈 // SRGP将各种形状的光标存储
在一张资源表中,通过调用 Void SetCursor(int cursorIndex)
来选择所需光标
RUBBER_LINE/RUBBER_RECT —— 橡胶线 /橡胶矩形
//橡胶线 /橡胶矩形由二点确定:锚点与当前光标点
是固定的,锚点由函数 void SetLocatorEchoRubberAnchor(Point *anchor)
设置。当前光标点的位置随用户的输入而变化。
2009-11-10 Graphics Lab.PKU 21
定位设备的各种反馈方式示例
p38 nmt 图 2。 11
Void SetLocatorMeasure(Point *position);
//设置光标位置
基本的交互处理(续)
2009-11-10 Graphics Lab.PKU 22
键盘设备无反馈方式这一属性
Void SetKeyboardEchoOrigin(Point *origin)
// 设置初始化时屏幕上显示输入字符串的基点
当键盘设备被激活时,缺省的状态为空串。
下面键盘状态设置函数可改变缺省状态:
Void SetKeyboardMeasure(char *keyMeasure)
// keyMeasure代表一个字符串
基本的交互处理(续)
2009-11-10 Graphics Lab.PKU 23
3.3 光栅操作
? 画布
? 裁剪窗
? 位块拷贝
? 显示模式
2009-11-10 Graphics Lab.PKU 24
? 画布( Canvas)
– 抽象的数据类型,用户可以在其中画图
– 包括一个像素图和一些控制信息
– 具有独立的坐标系
– 系统可以同时有多个画布,只有一个处于激活状态
– 屏幕是一个特殊的画布
– 绘图命令的作用对象是处于激活状态的画布
SRGP中用于保存菜单和屏幕
上一块图像的 图元 称为 画布 。
2009-11-10 Graphics Lab.PKU 25
? 裁剪窗口
– 为什么裁剪?
– 内裁剪:保留窗口之内的图形
– 外裁剪:保留窗口之外的图形
? void SetClipRectangle(Rectangle *clipRect);
? 位块拷贝
void CopyPixel(int sourceCanvas,
Rectangle *sourceRec,Point *destCorner)
2009-11-10 Graphics Lab.PKU 26
? 显示模式
– 光栅运算与显示模式
– 4种简单的显示模式
? 覆盖 /Replace
? 或 /Or
? 异或 /Xor
? 与 /And
二值图像间在各种显示模式下的运算结果
2009-11-10 Graphics Lab.PKU 27
光栅运算
– 异或的用途:光标的移动
11001001
Xor 11111111
-------------------
00110110
Xor 11111111
-------------------
11001001
光栅运算同样适用于
多值图像,表现为相
应单元间的按位逻辑
运算。
2009-11-10 Graphics Lab.PKU 28
作业:
? 用 VC生成一个简单的画图程序。(三周
之内交。)