计算机图形学实验报告及代码

第 1 章 概述

一、教学目标

通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。

二、教学要求

1.  了解计算机图形学的概念和研究内容;

2.  了解本门课程的发展概况。

三、教学内容提要

1.   计算机图形学的研究内容

2.   计算机图形学发展概况

3.   计算机图形学特点和应用

4.   计算机图形学当前研究的课题

5.   计算机图形生成和输出的流水线

四、教学重点、难点及解决方法

本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。

五、课时安排

    2学时

六、教学设备

    多媒体

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

1.1 计算机图形学的研究内容

    计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科 。

计算机图形表现形式

(1).线条式(线框架图)

用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。

(2).真实感面模型图形

跑车靓照

计算机图形分类(空间)

(1).二维图形(2D) :在平面坐标系中定义的图形

(2).三维图形(3D) :在三维坐标系中定义的图形

计算机图形产生方法

(1).矢量法(短折线法)

任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。

(2).描点法(像素点串接法)

每一曲线都是由一定大小的像素点组成

计算机绘图方式:

(1)交互式绘图

  允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。如AUTOCAD等

(2)被动式绘图

  图形在生成过程中,操作者无法对图形进行操作和控制。如C语言绘图

图形的操作与处理方法(Picture Manipulation)

    如图形的开窗、裁剪、平移、旋转、放大、缩小、投影等各种几何变换操作的方法及其软件或硬件实现技术。

图形信息的存储,检索与交换技术:如图形信息的各种表示方法、组织形式、存取技术、图形数据库的管理、图形信息通信等。

人机交互及用户接口技术:如新型定位设备、选择设备的研究;各种交互技术,如构造技术、命令技术、选择技术、响应技术等的研究,以及用户模型、命令语言、反馈方法、窗口系统等用户接口技术的研究。

1.2 计算机图形学发展概况

1962年美国麻省理工学院林肯实验室的Ivan E·Suthland,首先提出了“计算机图形学”(Computer Graphics)这一术语,引入了分层存储符号的数据结构,开发出了交互技术;可用键盘和光笔实现定位、选项和绘图。奠定了计算机图形学基础。 

60年代中期美国、英国、法国的一些汽车、飞机制造业大公司对计算机图形学开展大规模研究。

60年代后期出现了存储管式显示器,可以进行简单交互。

1.3  计算机图形学特点和应用

  特点:

1.计算机产生的图形有规律、光滑。它是按数学方法产生的,规矩整齐,有着像数学一样的严格性。

2.计算机产生的图形纯净美观、无噪声干扰。

3.通过计算机产生的图形不仅能描绘客观世界的各种对象,也能描绘纯粹是想像的主观世界中的各种对象。

4.交互式计算机图形显示可由用户控制,产生的图形可修改性强,且速度快、差错少。

应用领域:

1.计算机辅助设计(CAD)和计算机辅助制造(CAM)计算机图形学被用来进行土建工程、机械结构和产品的设计,包括设计飞机、汽车、船舶的外形和发电厂、化工厂等的布局,也能够对电子线路或电子器件进行设计。

2.事务管理中交互式绘图

 绘制事务管理中的各种图形,如统计数据的二维及三维图形、直方图、线条图、表示百分比的扇形图等等,还可绘制工作进程图,库存和生产进程图以及大量的其他图形。所有这些都以简明的形式呈现出数据的模型和趋势以增加对复杂现象的理解并促进决策的制定。

3.地理信息系统(GIS)

 地理信息系统是建立在地理图形基础上的信息管理系统,是图形技术、数据库技术以及管理信息的结合。

4.办公自动化和电子出版技术

 图形显示技术在办公自动化和事务处理中的使用,有助于数据及其相互关系的有效表达,因而有利于人们进行正确的决策。利用交互式图形显示技术的支持可以进行资料、文稿、书刊、手册的编写、修改。制图、制表、分页、排版。

5.计算机辅助教学(CAI)

 计算机辅助教学系统利用图形显示设备或电视终端,可以有声有色生动地演示物理、化学、生物、外语等教学内容,让学生(用户)使用人机交互手段,进行学习和研究,绘图或仿真操作,使整个教学过程直观形象,有利于加深理解所学知识。

6.过程控制

在过程控制中,常常将计算机与现实世界中的其他设备连成一个系统。计算机图形显示设备常用来显示系统中关键部位的状态,如炼油厂、发电厂的状态显示器可显示出由传感器送来的压力、温度、电压、电流等数据,从而使操作人员可对异常情况作出反应。

1.4   计算机图形学当前研究的课题

1.造型技术

    研究的是如何在计算机中构造出二维、三维物件模  型的基本方法和手段。

2.三维信息重建技术

   研究一些算法,使得计算机图形系统能自动地将三视图转换成相应的立体图。

3.图形数据库

    研究如何以基本的图形为数据项而建立起一个能快速查找各个图形的图形库。   

4.动态绘图

 在交互式绘图中,不仅可以在屏幕上对图形进行修改、删除、编辑等,还可以进行动态分析。

5.CG、CAD、CAM三者一体化

计算机图形学(CG)、计算机辅助设计(CAD)和计算机辅助制造(CAM)有机结合在一起,形成所谓一体化软件。

6.应用软件开发环境的通用化和标准化

用户界面管理系统UIMS、窗口管理系统、网络文件格式等,并使之通用化和标准化。

7.虚拟现实环境的生成(Virtual Reality简称 VR)

利用计算机生成一种模拟环境(如飞机驾驶舱、操作现场等),通过多种传感、设备使用户“投入”到该环境中,实现用户与该环境直接进行自然交互的技术。

8.科学计算可视化

通过对空间数据场构造中间几何图素或用图形绘制技术在屏幕上产生二维图像。 

1.5 计算机图形学生成和输出的流水线

再谈矢量法和描点法

     矢量法-向量图形-简单图形-计算机绘图命令-向量图

     描点法-点阵图形-复杂图形-文件存储大小-位图

比较:几条自由曲线构成的图形和一幅有炫彩动物的卡通图形

(1) 点阵图形点的信息;

(2) 向量图形的尺寸变化;

九、作业

    课后习题

十、本章小结

在本章中,对计算机图形学的基本概念和研究内容进行了概述,对发展概况和应用领域进行了说明。

 

 

第2章  计算机图形系统

一、教学目标

        通过对本章的学习,要求熟悉计算机图形系统的组成/各种图形显示器、图形输入/输出设备。

二、教学要求

1、了解计算机图形系统的组成;

2、了解计算机图形输入/输出设备的种类。

三、教学内容提要

1.计算机图形系统的组成

2.计算机图形显示器

3.计算机图形输入设备计算机图形输出设备  

4.图形核心系统(GKS)简介

5. 通用图形软件简介

四、教学重点、难点及解决方法

重点是熟悉计算机图形系统的组成/各种图形显示器、图形输入/输出设备。

五、课时安排

    4学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

2.1 计算机图形系统的组成

一.  图形系统的结构

     由硬件和软件两部分组成。

二.图形系统的基本功能及其硬件性能要求

计算机图形系统至少应具有以下五个方面基本功能:

1.计算功能

(1)形体设计和分析方法的程序库,描述形体的图形数据库。

(2)坐标的平移、旋转、投影、透视等几何变换程序库的数据库。

(3)曲线、曲面生成和图形相互关系的检测库。

2.存储功能

       在计算机内存储器和外存储器中,应能存放各种形体的几何数据及形体之间相互关系,可实现对有关数据的实时检索以及保存对图形的删除、增加、修改等信息。

3.输入功能

       由图形输入设备将所设计的图形形体的几何参数(例如大小、位置等)和各种绘图命令输入到图形系统中。

4.输出功能

        图形系统应有文字、图形、图像信息输出功能。在显示屏幕上显示设计过程当前的状态以及经过图形编辑后的结果。同时还能通过绘图仪、打印机等设备实现硬拷贝输出,以便长期保存。

5.对话功能

        可通过显示器或其他人-机交互设备直接进行人-机通信,对计算结果和图形,利用定位、拾取等手段进行修改,同时对设计者或操作员执行的错误给予必要的提示和帮助。

为了实现以上功能,对图形系统的硬件性能要求是:

1.处理速度

       图形系统的处理速度既与图形系统硬件有关,也与图形软件的图形处理算法有关。

2.存储容量

       存储容量包括三部分:内存储容量、显存、外部存储容量和显示缓冲区容量。

3. 处理精度

        处理精度主要是指图形采集输入质量和显示输出质量:这里主要指图形分辨率、图形色彩的显示等。而且很大一部分与所采用的图形处理软件有关。

三.图形系统分类及硬件工作平台要求

1.计算机图形系统的分类

        根据其硬件配置和信息传递方式分为:

(1)  脱机绘图系统

将输入图形数据在主机内进行处理

将图形处理后的图形数据送入中间介质,用磁盘或磁带控制绘图输出机输出图形

脱机绘图系统是将图形数据和图形输出分别进行处理,避免计算机处于等待状态,加快计算机的工作效率。

(2) 联机绘图系统

将输入图形数据在主机内进行处理

计算机将图形处理信息直接送给绘图机输出图形,不需要中间介质(磁盘或磁带)传递绘图信息,处理时间缩短了。但由于绘图机是机械速度,这样造成了计算机对绘图机等待,降低了计算机工作效率。 

(3) 交互式绘图系统

绘图系统将处理结果输出到图形终端(图形显示器)或图形工作站。用户对所显示图形还可用定位、拾取和描绘等设备进行编辑和标注等。

2.计算机图形系统的硬件工作平台

目前,计算机图形系统的硬件平台有如下几种:

(1).微型计算机(简称微机)

        随着微型计算机性能进一步提高,用微型计算机实现三维形体的设计及显示能力在不断提高。

(2).工作站

        实际上是一类超级微型计算机,该系统主要用于工程设计,为研究、开发提供一整套软硬件工作环境支持。工作站是具有高速的科学计算、丰富的图形处理、灵活的窗口及网络管理功能的交互式计算机系统。美国的SUN、SGI、HP、DEC、IBM等公司均生产此类产品。

(3).中、小型计算机

       一般在特定的部门、单位和应用领域中采用此类环境。它是大型信息系统建立的重要环境,这种环境中信息和数据的处理量是很大的,要求机器有极高的处理速度和极大的存储容量。

(4).大型机

      以大型计算机为基础,具有容量庞大的存储器和极强的计算功能,大量的显示终端及

高精度、大幅面的硬拷贝设备。还往往拥有自行开发的、功能齐全的应用软件系统。例如,美国第三大汽车公司(CHRYSLER汽车公司)就拥有庞大的计算机系统来进行计算机辅助设计、实体造型、结构分析、运动模拟、工程和科学计算、项目管理、生产过程控制等。

 (5).计算机网络

      计算机网络是指将上述四类计算机平台,或者其中某一类通过某种互联技术彼此连接,按照某种通信协议进行数据传输、数据共享、数据处理的多机工作环境。

      它的特点是多种计算机相连,可以充分发挥各个机器的性能和特点,以达到很高的性能价格比。

      网络图形系统要考虑的关键问题是网络服务器的性能,图形数据的通信、传输、共享以及图形资源的利用问题。

2.2 计算机图形显示器

1. CRT单色显示原理

电子枪

灯丝加热阴极,阴极表面向外发射自由电子,控制栅控制自由电子是否向荧光屏发出,电子流在到达屏幕的途中,被加速、聚焦成很窄的电子束,由偏转系统产生电子束的偏转电场(或磁场),使电子束左右、上下偏转,在指定时刻在屏幕指定位置上产生亮点。

余辉时间:电子束离开光点后光点保持的时间。

屏幕刷新:荧光亮度随着时间按指数衰减,整个画面必须在每一秒钟内重复显示许多次,人们才能看到一个稳定而不闪烁的图形,因此必须重复地使荧光质发光,即驱使电子束迅速回到同一点。

要保持一幅画面的稳定性,若余辉时间越短,则所需的屏幕输刷新率越高。影响刷新率的最主要因素是显示器的带宽。

荧光粉的质量直接影响到CRT成像效果。

电视

(刷新率低,与其电路相关)

由于影片播放时画面经常切换,一般采用短余辉的荧光粉。若采用长余辉的荧光粉,则会使上一帧图像余辉保留时间过长而出现拖尾和花屏(马赛克)现象

电脑

(刷新率高)

由于电脑画面一般较为稳定,同一帧画面停留时间较长,所以采用与电视相比较长余辉的荧光粉。如果一帧电脑画面停留时间很长,那么需要保证一定的刷新频率才能使该画面不闪烁不变暗

什么是灰度?

灰度就是亮度,简单说就是色彩的深浅程度,在黑白两色中,灰度体现于黑与白的中间状态,也就是灰色。

纯黑(用0表示),纯白(用15表示)

假设总共有16种灰度也就是16种亮度

随箭头越来越亮

那么在彩色变换中同样有灰度的概念,例如R、G、B三种原色,每种原色都有一个灰度值。若一种原色有16种灰度,那么该原色要占4位,256种灰度,那么该原色要占8位

R、G、B三种原色若各有4位,则总共可显示的彩色数目为212种,也即是16×16×16种

两点提示:

(1)彩色图片的色彩变换也叫灰度变换或者色阶变换,R、G、B三种原色按任何比例增强再混合。

(2)在ACDSee或PhotoShop等图片工具栏中选择灰度一项,实际上就是将彩色图像转换为只有黑白两色的灰度图像,但和黑白图像还是不同。

一幅(彩色)图片中,由于各部分的颜色细节不同因而导致各部分的灰度等级不同,这种现象我们称之为“多级灰度”。

多级灰度

提高加速电压后,电子束速度增加,穿透绿色荧光层,显示绿色。电子束速度较低时,轰击荧光屏的能量只能使表层红色荧光粉受激励,产生红色亮点

通过改变电子束电压,就可调节电子束穿透荧光粉层的厚度,从而改变红绿两种发光亮度的比例,合成不同的颜色,因此,可显示红、橙、黄、绿四种颜色。

(2).荫罩式彩色CRT

显示的色彩要比穿透式彩色CRT宽广得多。在荧光屏内壁上分别由红(R)、绿(G)、蓝(B)三种颜色的荧光粉涂成百万个荧光粉点,按RGB顺序分行交替排列成三角形状且相距很近

它们发出三种色彩时分辨不清三种原色,而形成一种颜色

荫罩的金属板,板上按三角形状钻有40~50万小圆孔。前罩式CRT管内按三角形排列安装三个电子枪,发射三条电子束,它们由一个共同偏转系统控制

三条电子束聚焦于荫罩板上的小孔中且相距很近。荫罩的作用是使三条电子束分离开来,分别轰击到三种颜色的荧光点上,调节各个电子枪的电流强度,就可改变相应颜色荧光点的亮度,即合成色中所占比例,达到改变成色的色彩

图形显示系统的类型

根据其电子束轰击屏幕的方式和组成结构可分为三种:随机扫描式显示系统、存储管式显示系统和光栅扫描式显示系统。

技术指标:

分辨率的高低:现在一般在1024×1024以上 

显示图形的颜色的种数 :现在一般为真彩色32位

1.随机扫描式显示系统

要显示的图形由计算机处理成为显示器的显示指令(或称显示文件)。图形控制器取出缓冲存储器或固定存储器中的显示指令,依次执行。由管头控制电路使电子束以按所要的亮度偏转到指定位置,从而得到图形。利用电子束在荧光屏上扫描的轨迹画图。显示指令中的亮度、位移量等数字信息经过线产生器的处理转换为控制电子束产生偏转和明暗的物理量,也就是电流和电压。固定存储器中则存放各种常用字符、数字等的显示指令,显示指令经接口电路送到显示器的缓冲存储器。为了获得稳定的画面,必须不断地重复扫描显示文件(即刷新),速度通常为每秒重复扫描25~50次,即每秒25~50帧左右

优点:

能实时地进行数字-视频转换,实现动态显示,易于修改,交互性好

扫描速度快,线条质量高,图形清晰,图线光滑。

缺点:

不能产生多级灰度的真实感显示,图形的复杂程度受显示器扫描速度的限制

价格贵,目前很少使用。

2.存储管式显示系统

利用显示管本身来存储信息技术(随机扫描器使用了一个独立的存储器来存储图形信息)

优点:

图形保持时间长,比较稳定。

电路结构简单,成本低。

缺点:

显示画面速度慢,不适宜动态修改,交互性差。

图形复杂度受到限制。

3.光栅扫描式显示系统

随机扫描式显示器、存储管式显示器:

    画线设备,在屏幕上显示一条直线是从屏幕上

一个可编地址点直接画到另一个可编地址点。

光栅扫描式显示器:

        画点设备,可以看作是一个点阵单元发生器,

并可控制每个点阵单元亮度,可以生成多种灰度和

颜色,色彩连续变化具有真实感的图形。

(1)光栅扫描式显示系统组成

把计算机送来的图形(如画线、画多边形、画填充区域或写字符等)基本画图命令扫描转换

成为相应的点阵,即位图(bitmap) 点阵的每一点与屏幕像素一一对应,点阵中每个元素就是像素值,通常用1~12位二进制数值来表示灰度或色彩。

位映射(bit mapping)技术:由若干位数据来对应屏幕上一点的光栅图形显示技术将屏幕显示图形的映像(Image),即位图放入显示存储器中。 所以显示存储器又叫位存储器,通常称之为帧缓冲器(Frame Buffer)。为了使CRT屏幕上的图形能持续地进行显示,显示存储器的内容需要不断地读出并送到监视器,使得画面能以一定的频率刷新。显示存储器的分页处理:显示存储器中同时存放多幅画面,这时存储区划分成若干页,每一页存放一幅位图。物理屏幕当前正在显示的页称为可见页(Visual Page)。主机每次只能向一个页进行读写操作,这个页就称作活动页(Active Page)。

存储器的页面可以比屏幕位图大得多,这样屏幕只能显示画面的一部分,通过上下左右移屏功能,用户可以看到显示存储器中的整个画面。

(1)光栅扫描式显示器组成

用来定义像素的颜色。又称为调色板。

彩色表的目的是为了不使显示存储器容量增大,而能显示更多的颜色,例如:显示器要控制三种原色,即R(红)、G(绿)、B(蓝),为了使三种原色按不同的比例合成各种颜色,每种颜色要有不同的灰度,如果每个像素各个原色要16种灰度,于是每个原色要占4位,则每个像素要12位,于是显示存储器容量就要很大,彩色表可解决此问题。

采用彩色表时,显示存储器的像素值不再是直接送到监视器中的颜色值,而仅是颜色的一个

索引(Color Index),即彩色表的地址,用八位表示一个像素值,如编号69(01000101)为彩色表对应地址

从彩色表对应地址项中读出R、G、B三种颜色分量(即颜色号的定义值)然后送监视器

例如:彩色表的字长为 12bit(R、G、B各 4bit),这意味着最多可定义212=4096种不同颜色

彩色表结构

为什么说彩色表的使用节省了存储容量?

彩色表的地址数目是由像素值的位长来决定的,也就是彩色素的多少,也即是一屏能显示颜色数目的多少,例如像素值有8位,那么彩色表的地址=彩色素数目=一屏能显示的颜色数=256

像素值的位长与彩色表的字长(也即是R/G/B三种原色的总位长)无关,例如像素值的位长为8,R/G/B三种原色各有16(256)种灰度,那么彩色表的字长为12(24),该显示系统所能显示的颜色总数为4096(16777216)种,但是每屏最多能显示的颜色数目只有28=256种。

CRT 控制器

使电子束不断地自上而下、自左面右进行屏幕扫描,形成光栅(Raster),产生水平和垂直步信号送往CRT。

2.3 计算机图形输入/输出设备

一.  键盘 

二. 鼠标 

一.机械式鼠标器

二.光电式鼠标器

三.光机式鼠标器

一种检测装置

功能一般有两种:拾取和跟踪使用时要有相应的软件配合。

数字化仪

数字化仪时常用来摘取放在它上面的工程图上的大量点,经数字化后存储起来,以此作为图

形输入一种手段。

    工作原理:数字化仪平板实际上就是一个XY直角坐标系,它上面的任何一点都对应于一个坐标值(x,y),当游标器移动到平板上某一位置时,按一下游标器上的开关,便可获得这一位置的坐标值,并自动地把这个坐标值(x,y)送到计算机内。

只要将画有此曲线的图纸贴在数字化仪的平板上,并移动游标器到各个点A i(i=1,2,……,每次按下游标器上的开关,便把这些点的坐标(x i,y i)自动地送到计算机内

图形输入板则更多用于交互设计,使用时大多划出一个台板图形区,其余部分放置菜单,称为菜单区。

图形区

菜单区

台板图形区与显示屏之间存在着一种映射关系

图形输入板的使用方式有三种:

(1)图形变成数字化信息。

(2)拾取台板菜单区中的菜单项,即取出拾取点的坐标,算出该菜单项的代码并转入相应程序运行。

(3)选择输出坐标数据的方式,共有四种方式。第一种为点方式,即先拾取一个点,接着输出该点的坐标;第二种称连续方式,即随着定位工具的移动,连续输出点的坐标;第三种称开关连续方式,即当定位工具移动且同时按下开关时才能连续输出点的坐标;第四种称增量方式,这时拾取点的坐标以相对于上次拾取点的增量坐标形式输出。以上四种方式可通过选择图形输入板上的有关按钮来决定。

  图形扫描仪

直接把图形(工程图纸)和图像(如照片、广告画)扫描输入到计算机中,以像素信息进行存储表示的设备。

按所支持的颜色分:

单色扫描仪和彩色扫描仪

按所采用的固态器件分:

电荷耦合器件(CCD)扫描仪、MOS电路扫描仪和紧贴型扫描仪等;

按扫描宽度和操作方式分:

大型扫描仪、台式扫描仪和手动式扫描仪.

图形扫描基本过程(CCD扫描仪)

扫描光源通过待扫描材料

再经一组镜面反射到CCD

由CCD转换产生图像数据,然后,传输给计算机主机

经过适当的软件处理,以图像数据文件的形式存储或使用。

分辨率:在原稿的单位长度(英寸)上取样的点数,单位是dpi(dot per inch)一般在300dpi-1000dpi

扫描仪的性能指标

支持颜色、灰度等级:目前有4位、8位和22位面颜色、灰度等级的扫描仪。

扫描图形分辨率越高,所需的

储空间就越大。

扫描仪支持的颜色、灰度层次越多,图像的数字化表示就越准确,但同时意味着表示一个像素的位数增加了,因而也增加了存储空间。

显示器、绘图仪、打印机

一.  绘图仪

把由计算机生成的图形输出到图纸(或其它介质)上的硬拷贝设备。

笔绘式

喷墨式

静电式

矢量型设备,绘图笔相对纸作随机移动。

在笔式绘图机上,一个电脉冲通过驱动电机与传动机构使画笔移动的距离称为步距(或称脉冲当量)

步距减小,画出的图就越精细。

1.笔式绘图仪

(1).平台式绘图机

图纸静止不动

导轨做X方向运动

笔架做Y方向运动

机械传动

(2).滚筒式绘图机

绘图纸卷在滚筒上,笔和纸都是运动的。

(3).平面电机式绘图机

采用平面电机驱动,可以取消导轨、横梁及传动机构 。

(4).小型绘图机

结构简单

原理大致与平台式绘图机相同

笔式绘图机的主要技术指标

绘图速度

步距

绘图精度

功能

包括绘图幅面大小(A0,A1,A3……等),画笔数量,以及其他辅助功能(如插补功能、由线拟合功能等)

二、喷墨式绘图仪

喷墨装置多数情况是安装在类似打印机的机头上,纸则绕在滚筒上并使之快速旋转,喷墨头则在滚筒上缓慢运动,并且把青色、品红、黄色,有时是黑色墨喷到纸上。

三、静电绘图仪

绘图分两步:

(1)用静电构造一个不可见潜影

(2)喷上调色剂着色处理进行显影

针点式打印机

激光打印机

细针与色带作为打印装置

利用静电作用

利用喷射墨计作为打印装置

2.4  图形核心系统(GKS)简介

Graphics Kernel System,一种已经被ISO接受的国际图形标准

1. GKS的功能

提供了各种物理的图形输入、输出设备(图形显示器、绘图机。图形输入板等)和应用软件之间的接口。提供了与各种高级语言的接口。

2. GKS的基本概念

1.工作站

由一个操作员操纵使用的一组图形输入/输出设备是一个逻辑上的概念

一个工作站允许有多个输入设备,但只能有一个输出设备。典型的工作站由一个键盘、一个鼠标器和一台图形显示器组成。分为输出型、输入型、输入/输出型(交互式工作站)、元文件输出工作站、元文件输入工作站和图段存储器工作站六种类型。

2.坐标与坐标变换

GKS有三种不同的坐标系

供应用程序使用的实际世界坐标系统(World Coordinate System,简称 WC)

各工作站物理设备使用的设备坐标系(Device Coordinate System,简称DC)

GKS内部使用的规范设备坐标系(Normalized Device Coordinate;简称NDC)

三个坐标系都是二维坐标系

3.GKS图形输出原语

GKS可以输出一些最基本的几何元素如线段、标记、填充封闭区域、文字、符号等。通常二维物体的形状及其相应的画面都可以由这些基本的图形元素来构成。应用程序是通过调用GKS的输出图元功能子程序的方式输出图元的。

GKS的六种图形输出原语 (见书P41)

GKS不仅使用必要的坐标数据来规定上述各种图元的位置、大小及形状、而且可以通过各种属性来指出其外貌,从而使应用程序能很方便地生成符合实际使用要求的多姿多彩的图形。

输出图元属性(见书P42)

4.  GKS图形输入设备

六种不同的逻辑输入设备:

定位设备

笔画设备

拣取设备

选择设备

数值输入设备

字符串输入设备 

2.5 通用图形软件简介

一、通用图形软件的分类

图形软件的内容非常丰富,它包括二维图形的生成、图形变换、几何交切、裁剪,平面图形的布尔运算,三维图形的生成、变换、隐藏线的消除,三维剪裁,立体造型等。

图形程序包:如PLOT-10、CALCOMP等绘制软件

基本图形资源软件:如GKS及PHIGS标准的软件包,还有SGI公司研发的图形标准库OpenGL。

以及二维、三维交互图形软件,几何造型软件,动画技术软件等

CADAM(Computer-graphics Augmented Design And Manufacture,计算机图形增广设计和制造)

CATIA( Computer-graphics Aided Three-demensional Interactive Application,计算机辅助三维交互应用)

CAEDS(Compute Aided Engineering Design Systems,计算机辅助工程设计系统)

GKS(Graphics Kernel System,图形核心系统)

CBDS2(Circuit Board Design System 2,电路板设计系统2) 

PADL(Pat and Assembly Descriptiion Language,零件和部件描述语言)

九、作业

课后习题

十、本章小结

在本章中,介绍了计算机图形系统的组成,各种图形显示器的种类以及输入输出设备等。

 

 

第3章  c语言图形程序设计基础

一、教学目标

        通过对本章的学习,要求熟悉c语言图形程序设计的基础知识:屏幕颜色的设置、图形颜色设置、线的特性设定和填充。

二、教学要求

1、掌握c语言的图形颜色设置;

2、了解线的特性设定和填充。

三、教学内容提要

3.1 屏幕设置 

3.2 图形颜色设置 

3.3 线的特性设定和填充 

3.4 图形模式下文本处理 

3.5 图形存取处理

3.6 常用画图函数简介 

3.7 绘图程序实例 

3.8 c++语言环境下绘图 

四、教学重点、难点及解决方法

重点是了解c语言图形程序设计的基础,包括图形颜色设置,线的特性设定和填充,图形模式下文本处理等。

五、课时安排

    8学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

3.1   屏幕设置

一、屏幕显示方式与坐标系

1. 文本方式与字符坐标系

  在屏幕上只能显示字符的方式称为文本方式。在文本方式下,屏幕上可以显示的最小单位是字符。为了能在指定位置显示每个字符,C语言提供了字符坐标系。

左上角为坐标原点(1,1)

水平方向(x轴)分为若干列

垂直方向(y轴)分为若干行

第三章 C语言图形程序设计基础

如:(8,20)表示字符位于屏幕第8行第20列

Turbo C支持以下6种不同的显示方式:                                                               

(l)BW40 黑白25×40(25行,40列)

(2)C40  彩色25×40

(3)BW80 黑白25×80

(4)C80  彩色25×80

(5)MONO 单色25×80

(6)C4350彩色43×80(EGA),50×80(VG)

  显示方式不同,所显示的字符的列数和行数也不一样,颜色也有区别,屏幕上所显示的字符数量也不一样。

2.图形方式与点坐标

    在屏幕上显示的图形称图形方式。

    屏幕是由像素点组成的,其像素点多少决定了屏幕的分辨率。分辨率越高,显示图形越细致,质量越好。

    在图形方式下,屏幕上每个像素的显示位置用点坐标来描述。

点坐标系

左上角为坐标原点(0,0)

垂直方向为y轴,自上向下

水平方向为x轴,自左向右

分辨率不同,水平方向和垂直方向的点数也不一样,即其maxx,maxy数值也不同。

  在Turbo C中,坐标数据可以用两种形式给出:一种是绝对坐标;另一种是相对坐标。绝对坐标的参考点是坐标的原点(0,0),x和y只能取规定范围内的正整数。相对坐标是相对“当前点”的坐标,所以其坐标的参考点不是坐标系的原点,而是当前点。在相对坐标中,x和y的取值是相对于当前点在x方向和y方向上的增量,x和y可以是正整数,也可以是负整数。点坐标系坐标值的范围决定于所使用适配器/显示分辨率。

二、图形驱动程序与图形模式

1. 图形驱动程序

    支持不同图形适配器的一组程序

    由于图形显示器的种类繁多,其控制方式也各有差异,所以要显示图形就需先装入相应的图形驱动程序。

    Turbo C提供了几种图形驱动程序可支持的图形适配器。下表列出驱动程序其相应的符号常量和规定值。

2. 图形模式

   每种图形显示器有不同的图形显示模式

   由于每种图形显示器各有几种不同的图形显示模式,因此,要显示图形就必须确定所用的显示模式,也就是说,要显示图形,不但要先装入相应驱动程序,而且还要决定所用的显示模式。不同的图形驱动程序有不同的图形模式;即使在同一图形驱动程序下,也可能会有几种图形模式。

Turbo C中图形函数均在头文件“graphics.h”中定义,所以,凡是在程序中要调用这些图形函数,都必须在程序文件的开头写上文件包含命令:

   # include <graphics.h>

1. 图形系统初始化

(1).问题的提出

    一般缺省情况下,屏幕为80列25行的文本方式。在文本方式下,所有的图形函数均不能操作,因此在使用图形函数绘图之前,必须将屏幕显示适配器设置为一种图形模式,这就是图形初始化过程。

     图形系统初始化首先要调用initgraph()函数,它通过从磁盘上装入一个图形驱动程序,来初始化图形化系统,并将系统设置为图形模式。 

 (2).初始化函数

initgraph()函数格式为:

void far initgraph(int *gdriver;int *gmode,char *path);

①gdriver:是一个整型值,用来指定要装入的图形驱动程序,该值在头文件 graphics.h中定义,如p51表3.l所示。

②gmode:是一个整型值,用来设置图形显示模式。图形显示模式决定了显示的分辨率,可同时显示的颜色的多少,调色板的设置方式等,几种不同的图形显示模式如p53表3.2所示。

③path:是一个字符串,用来指明图形驱动程序所在路径。如果驱动程序就在用户当前目录下,则该参数可以空字符串,否则应给出具体路径名。一般情况下,Turbo C安装在C盘的TC目录中,则该路径为:C:\TC,如果写在参数中则为“C:\\TC”。

注意:前两个参数实际上是整型指针,调用时应加上地址运算符“&”。

对far关键字的解释:far并非C语言的标准关键字,

主要是远程链接的作用,可以将其视为远指针函数,以内存管理是段式管理为例,没有far这个关键字时,内存地址仅是段内跳转,有far这个关键字时内存地址是段间跳转。

几个头文件

graphics.h

stdlib.h

conio.h

stdio.h

(3)初始化方式

①已知显示器类型的图形系统初始化

  已知所用图形显示器的种类和要使用的图形模式,初始化图形系统可如下面程序所示:

例3.1

#include "graphics.h"

 main()

{int gdriver,gmode;

 gdriver=CGA; /*设置驱动程序为CGA*/

 gmode=CGAC0;        /*选用CGA图形模式*/

 initgraph(&gdriver,&gmode,"c:\\TC");

       /*初始化图形系统*/

 bar3d(10,20,50,80,0,0);  /*画一实心长方形*/

 getch();                      /*等待按一键结束*/

 closegraph();       /*关闭图形系统,回到文本方式*/

}

此处也可用整型常数代替符号常量

gdriver=1; gmode=0;

②不知显示器类型的图形初始化。

   Turbo C提供了一个对图形显示器硬件测试的函数detectgraph()。

   它的格式为:

void far detectgraph(int *gdriver,int *gmode);

该函数在计算机有图形适配器的情况下,确定图形适配器的类型,若系统有图形适配器,则返回适合于适配器的图形驱动程序的代码,用gdriver指向的整型量表示,该函数把gmode所指的变量设置为适配器所能支持的最高分辨率。若系统无图形适配器,则gdriver所指变量为-2。

例3.2

#include "stdio.h"

#include “conio.h”

#include “stdlib.h”

#include "graphics.h"

main()

{      int gdriver,gmode;

       detectgraph(&gdriver,&gmode);    

/*测试结果存放于gdriver,gmode中*/

       if(gdriver<0)

{ printf("there is not graphics displayer\n");

       exit(1);

              }                                               /*无图形显示模式时,显示信息,停止程序*/    

标准的输入输出函数

调用DOS控制台I/O子程序的各个函数

说明一些常用的子程序:转换子程序,搜索、排序子程序

   可以把上述对图形显示器的检测和初始化工作放在一起来自动完成,即规定gdriver=DETECT,则 initgraph()函数会自动按照系统所配置的图形显示器来确定驱动程序,并把图形模式设置为检测到驱动程序的最高分辨率,实现图形系统初始化。

③自动初始化图形系统

printf("detect graphics driver is

         # %d,mode is # %d\n ",gdriver,gmode);

      /*显示硬件测试结果*/

       getch();             /*等待按一键*/

       initgraph(&gdriver,&gmode,"c:\\tc");     /*初始化*/

      bar3d(10,20,50,80,0,0);                          /*画实心长方形*/

      getch();

       closegraph();                            /*关闭图形系统,返回文本模式*/

      return (0);

}

例3.3

# include "graphics.h"

# include “conio.h”

main()

{          int gdriver=DETECT,gmode;      

    /*自启动搜寻显示器类型和显示模式*/

         initgraph(&gdriver,&gmode,"c:\\tc");       /*初始化*/

    bar3d(10,20,50,80,0,0);

            /*画实心长方形*/

            getch();      /*等待按一键*/   

            closegraph();     

            /*关闭图形系统,返回文本模式*/

    return (0);

}

2. 图形系统的关闭

   从上述几个例子已看到在图形编程中均先用函数initgraph()对图形系统进行初始化,即启动图形系统,进人绘图状态,而在程序结束前都用函数closegraph()关闭图形系统,以释放图形驱动程序所占用的内存空间,使系统回到文本文件。

关闭图形系统函数格式为:

   void far closegraph();

所有有关图形显示程序一定是在initgraph()和closegraph()之间。从initgraph()后,显示器就进入图形方式,而从closegraph()后,显示器就退出图形方式回到文本显示方式。

3. 图形模式的控制

为了对图形系统模式进行控制,即从图形模式转换成文本模式,或从文本模式转换成图形模式,或设置驱动器有效模式,或读取当前图形模式和范围,Turbo C都提供了相关函数:

(1)从图形模式转换成文本模式

(2)从文本模式转换成图形模式

(3)设置驱动器有效模式

(4)读取当前图形模式和范围

(l)返回当前图形模式值

  int far getgraphmode(void);

 函数返回当前图形模式,其返回值如表p51 3.2所示。

(2)恢复屏幕在图形初始化前模式

  void far restorecrtmode(void);

函数使initgraph()函数所选定图形模式关闭,返回到调用initgraph()前状态。

(3)设置系统图形模式并清屏幕

  void far setgraphmode(int gmode);

函数把当前图形模式设置为gmode所指定的模式。

(4)获取图形驱动器可使用的模式范围

  void far getmoderange(int driver,int *lomode,int *himode);

   该函数确定由driver所指定图形驱动器能够支持的最低和最高模式,并且把这些值放在由lomode和himode所指向变量中。

   通过调用此函数,可实现使显示器暂时离开图形模式进入文本模式,进行文本输出,然后不经过initgraph再返回图形模式。

例3.4

#include "graphics.h"

#include "stdio.h"                      

#include “conio.h”

main()

{   int gdriver,gmode,lo,hi;

            gdriver=CGA;                                                    /*设置CGA的图形驱动程序*/

            getmoderange(CGA,&lo,&hi);

            /*获得CGA的图形模式范围*/

    printf("CGA surpporting modes range from %d to %d.\dn",lo,hi);

            /*显示CGA显示模式范围*/     

            initgraph(&gdriver,&lo,"c:\\tc");

    /*初始化CGAC0*/

           

bar3d(100,30,130,150,0,0);                    

    /*画一实心方块*/

getch();

gmode=getgraphmode();  /*获得现行图形模式*/

restorecrtmode();                                   

            /*返回图形初始化前的现实模式*/

printf("Now in text mode,press any key back to graphics mode. \n");

getch();

setgraphmode(gmode);   

   /*再回到图形模式*/

rectangle(50,30,100,130);                      

   /*画一长方形*/       

getch();

closegraph();      /*关闭图形系统*/

return (0);

}

四、图形坐标的设置

即运用光标定点,确定坐标位置。

可用Turbo C提供的函数来设定坐标(定点),读取当前光标的位置以及x、y轴的最大值。 

1.定点

(1)把当前光标移到所需的位置(即x、y点)

   void far moveto(int x,int y);

  此函数把当前窗口中的当前光标位置(cp)移到所需的(x、y)位置(不是画)。

(2)以增量方式移动当前光标

void far moverel(int delax,int delay);

  此函数把光标从当前位置(cp)开始,在x,y方向移动,移动距离分别为delax,delay。

例如:若当前光标位置在(10,10)处,执行下列语句后即移到(20,30)的位置上。

      moverel(10,20);

2. 读取当前光标位置

  int far getx(void);

此函数返回光标在x轴位置。

  int far gety(void);

此函数返回光标在y轴的位置。

例3.6 画一“王”字

3.读取x,y轴的最大值”

  int far getmaxx(void);

此函数返回x轴的最大值(最大横坐标)。

  int far getmaxy(void);

此函数返回y轴的最大值(最大纵坐标)。

例如:下列语句显示光标当前位置的x、y值:

printf("cp's loc:%d%d",getx(),gety());

3.2 图形颜色设置

    在画图时,往往要求配置一定的颜色以使图形光彩夺目。颜色分为前景色和背景色。前景色是指构成字符和图形点的颜色;而背景色是指整个显示屏颜色。Turbo C提供了多个颜色控制函数用来设置前景、背景、改变调色板等。

一、 颜色的设置

画图时,用户可以对当前的背景颜色和作图颜色进行设置。

1. 设置当前背景颜色

 void  far  setbkcolor(int color);

  将背景色设置成color所指定的颜色值。参数color可以用名字,也可以用数字,它们对应关系在graphics.h中定义,表3.3(见书P60)列出背景色名称和数值的对应关系。缺省时,默认值为0,即黑色。

2. 设置当前画图颜色

   void far setcolor(int color);

 该函数把当前画图颜色设置为color所指定颜色,即画笔的颜色。实际对应的颜色和调色板有关,缺省时,默认值是白色。

例3.11 将背景颜色设置为黄色,画笔设置为红色,

       画一圆。

#include "graphics.h"

#include "conio.h"

void main()

{int gdriver,gmode;

 gdriver=VGA;

 gmode=EGAHI;

 initgraph(&gdriver,&gmode," ");

 setbkcolor(YELLOW);             

 /*设置背景色为黄色*/

 setcolor(RED);

 /*设置画笔为红色*/

 circle(120,100,50);       /*画一圆*/

 getch();          

 closegraph();

}

这是允许的

二、 调色板

调色板:是设置画颜笔的组合

    设置当前画笔色与调色板有关,对应一个显示设备可能有多个调色板,这意味着尽管硬件能够显示多种颜色,但由于同一时间内只能使用一个调色板,所以在同一时间内只有显示

设备可能显示总颜色的一个子集可以被显示出来,因为调色板内颜色的数只受到可用视频内存的限制。根据颜色控制方法不同,可以把支持的颜色屏幕划分为两类:一类是CGA,包括CGAHI、MCGAMED、MCGAHI、ATT400MED、ATT400HI;另一类是EGA,包括EGA和VGA适配器。

1、CGA调色板

    CGA类屏幕有两种分辨率:低分辨率和高分辨率。

  (1)低分辨率

低分辨率方式显示320×200个像素点,4种颜色;

第三章 C语言图形程序设计基础

在CGA低分辨率方式下,可以显示4种颜色,这4种颜色由选择的调色板决定。在CGA方式下可以使用的调色板有CGAC0、CGAC1、CGAC2和CGAC3。每种CGA调色板均含有4种不同颜色,调色板不同所包含的颜色也不一样。

每种调色板只能使用与它列在同一行中的颜色,其编号依次为0、1、2、3,也可以使用符号常量。

表中调色板号是图形方式

而颜色0是背景色,颜色1、2、3是像素点颜色。调色板在initgraph函数中设置,颜色用setcolor函数设置。

背景色默认是黑色

如果setcolor(a),a>=3,那么将显示值最大的那种颜色,例如CGAC0,将显示黄色

(2)高分辨率

高分辨率方式显示640×200个像素点,只有两种颜色。黑色背景和彩色前景。由于CGA本身原因,背景色就是硬件所认为的背景色,可用setbkcolor参照课本P60表3.3设置,前景色(即画笔颜色)始终是青色。

例3.12在高分辨率下画一青色圆。

# include "graphics.h"

#include "conio.h"

void main()

{

int gdriver=CGA,gmode=CGAHI;

initgraph(&gdriver,&gmode, "");

cleardevice();

setbkcolor(3);

circle(160,100,50);

circle(160,100,25);

getch();

closegraph();

}

程序执行后,在青色屏幕上显示两个白色圆图形。

2、EGA调色板

    对EGA来说,总共可以有64种颜色,但只有一个调色板,这个调色板只有16项,可同时显示16种颜色。默认的这16种颜色可参看P60表3.3。表3.5(见书P63)的颜色不准确,是随机选取的,不作为参考。

3、改变调色板的一种颜色

void far setpalette(int oldcolor,int newcolor);

    此函数改变屏幕系统所显示颜色。它把调色板oldcolor变为newcolor。

(1). 对于CGA模式,

    只有背景色能改变,而背景色总是取oldcolor=0

例如,下列语句可把背景色改成绿色:

  setpalette(0,GREEN);

Turbo C中好像不支持对该函数的执行

(2).对于EGA模式

可以用setpalette( )函数将某一种颜色设置为16     种不同颜色中的一种。oldcolor是表3.3中任一     颜色,而newcolor是表3.5中前7种颜色。

例如:setpalette(BLUE,EGA-GREEN);

      或setpalette(1,2);

将屏幕上的蓝色(BLUE)均变为绿色(EGA-GREEN)

三、获取颜色信息

1. 读取当前背景颜色

int far getbkcolor(void);

该函数返回当前背景颜色,其背景颜色值如表3.3所示。

例如:下列语句显示当前背景颜色:printf("background color is %d",getbkcolor());

2. 读取当前画图颜色

int far getcolor(void);

该函数返回当前画笔颜色。

例如,在CGAC2图形模式下,调色板包含四种颜色:0为背景色,1为绿色,2为红色,3为棕色。如果 getcolor( )函数的返回值为 1,则当前画笔色为绿色。

3.读取最高可用颜色数

int far getmaxcolor(void);

   该函数返回当前屏幕模式下最大有效颜色值。在EGA模式下,getmaxcolor()函数返回最大值为15,这表明用setcolor()函数值在0-15有效;在CGA低分辨率模式中,getmaxcolor()函数返回最大值为3,这表明用setcolor()函数值在0-3有效;而在CGAHI模式中,返回值为1,因为画笔始终是青色。

4. 在点(x,y)处画一规定颜色点

void  far  putpixel(int x,int y,int color);

把color所指定的颜色写到(x,y)处的像素上。

5.读取点(x,y)的颜色

int far getpixel(int x,int y);

此函数返回指定点x,y位置上的像素颜色。

例3.14 在不同位置画点

#include "graphics.h"

#include "conio.h"

void main()

{int gdriver=DETECT,gmode;

int color,i,max;

initgraph(&gdriver,&gmode, "");

max=getmaxcolor();

for(i=0;i<20;i++)

putpixel(50+i*10,20,max);

color=getpixel(50,20);

putpixel(150,150,color);

getch();

closegraph();

}

得到当前屏幕模式下最大有效颜色值

以(50,20)为起点,在X正方向上每隔10用当前屏幕模式下最大有效颜色画点

得到点(50,20)的像素颜色

把color所指定的颜色写到(150,150)处的像素上。

3.3  线的特性设定和填充

 一、线的特性设定

用画线函数进行画线时,其默认值均属于一像素点宽度的实线。为了改变线形与线宽,Turbo C提供了可以改变线型和线宽的函数。

void far setlinestyle(int linestyle,

                  unsigned pattern,int width);

该函数所用三个参数含义如下:

(1)linestyle:为整型值,用来定义所画直线类型

  表中前四种为系统预定义的类型,第五个为用户自定义类型。

线型的代号说明

(2)pattern:无符号整型数。该参数在需要用户自定义线型时使用,如果是使用前四种系统预定义的线型,则该参数可取0值。

(3) width:整型数。指定所画直线的粗细,以像素为单位,分为两种情况

通过上述几个参数的不同组合,就可以根据需要画出不同类型、不同粗细的直线。

例如:setcolor(RED);

Setlinestyle(DASHED-LINE,0,THICK-WIDTH);

line(10,20,150,70);

从(10,20)到(150,70)用一条红色的3个像素宽点划线

当函数setlinestyle的第一个参数为USERBIT-LINE(或4)时,可以由用户自己定义直线类型。此时,第三个参数意义同前,直线类型在第二个参数中定义,该参数是一个16位二进制码,每一位(bit)表示一个像素。某一位置1时表示直线上相应位置以当前颜色显示;如果某位为0,则其对应像素不显示或不改变(仍用原来颜色)。

  例如:1111  1111  1111  1111

 16位全置1,因此画一条16个像素的点实线(就是实线)。

        1010  1010  1010  1010

 则隔位置1,因此画一条16个像素的点虚线(就是点线)。

  在实际编写程序时,一般把16位二进制数转换为4位十六进制数,每4位二进制数转换为1位十六进制数,故上面两个例子转换为十六进制数为:FFFF和AAAA

    函数调用方法为:setlinestyle(4,0xAAAA,1);

用这种方法,可以根据需要定义各种线型。

#include <graphics.h>

例3.15演示系统预定义的四种线型

#include "conio.h"

#include "stdio.h"

void main()

{

int i,j,c,x=50,y=50,k=1;

int gdriver=DETECT,gmode;

printf("input color number.\n");

scanf(“%d”,&c);      /*输入所选择的颜色*/

initgraph(&gdriver,&gmode, "c:\\tc")

cleardevice();

setbkcolor(11);        /*设置背景色为浅青色*/

setcolor(c);         /*设置前景色为输入颜色*/

for(j=1;j<=2;j++)

      {for(i=0;i<4;i++)

        {setlinestyle(i,0,k);

          rectangle(x,y,x+210,y+80);

          x=x+110;

          y=y+40;

        }

       k=3;

      x=50;

      y=250;

     }

getch();

closegraph();

}

Setlinestyle(1,0,1) ,线型为点线, 1个像素宽

Setlinestyle(2,0,1) , 线型为中心线, 1个像素宽

当输入颜色为红色时结果如下:

Setlinestyle(0,0,1),线型为实线, 1个像素宽

Setlinestyle(1,0,3),线型为点线,3个像素宽

Setlinestyle(2,0,3),线型为中心线, 3个像素宽

Setlinestyle(3,0,3),线型为虚线, 3个像素宽

Setlinestyle(0,0,3),线型为实线,3个像素宽

Setlinestyle(3,0,1),线型为虚线, 1个像素宽

2.设置文本对齐方式

   void far settextjustify(int horiz,int vert);

此函数规定文本输出在水平和垂直方向上的输出方式.参数horiz和vert是整型数, 用来确定文本输出的当前对齐位置。

horiz和vert的取值

horiz确定

水平方向的

对齐位置

vert确定垂直方向的对齐位置。

例如,执行settextjustify(RIGHT_TEXT,BOTTOM_TEXT);

 后,若执行outtextxy(100,120,"AAAAAAAAAAAA");

则(100,120)指的是所输出字符串右下角。在缺省情况

下,对齐方式是 LEFT_TEXT,TOP_TEXT,如果用outtextxy

输出上面字符串,则(100,120)指的是字符串左上角。

3.改变矢量字体宽度和高度

void far setusercharsize(int multx,int divx,

                         int multy,int divy);

此函数设置了用户定义的笔画字型放大系数,x、y方向的放大系数分别为multx/divx,multy/divy。调用setusercharsize()函数之后,每个显示在屏幕上的字型都以缺省值大小乘以multx/divx为字符宽,乘以multy/divy为其字符高。这种方式只是在settextstyle()函数中的charsize=0时才起作用。  

用户自定义字符的大小,即USER_CHAR_SIZE(默认为0)

3.5 图形存取处理

     在图形方式下,图形存取有着重要的作用,这也是图形动画的基础。图形存取的基本原理是:把屏幕上某个区域的信息存入一个缓冲区,然后在另一个区域把它的内容显示出来。

一、 检测所需内存

   unsigned far imagesize(int x1,int y1,int x2,int y2);

     该函数返回一个无符号整数值,它是存储图形所需的字节数。参数x1,y1,x2,y2均为整型数,用来确定要存储的屏幕区域。这个区域是一个矩形,其左上角坐标为(x1、y1),右下角坐标为(x2,y2)。

例如:执行 unsigned size;

size=imagesize(10,10,100,100);

将把存储左上角为(10,10),右下角为(100,100)的矩形区域所需的内存字节数存人变量size中。存储屏幕区域所需的字节数最多不能超过 64K-1个字节,否则返回值为-1( 0 xFFFF)。也就是说,图形存取限制在64K字节之内。

二、 图形存入内存

   void far getimage(int x1,int y1,int x2,int y2,void *bitmap);

     该函数将指定区域的图形从屏幕拷贝到内存区域。要复制的屏幕区域由左上角(xl,y1)和右下角(x2,y2)给出,它应当与imagesize函数中参数相同。bitmap是一个void类型指针,需要复制的屏幕区域将保存在由它所指向的数组中。

例如:void *w;

      unsigned size;

      size=imagesize(10,10,100,100);

      w=malloc(size);

      getimage(10,10,100,100,w);

malloc函数的作用是得到指向大小为括号的内存区域的地址指针,它放置在stdlid.h中。

三、 从内存复制图形到屏幕

void far putimage(int x,int y,void *bitmap,int op);

该函数将getimage函数保存的图形重新送回屏幕。参数(x,y)是恢复显示图形左上角的位置,bitmap是指向void类型的指针,它指向用getimage函数复制的数组。参数op是一个整型数,是图形复制到屏幕上显示方式

参数OP的取值

如果想使原来的图形反相显示则可使用下面语句:

putimage(110,10,W,NOT_PUT)

如果使用XOR-PUT,则内存中的像素与当前屏幕上的像素进行异或操作。如果两个像素都为1,则相应的位被置为0,从而使原来的图形消失。如果再复制一次,则会重新出现。利

用这一特性,可以实现动画操作。

3.6   常用画图函数简介

 一、 直线类函数

 1.指定两点间画一直线

    void far line(int x1,int y1,int x2,int y2);

  用当前颜色从点(x1,y1)到点(x2,y2)画一条直线,当前位置(CP)不变。

2.从当前位置到(x,y)点画一条直线

  void far lineto(int x,int y);

  用当前颜色从当前位置(CP)到(x,y)点画一条直线,并把(CP)位置定位在(x,y)点。

3.从当前坐标以相对增量方式画直线

  void far linerel(int deltax, int deltay)

  从当前位置到相对CP位置在X方向增大deltax,在Y方向增大deltay画一直线。

二、 多边形类函数

1、画矩形

void far rectangle(int left,int top,int right,int bottom);

用当前画笔画出由坐标(left,top)及(right ,bottom)所定义的矩形。

2.画多边形

void far drawpoly(int numpoints,int *polypoints);

用当前画笔画一多边形,多边形的顶点数为numpoints, *polypoints指向一个整型数组,共有numpoints*2个整数组成,每一对整数给出一个多边形顶点(x,y)坐标。

三、 圆弧类函数

1、画一圆弧

void far arc(int x,int y,int startangle,int endangle,int radius);

以(x,y)为圆心,radius为半径,从起角startangle到终角endangle,以当前颜色画一圆弧。

2. 画一椭圆弧

void far ellipse(int x, int y, int start,int end, int xradius, int yradius);

用当前颜色画一椭圆弧,其圆心为(x,y),x轴、y轴半径分别为xradius,yradius,起始角和结束角分别为star和end。若起始角star为0°,结束角end为360°,则画的是一个完整的椭圆。

3. 画一圆void far circle(int x, int y, int radius);

以(x,y)为圆心。以radius(用像素表示)为半径,用当前画笔颜色画一圆。

四、 填充类函数

1、画矩形条

void far bar(int left,int top ,

              int right,int bottom);

画一矩形条,该条用当前填充模式和填充色填充。条的左上角由(left,top)给出,条的右下角由(right,bottom)给出。只画矩形条,不画出条形轮廓,由setfillstyle()定义填充模式和填充色。

2.画三维矩形条

void far bar3d(int left, int top,

               int right, int bottom,

               int depth, int topflag);

画一三维矩形条,该条用当前填充模式和填充颜色填充,条左上角由(left,top)给出,条的右下角由(right,bottom)给出,以像素为单位,条形深度由depth给出,topflag不为零时则放一个顶盖,否则该三维矩形条无顶盖,由setfillstyle()函数给出填充模式和颜色。

3.画多边形并填充

void far fillpoly(int numpoints,

                  int *polypoints);

用当前画线类型和颜色,画一顶点数为numpoints的多边形,然后用当前填充模式和填充颜色填充这个多边形,polypoints所指数组共有numpoints*2个整数,每一对整数对应给出多边形一个顶点的x和y坐标。由setfillstyle()函数给出填充模式和颜色。

4.画一扇形并填充

void far pieslice(int x, int y, int stangle,

                  int endangle, int radius);

以(x,y)为圆心,radius为半径,stangle为起始角,endangle为终止角,画上扇形,并且以当前填充模式和颜色填充。该函数用当前画笔画出扇形外廓线。由setfillstyle()为函数给出模式和颜色。

5.画一个椭圆扇区并填充

void far sector(int x, int y,int stangle,

        int endangle, int xradius, int yradius)

以(x,y)为圆心,xradius为水平轴,yradius为垂直轴,stangle为起始角,endangle为终止角,画一个椭圆扇区,并用当前填充模式和颜色填充,该函数用当前画笔画出椭圆扇区外廓线。由setfillstyle()函数给出模式和颜色。

九、作业

    课后习题

十、本章小结

在本章中,介绍了在c语言下进行图形程序设计的基础知识:图形颜色设置,线的特性设定和填充,图形模式下文本处理等。

 

第4章  第四章  二维图形生成和变化技术

一、教学目标

        通过对本章的学习,要求熟悉二维图形的基本绘图元素,特别是直线段的生成和曲线的生成。

二、教学要求

1、掌握直线段的生成;

2、掌握区域填充的方法。

三、教学内容提要

4.1 基本绘图元素

4.2 直线段的生成

4.3 曲线的生成

4.4 区域填充

4.5 二维图形变换

4.6 二维图像裁剪

4.7 反走样技术

四、教学重点、难点及解决方法

重点是掌握直线段和曲线的生成。

五、课时安排

    8学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

    4.1  基本绘图元素

    在第二章我们已讨论过坐标系统的世界坐标系、规范坐标系和设备坐标系三种坐标系。坐标系统确定之后,需要使用不同的绘图元素来描述图形,它们是点、直线、曲线和其他基本的图形元素。

一、点

    点是图形中最基本的图素,直线、曲线以及其他的图元都是点的集合。在计算机图形学中,点是用数值坐标来表示的。

在三维坐标系中点是由(x,y,z)三个数值组成的坐标表示

二、直线

    一条直线是指所有在它上面的点的集合,在图形学中研究的对象是直线段。

    已知线段的起点坐标(Xs, Ys)。终点坐标(Xe, Ye)这两点就确定了这条线段,并用线段上的任意一点(x, y)均满足:图形显示器是由一个个排列有序的像素所构成,画一条直线实际上是根据一系列计算出来并与该线靠近的像素而绘制。 因此,显示器划分的像素点越多分辨率越高。绘图仪绘制线段是笔在X,Y方向移动,画线时单方向的一次移动距离称为步矩,设备的步矩越小,绘出的图形越精确。

三、曲线

    曲线包括圆、椭圆、弧线和由许多类型的方程所确定的图形。在计算机图形程序设计中最好将曲线定义成不能构成直线的点的集合。曲线被认为是图形学的基础。

三次参数曲线

4.2  直线段的生成

    直线段是最基本的图形,因此,直线段生成的质量好坏与速度快慢将直接影响整个图形生成的质量和速度。

    直线生成算法在图形软件设计中起着关键的作用。

    下面介绍几种直线生成算法:

①逐点比较法

②数值微分法(DDA法)

③Bresenham法

    区域填充是一个彩色区域,可以是均匀的也可以是不均匀的,区域边界可以是直线也可以是曲线。

    可提供不同的内部填充类型用以充满区域内部,填充的类型可能是不同的颜色,不同的灰度或者不同的填充图案。还可以用方程生成的梯度变化曲线完成填充过程。阴影填充可以通过来自一个光源的投影直线计算出,因而在填充区域中的像素相应地发生变化。用户可根据系统硬件和软件,用一种或几种色彩进行填充,也可使用多种颜色填充区域。

δ=tgβ-tgα=

当δ<0时,表示笔在OA线段下方,应该向+Y方向走一步

当δ>0时,表示笔在OA线段上方,应该向+X方向走一步

由于分母XMXA>0,因此只需判断分子 YMXA-YAXM的正负

即可,得偏差公式:

                  FM=YMXA-YAXM

对任意点,偏差函数的一般形式为:

                  Fi=XAYi-YAXi

其中,XA,YA是终点A坐标。

    2)递推公式

    由公式可以看出,由于每次要计算两次乘法和一次减法,所以计算工作量大, 为了简化计算,可设法用前一点的偏差来推算后一点的走步方向以及走步后的偏差,这种方法称为递推法。递推公式很容易用计算机实现。

递推公式可根据下图用偏差函数判断笔进方向的图例得出

设笔当前位置为 M1(X1,Y1),此时F1=Y1XA- YAX1<0,应走+Y一步到M2即X2=X1,Y2=Y1+1,+1表示走一步M2处的偏差为:F2=Y2XA-YAX2=F1+XA(用X2=X1,Y2=Y1+1代入得到)

若F2≥0,应走+X一步到M3,则X3=X2+1,Y3=Y2,M3处的偏差为:F3=Y3XA-YAX3=Y2XA-YAX2-YA=F2-YA

这样依次进行下去,就得到第i步的递推公式 :

当Fi≥0时,向+X方向走一步,此时偏差Fi+1=Fi-YA(i=1,2,……n)。  

当Fi≤0时,向+Y方向走一步,此时偏差Fi+1=Fi+XA(i=1,2,……n)。  

偏差Fi的推算,只用到终点坐标值XA ,YA而与中间点的坐标值无关,且只需进行加减运算。

3)任意象限偏差计算

对于第二、三、四象限的直线,也可类似推出。当直线段处于第二、三、四象限时,偏差值的计算及走步方向如下表所示:

二、  数值微分法(DDA法)

1.定义

数值微分法即DDA法(Digital Differential Analyzer),这是一种基于直线的微分方程来生成直线的方法。

2.数值微分法的原理

    设(x1,y1)和(x2,y2)分别为所求直线的端点坐标,由直线的微分方程得

可通过计算由x方向的增量Δx引起y的改变来生成直线,

由yi+1=yi+Δy(yi为直线上某步的初值)

则     可通过计算由y方向的增量引起x的改变来生成直线

若设Xi+1=Xi+Δx 则:实际上是一个递推公式,即yi+1由前一点的yi和X的增量

求得; Xi+1由前一点的Xi和Y的增量求得。

3.DDA的算法基本思想

    选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大)取该方向上的Δx为一个像素单位长, 即x每次递增一个像素,然后利用前面公式计算相应的y值,把每次计算出的(xi+l, yi+1)经取整后顺序输出到显示器,则得光栅化后的直线。

        为什么取x2-xl和y2-y1中较大者步方向?

此图中Y2-Y1=8>X2-X1=4

三、 Bresenham法

1、问题提出

    DDA法就是根据直线的斜率来计算出下一个y值,经取整后以确定下一个像素点,因为进行取整运算,这就难以避免所取像素点偏在实际直线的某一侧。而Bresenham算法根据直线的斜率确定或者选择变量在X轴或Y轴方向每次递增一个单位,其变量的增量值根据实际直线与网格交点与像素点的距离来选择像素点而取0或1,这距离称为误差,记作e。

(1)偏差e

实际直线与网格交点与像素点之间的距离称偏差e。以左图第一个八分图的直线为例,即直线的斜率在0~1之间。

若通过(0,0)的直线的斜率大于1/2,即e>l/2,它与x=1直线的交点离y=l直线较y=0直线近,因此取像素点(1,1)。具体见图中的e2

如果斜率小于l/2,即e<l/2,则应取像素点(l,0)。具体见图中的e1

当斜率等于 l/2时,即 e=l/2,没有确定选择标准,但算法选择(l,l)像素点。

e>1/2

e<1/2

2、Bresenham法基本思想

Bresenham法基本思想是:使得每次只要检查误差项的符号就可以决定实际的增量。

(2)偏差e的计算     

由图可知,在步进一个像素点后的误差为原误差加上直线的斜率,即e=e+Δy/Δx

为了简化判断可设e’=e-l/2,这样只要判断e’的符号即可,首先令误差项的初值为-1/2。

初始,如果e’=Δy/Δx-1/2大于或等于零,则x加1,y加1;如果小于零,x加1,y不动(由前面的图可以看出)。

4.3  曲线的生成

     在科学技术中常常需要绘制曲线,而绘制曲线的根据或要求各不相同,通常遇到的约有下述几种情况。

(1)规则曲线的绘制:已知曲线的方程,要求画出曲线

(2)曲线拟合:由试验或观测得到了一批数据点,要求用一个函数近似地表明数据点坐标间的关系,并画出函数的图像(曲线)。

(3)曲线插值:由试验、观测或计算得到了由若干个离散点组成的点列,要求用光滑的曲线把这些离散点连结起来。曲线插值与曲线拟合不同,拟合并不要求曲线通过数据点。

(4)曲线逼近:在曲线形状设计中,给定了折线轮廓,要求用曲线逼近这个折线轮廓。

上述各类问题都要求画出曲线,不同的是,规则曲线的绘制中曲线的方程为已知,而曲线拟合、曲线插值、曲线逼近问题则需要首先找出或构造出曲线的方程,再根据曲线方程画出曲线。除圆等少数曲线外,根据方程画曲线一般是先计算出曲线上一系列适当靠近的点,然后依次将这些点用直线连起来,得到一条由折线表示的近似曲线。只要这些点靠得足够近,看起来就是一条光滑的曲线。

当判断结果落在圆外时,向-X方向走一步。直到再次到达圆内为止。

一、圆弧的生成

1.逐点比较法

   (1)基本思想

    逐点比较法绘制圆弧的原理与逐点比较法生成线段类似,也是在图形输出设备上每步输出逼近欲画的圆弧。

    用逆时针画第一象限中的AB圆弧的过程如下:

从始点(xA,yA)点开始画起,首先向圆内走一步,也就是先向-X方向走一步,然后与所要画的圆弧进行比较

判断结果,落在圆内时向Y方向走一步,依次类推,一直到达圆处为止 

当画到终点以(xB,yB)时,终止比较,AB圆弧绘制结束。

逐点比较法绘制圆弧时一般定为先进后出,有顺圆走向和逆圆走向两种移动规则。

顺时针走向

逆时针走向

(2)判别函数

从上面绘制圆弧的过程可知,归根到底,是用什么方法来比较当前点是否落在圆内,还是落在圆外,然后决定走向。设圆心为o(x0,y0),起点坐标为A(xA,yA),终点坐标为B(xB,yB),并假定绘图笔当前点位置为M(xM,yM),于是圆的半径为R,即 

令FM=RM-R作为判别函数。为了简化计算,取

               (由于RM-R很小)作为判别函数,显然:

    ①FM<0,表示M点在圆弧内 走+Y方向

    ②FM>0,表示M点在圆弧外 走-X方向

    ③FM=0,表示M点在圆弧上 走-X方向(约定)

因此,根据FM的正负,可以确定走向。

2、数值微分法(DDA法)

 (1)一般DDA法

        1)一般递推公式

        圆弧的DDA法和直线段DDA法类似,也是根据圆弧的微分方程来实现的,我们以圆心在坐标系原点,半径为R的一段圆弧为例来讨论。

  角度DDA法比上面介绍的DDA法更加容易理解,它实际上就是把圆或圆弧分成N等分。用N段相邻的直线来逼近圆或圆弧,这种方法显然是建立在直线段生成算法的基础之上的,因而其效率要低些,但很好理解。

二、椭圆的生成(Bresenham法)

(1)基本思想

    主要考虑标准椭圆的生成,中心在原点(中心若不在原点可以通过平移得到),长短半轴都是对称的。由于椭圆是轴对称函数,因此只要考虑第一象限的情况,其它象限中像素点的位置可以通过对称性得到。

        在介绍直线段生成的时候,Bresenham方法实际上就是每一步在某直线真实点周围的若干像素点中选取一个最靠近真实点的像素作为该步的绘制点。

        同理,在椭圆的Bresenham法中也是采用了相同的机制予以实现。为了更加准确的判定出哪个像素点是最近点,引入了一个中点加以辅助判断,因此,也将该方法称为中点Bresenham算法。

(2) 标准的椭圆方程

其中,a和b分别是椭圆的长短半轴的半径

 在第1象限的椭圆弧需要做一个划分,即同时经过椭圆弧上斜率为-1的切线点与原点的直线将第1象限划分为两个区域,如图4.21所示。

在上半区,?x的增量比较重要,而在下半区,?y的增量更为明显。

(3) 原理详解和判别公式

如图4.22所示,先考察上半区的放大方格,像素点P(xp, yp)是当前选取的像素点,由于上半区主要考虑X方向上的增量,因此下一步有两个候选的像素点,分别是H(xp+1, yp)和L(xp+1, yp-1)。

将标准的椭圆方程进行改写,可得F(x, y)=b2x2+a2y2-a2b2=0

通过观察,可以判定H点距离椭圆的真实点更加靠近,因此下一步应该选取H点作为椭圆像素点。当然,计算机必须通过严格的计算才能得出这一结论。引入点M(xp+1, yp-0.5)作为H点和L点之间的中点,由此可以定义判别公式如下:

dTM= F(xp+1, yp-0.5)=b2(xp+1)2+a2(yp-0.5)2-a2b2

dTM= F(xp+1, yp-0.5)=b2(xp+1)2+a2(yp-0.5)2-a2b2

    (1)如果dTM <0,就选择像素点H,并且引入新的中点,即M的下一个中点M’(xp+2, yp-0.5),此时将M’代入判别公式,将得到:

dTM’= F(xp+2, yp-0.5)=b2(xp+2)2+a2(yp-0.5)2-a2b2= dTM +b2(2xp+3)

可知b2(2xp+3)为? dTM。

    (2)如果dTM >0,就选择像素点L,并且引入新的中点,即M的下一个中点M’’(xp+2, yp-1.5),此时将M’’代入判别公式,将得到:

dTM’’= F(xp+2, yp-1.5)=b2(xp+2)2+a2(yp-1.5)2-a2b2= dTM +b2(2xp+3)+ a2(-2yp+2)

可知b2(2xp+3) + a2(-2yp+2)为? dTM。

这样只要根据? dTM的值是否为正或负,就可以完成椭圆弧上半区的绘制工作。

        同理,椭圆弧下半区主要考虑Y方向的步进, 其原理和上半区是相同的。

        下面来讨论图4.22两个区域中点M的初始值问题。由于椭圆的起始点为(0, b),因此第一个中点MT0的坐标为(1, b-0.5),对应的判别公式为dT0= F(1, b-0.5)= b2+a2(-b+0.25)。假设上半区的最后一个点的坐标为(x, y),则判别所需中点的坐标为(x+0.5, y-1),对应的判别公式为dB0= F(x+0.5, y-1)= b2(x+0.5) 2+a2(y-1) 2-a2b2。

        椭圆的生成实际上是圆的特殊情况,那么中点Bresenham算法是否能够用于圆弧的生成呢?答案是肯定的而且更为简便,圆弧具有八方对称性,因此只需要画出八分之一圆弧就可以了。

4.4区域填充

区域是指相互连通的一组像素的集合。区域通常由一个封闭的轮廓来定义,处于一个封闭轮廓线内的所有像素点即构成一个区域。

   所谓区域填充就是将区域内的像素置成新的颜色值或图案。区域填充是计算机绘图的一种基本操作,相当一部分绘图都用到它。

   对于区域填充来说,它要解决两个问题:

①确定需要填充哪些象素,

②确定用什么颜色或图案。

处于一个封闭轮廓线内的所有像素点即构成一个区域

区域填充就是将区域内的像素置成新的颜色值或图案

我们知道多边形是常用基本图形,它是由一组边围成,封闭区域,多边形也可以是凸、凹或是带空洞。多边形区域填充就是将区域内的像素置成新的颜色值或图案。由于任何一个封闭曲线都可以用多边形来逼近,所以多边形填充实用面广。

一、多边形区域填充

1.区域内部点判断准则

   区域填充首先判断一个象素点是否处于多边形区域内,其判断准则如下:

   从该点向无穷远处引出一条射线(也称扫描线),若射线与区域边界交点目标数目为奇数,则此点在区域内。若射线与区域边界交点目标数目为偶数,则此点为区域外点。

(2)当扫描线重合多边形某条边界水平线时,如该水平边线前后两条边线是一上一下的,则该水平边线两个端点作为一个交点,即扫描线与该水平边界线相交了一次。

2.边相关性及边记录

    很显然,不能利用区域内部点判别准则对显示平面上每个点逐个判别,这样计算量太大。

    事实上,相对于一个给定多边形区域来说,显示平面上每个像素点内外特性是互相关联的。相邻像素间具有相关属性。在实施多边形填充时,利用扫描线相关性,就无需对扫描线上所有像素点逐个地进行内外特性判断,只需对一条扫描线从左到右求出该扫描线与区域边界交点,这些交点必将扫描线分成内外交替线段,这些交点x值大小依次排列。

3.边表ET和活动边表AET

(1)边表ET 

边表是一个包含多边形全部边记录的表,它按y坐标(与扫描线一一对应)递增(或递减)的顺序存放区域边界的所有边。每个y坐标值存放一个或者说几个边记录。当某条扫描线yi碰到多边形边界的新边时(以边线底端为准),则在ET表中相应的y坐标值处写入一个边记录。当同时有多条边进入时,则在ET表中按链表结构写入相应数目的多个记录,这些记录是按边线较低端点的x值增加的顺序排列。当没有新边加入时,表中对应的y坐标值处存储内容为空白。

注意:在ET表中:①与x轴平行的边不计入。②多边形的顶点分为两大类:一类是局部极值点,如下图中的P1、P3;另一类是非极值点,如下图中的P2、P4、P5。当扫描线与第一类顶点相遇时,应看作两个点;当扫描线与第二类顶点相遇时,应视为一个点。

⑵活动边表AET

   活动边表AET是一个只与当前扫描线相交的边记录链表。随着扫描线从一条到另一条的转换,AET表也应随之变动,利用         yi+1=yi+1,       xi+1=xi+1/m

   可以算出AET表中x域中的新值xi。凡是与这一条扫描线相交的任何新边都加到AET表中,而与之不相交的边又被从AET表中删除掉了。下图列出了图4.40中多边形在扫描线为4、5、6时的AET表。AET表中的记录顺序仍是按x增大排序的。

4.多边形区域填充算法过程

(1)根据给出的顶点坐标数据,按y递增顺序建立ET表

(2)根据AET指针,使之为空。

(3)使y=Ymin (Ymin为顶点坐标中最小y值)。

(4)反复做下述各步,直至y=Ymax(顶点坐标中y的最大值)或ET与AET为空:

   ①将ET表加入到AET中,并保持AET链中的记录按x值

     增大排序。

   ②对扫描线yi依次成对取出AET中xi值,并在每对xi

       之间填上所要求的颜色或图案。

   ③从AET表中删去yi=ymax的记录。

   ④对保留下来的AET中的每个记录,用xi+1/m代替xi

        ,并重新按x递增排序。

   ⑤使yi+1,以便进入下一轮循环。

①开始y=1,将ET表中y=1结点加入至AET表,同时保持AET链中记录按x增大排序

②由于上例中是6-6,是顶点,所以中间不填象素颜色。

③上例由于而Ymax=3和5,所以不必删去,当yi=3时,此时

就得将第一个结点即(3,6,-2)删去。

④对保留下来的AET中的每个记录,用xi+1/m代替xi,并重新按x递增排序。如上例变成(实际求出y=2时新的交点x坐标)

⑤使yi+1,以便进入下一轮循环。即y=2再进入以上循环

继续:①由y=2,ET表中是空,所以不需ET表加入AET表

      ②取x=4和x=6.5,将4-6.5之间填上象素颜色。

      ③由于y=2,不必删去结点。

      ④再改变xi的值为

      ⑤使yi =3,重复继续。继续:①由y=3,将ET表中y=3结点加入,即

      ②将2-7之间填上象素颜色。

      ③删去结点Ymax=3 结点。

④再改变xi的值为

      ⑤使yi =4,重复继续。

二、  边填充

    边填充算法的基本原理是:

(1)对多边形的每条边进行直线扫描转换,即对多边形边界经过的像素打上边标志;

(2)对多边形内部进行填充。填充时,对每条扫描线,依从左到右的顺序,逐个访问扫描线上的像素,用一个布尔量来标志当前点是在多边形内部还是外部(一开始设布尔量的值为假,当碰到设有边标志的点时,就把其值取反;对没有边标志的点,则其值保持不变)

(3)将其布尔量值为“真”的内部置为图形色,把其布尔量的值为“假”的外部点置为底色即可。

三、 种子填充

  1、种子填充基本思路

   首先假设在多边形区域的内部,至少有一个像素点(称为种子)是已知的,然后算法开始搜索与种子点相邻且位于区域内的其它像素。如果相邻点不在区域内,那么到达区域的边界;如果相邻点位于区域内,那么这一点就成为新的种子点,然后继续递归地搜索下去。

    区域的连通情况可以分为四连通和八连通两种

四连通区域:各像素在水平和垂直四个方向上是连通的八连通区域:各像素在水平、垂直以及四个对角线方向上都是连通的。

在种子填充算法中,如果允许从四个方向搜寻下一个像素点,则该算法称为四向算法;如果允许从八个方法搜寻下一个像素点,则该算法称为八向算法。一个八向算法可以用在四连通区域的填充上,也可用在八连通区域的填充上;而一个四向算法只能用于填充四连通区域。无论是四向算法还是八向算法,它们的填充算法基本思想是相同的。为简单起见,下面只讨论四向种子填充算法。

2.简单种子填充算法

    这是对内定义区域进行填充的算法,此算法所采用的基本方法是:将(x,y)点与边界值相比较,检测该点的像素是否处在区域之内;同时与新值相比,以确定该点是否已被访问过。这种测试的前提条件是:在初始状态下,区域内没有一个像素已被设置为新值;同时允许新值等于边界值。

  如果用堆栈的方法来实现简单种子填充算法,则算法的基本步骤如下:

(1)种子像素压入堆栈。

(2)当堆栈非空时,重复执行以下操作。

 ①从堆栈中推出一个像素,并将该像素置成所要的值;

 ②对于每个与当前像素邻接的四连通像素,进行上述两

  部份的测试;

 ③若所测试的像素在区域内且又未被填充过,则将该像

   素压入堆栈;

(递归)泛填充算法

内点表示的4连通区域

void FloodFill4(int x,int y,int oldColor,int newColor)

{  if (GetPixel(x,y) == oldColor)

  { PutPixel(x,y,newColor);

    FloodFill4(x+1,y,oldColor,newColor);

    FloodFill4(x,y+1,oldColor,newColor);

    FloodFill4(x-1,y,oldColor,newColor);

    FloodFill4(x,y-1,oldColor,newColor);   

}

}/*end of FloodFill4()    */

取(x,y)为种子点

特点:

(1) 有些象素会入栈多次,降低算法效率;栈结构占空间。

(2) 递归执行,算法简单,但效率不高,区域内每一象素都引起一次递归,进/出栈,费时费内存。

种子填充法

上述简单种子填充算法操作过程非常简单,却要进行深度的递归,这不仅要花费许多时间,降低了算法的效率,而且还要花费许多空间要构造堆栈结构。因此出现了改进的扫描线种子填充算法。

3.扫描线种子填充算法

    扫描线种子填充算法适用于边界定义的四连通区域。区域可凹可凸,还可以包括一个或多个孔。在边界定义区域外或与其邻接的区域中像素的值或颜色不同于填充区域或多边形的值或颜色。

    其基本思想是以种子所在扫描线进行从左到右填充直至边界为止

借助于堆栈,算法可分为以下五步实现:

初始化。将算法设置的堆栈置为空。将给定的种子(x,y)压入堆栈。

出栈。如果堆栈为空,算法结束。否则从包含种子像素的堆栈中取出栈顶元素(x,y)作为种子像素。

 区间填充。沿当前扫描线对种子像素的左右像素进行填充(像素值为new_color),直至遇到边界像素为止,从而填满包含种子像素的区间。

(4) 定范围。以xl和xr分别表示步骤(3)区间内最左和最右的两个像素。

(5) 进栈。在xl≤x≤xr中,检查与当前扫描线相邻的上下两条扫描线是否全为边界像素(boundary_color)或者前面已经填充过的像素(new_color),是则转到步骤(2),否则在xl≤x≤xr中把每一个区间的最右像素作为种子像素压入堆栈,再转到步骤(2)继续执行。

4.5  二维图形变换

一、图形变换基本概念

  1、定义

   即对原图形进行平移、旋转、缩小或放大等变换操作。

  在计算机图形显示或绘图输入过程中,往往需要对图形指定部分的形状、尺寸大小及显示方向进行修改,以达到改变整幅图形的目的,这就需要对图形进行平移、旋转、缩小或放大等变换操作。因此,图形变换是计算机绘图基本技术之一,利用它可以用一些很简单的图组合成相当复杂的图,可以把用户坐标系下的图形变换到设备坐标系下。利用图形变换还可以实现二维图形和三维图形之间转换,甚至还可以把静态图形变为动态图形,从而实现景物画面的动态显示,下面主要讨论二维图形变换。

2、图形变换分类

      图形变换有两种形式:

  视象变换:图形不动,而坐标系变动,即变换前与变换后的图形是针对不同的坐标而言的,也称之为坐标模式

  几何变换:另一种是坐标系不动,而图形改变,即变换前与变换后的坐标值是针对同一坐标系而言的,也称之为图形模式变换,

      实际应用中后种图形变换更具有实际意义,我们讨论的图形变换主要是属于后一种变换

二、二维图形几何变换的基本原理

1.几何变换

      在计算机绘图应用中,经常要实现从一个几何图形到另一个几何图形的变换。例如,将图沿某一方向平移一段距离;将图形旋转一定的角度;或将图形放大;反之把图形缩小等等。这些图形变换的效果虽然各不相同,本质上却都是依照一定的规则,将一个几何图形的点都变为另一个几何图形的确定的点,这种变换过程称为几何变换。

      几何变换的规则是可以用函数来表示的。由于一个二维图形可以分解成点、直线、曲线。把曲线离散化,它可以用一串短直线段来逼近;而直线段可以是一系列点的集合,因此点是构成图形的基本几何元素之一。我们先来讨论点的几何变换的函数表示。

二维平面图形的几何变换是指在不改变图形连线次序的情况下,对一个平面点集进行的线性变换。

      二维平面图形的轮廓线,不论是由直线段组成(多边形),还是由曲线段组成,都可以用它的轮廓线上顺序排列的平面点集来描述,例如长方形ABCD,是由四个角点A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4)顺序连接而成,为了使画出的图形是闭合的,首尾两点必须连接。二维平面图形变换的结果有两种,一是使图形产生位置的改变;另一种是使图形产生变形,例如把图形放大。

     对二维图形进行几何变形有五种基本变换形式,它们是:平移、旋转、比例、对称和错切。

2.基本几何变换的解析表示

(l)平移变换

    平面上一点P(x,y),如果在X轴方向的平移增量为tx,在Y轴方向平移增量为ty时,则平移后所得新点P‘

(x',y')坐标表达式为:                        

           x' = x + tx,  y' = y + ty     

我们把这一变换称为平移变换。

  如果对一图形的每个点都进行上述变换,即可得到该图形的平移变换。实际上,直线的平移变换,可以通过对其定义端点的平移变换来实现,对于其它类型的变换这种处理方法也是可行的。

  平移变换只改变图形的位置,不改变图形的大小和形状

(2)比例变换

  一个图形中的坐标点(x,y),若在X轴方向有一个比例系数Sx,在Y轴方向有一个比例系数Sy,则该图形的新坐标点(x',y')的表达式为

          x' = xSx     y' = ySy;  

 这一变换称为比例变换。

  比例变换不仅改变图形的位置,而且改变图形的大小

(3)旋转变换

  若图形中的坐标点(x,y)绕坐标原点逆时针旋转一个角度θ ,则该点变换后的新坐标(x‘,y’)与交换前的坐标(x,y)的关系为:

x' = xcosθ - ysinθ

y' = xsinθ + ycosθ

  旋转变换只能改变图形的方位,而图形的大小和形状不变,

(4)对称变换

如果经过变换后所得到的图形与变换前的图形关于X坐标轴是对称的,则称此变换为关于X轴的对称变换。经过这一变换后的坐标点(x',y')与变换前的对应坐标点(x,y)的关系为:

x' = x, y' = -y

    与此类似,若变换前后的图形关于Y轴对称,则称为关于Y轴的对称变换。这一变换前后点的坐标间的关系:

          x' = -x,y' = y

当图形对X轴和Y轴都进行对称变换时,即得相对于原点的中心对称变换。这一变换前后点的坐标之间的关系为:

                   x' = -x,y' = -y

对称变换只改变图形方位,不改变其形状和大小。

(5)错切变换

如果变换前坐标点(x,y)与变换后对应的新坐标点(x',y')的关系为:

               x' = x + cy,y' = y

我们称这一变换为沿X轴的错切变换,式中c为错切系数

与此类似,若变换前后对应点的坐标关系为:

               x' = x,    y' = y + bx

 则称此变换为沿Y轴的错切变换,其中b为错切系数。

错切变换不仅改变图形的形状,而且改变图形的方位,但图形中的平行关系不变,

一般把上述变换统称为基本的图形变换,绝大部分复杂的图形变换都可以通过这些基本交换的适当组合来实现。

3.二维图形几何变换的基本原理

我们知道,在计算机图形中,一个无论多么复杂的平面图形最终都可看成为由一系列直线段组成的,而每一条直线段均由两点所决定,那么,对平面图形进行几何变换,究竟是对图形的每一点变换,还是仅对组成这幅图形的直线段进行几何变换或者只需对直线段的端点进行几何变换呢?

4.6   二维图像裁剪

一、概述

1、定义

    为了描述图形对象,我们必须存储它的全部信息,但有时为了达到分区描述或重点描述某一部分的目的,往往将要描述的部分置于一个窗口之内,而将窗口之外的部分“剪掉”,这个处理过程叫做裁剪。

    裁剪实质上是从数据集合中抽取信息的过程,这个过程是通过一定计算方法实现的。裁剪就是将指定窗口作为图形边界,从一幅大的画面中抽取所需的具体信息,以显示某一局部画面或视图。

在实际应用中,经常会遇到一些大而复杂的图形,如集成电路布线图、建筑结构图、地形地貌图等。由于显示屏幕的尺寸及其分辨率限制,这样复杂的图形往往不能全部显示出来,即使将它们采用比例变换后全部显示在同一屏幕上,也只能表现一个大致轮廓,并且图形拥挤不清。因此对复杂图形,一般只能显示它的局部内容,我们在研究某复杂图形时,往往对某特定画面感兴趣,在这种情况下,我们将这一特定区域放大后显示出来,而把周围画面部分全部擦除,这样可清晰地观察其细节部分。

我们假定裁剪是针对用户坐标中窗口边界进行的,裁剪完成后,再把窗口内图形映射到视区。所以裁剪的目的是显示可见点和可见部分,删除视区外的部分。例如,下图(a)定义了一个矩形窗口A’B’C’D’,窗口内会有E'F'G'的一部分,而直线段E'G'、F'G'都有一部分在窗口外。然后将落在窗口内这部分图形传送到视图区内显示,如图(b)所示。此时,窗口外那部分被裁剪掉。

二、窗口区和视图区

用户域:在进行图形设计时,图形输出程序中的图形都

        是在用户坐标系中定义的。此坐标系拥有的区

        域在理论上是无限的,在使用时我们可以把它

        当作是一个有限的矩形区,即用户域。

窗口区:用户可以在用户域中指定任意区域输出到屏幕

上,这个指定区域称为窗口区,简称窗口(Window)

    如图所示的矩形 ABCD 就是我们定义的一个窗口。我们可用该矩形的左下角和右上角两点坐标来定义其大小和位置。因此,定义窗口的目的就是选取用户所定义的图形中需要观察的那一部分图形。

窗口区,用左下角和右上角来定义

视图区:简称视图(Viewport),是在屏幕上定义的一个小于或等于屏幕区域一个矩形块。同样也是用该矩形左下角和右上角两点坐标来定义大小和位置。视图区可用来显示某一窗口内图形。所以人们利用窗口来选择需要观察那一部分图形,而利用视图区来指定这一部分图形在屏幕上显示位置。下图表示窗口与视图关系。

4.7 反走样技术

一、反走样技术的定义和概述

    前面介绍的各种光栅化算法,如非水平亦非垂直的直线或多边形边界进行扫描转换时,或多或少会产生锯齿或阶梯状,如图4.86所示。由于直线和多边形边界的数学描述是连续的,而在光栅显示器中,像素点是占有一定面积是离散的。我们把这种用离散量表示连续量引起的失真称为走样(Aliasing)。走样是数字化发展的必然产物。所谓的反走样(Antialiasing)技术,就是减缓或者消除走样效果的技术。

(a) 原有分辨率                             (b) 分辨率放大1倍

光栅图形的走样除了会产生阶梯或者锯齿形状之外,还有可能会造成细节或纹理绘制失真,微小图形的丢失,体现在静态画面中将无法显示,在动态画面中则若隐若现,导致闪烁和跳跃。图4.87说明了这样一个例子,如果认为像素的属性由中心点来决定,那么中在图4.87第一行中,没有覆盖到像素中心点的细微形体就将丢失(用虚线表示);而在4.87第二行中,第一帧和第三帧的小月亮都无法显示,导致观察者看到了闪烁不稳定的动画。

图4.87 细微形体和动画的走样

目前有两类反走样的方法,第一类方法是通过提高采样频率(提高光栅分辨率)来显示图形的细节。例如图4.86中(a)和(b)两幅图形的对比,可以明显发现分辨率提高之后,较好的改善

了图形显示的走样现象,但是锯齿和阶梯状仍然存在。而且提高分辨率的方法将需要硬件和扫描运算时间的支持,实现起来是很困难的。基于此,可以将显示器看成比实际更加细腻的网格,在这种假想的高分辨率上对光栅进行计算,采用某种平均算法得到较低分辨率的像素的属性,并把结果转换到较低分辨率的显示器上进行显示。我们将这种方法称之为超采样(Supersampling)或者后置滤波(有些教材也称为过取样)。

        第二类反走样技术是根据图形在每个像素点上的覆盖程度来确定像素点的最终亮度,此时将像素点当成了一个有面积的平面区域而并非一个点,这种方法称之为区域采样(Area Sampling)或者前置滤波。

二、超采样

        可以将每个显示像素再细分成n×n个子像素,然后在子像素级进行光栅化,如果某一个像素区域内被激活的子像素有m个,那么该像素点的显示亮度可以近似认为是m/n2。这种方法直观简单,但是有时候需要更加精确的信息。对于一个像素所在的区域,更加精确的显示应该是要考虑到对应于该区域中心的“点”,也即是说,位于区域中心子像素的属性值(颜色、亮度等)应当比位于区域边侧的子像素在整个像素的显示属性中起着更重要的作用,这就涉及到加权平均的方法。图4.88展示了三种不同的加权方法,假设一个像素被划分为3×3的子像素区域,其中带圈的数字表示中心子像素所占的权重。

图4.88 用于加权平均的子像素划分

(1)简单区域采样

        前面介绍的各种方法从本质上来说都是把像素的属性值归结于中心的某一点的属

三、区域采样

性,但实际上像素并不是简单的一个点,而是一个有限的区域,屏幕上的直线段也不是数学意义上无宽度的理想直线,而是占有一个或者多个像素单位宽度的线条。如图4.89所示,直线段就好比是狭长的矩形,它和像素点之间有交集,求出相交区域的面积后,根据面积的大小来确定该像素的亮度值,这要求显示器各像素可以用多级灰度显示。

    如果求得的相交面积大,那么像素就更深一些,反之像素就应该更浅一些,这种做法将产生模糊的边界,因此可以减缓锯齿效果。图4.89中A像素点区域与直线相交面积较小(假定直线的斜率与直线的精确起点位置是已知的,可以利用求三角形面积的方法求得阴影面积),像素的灰度不如B像素点区域来得深。

对于B像素点区域面积的求法可以利用前面介绍的方法,将B区域继续细分成n×n的网格,算出阴影面积所占有的网格数目m,那么m/n就是其近似的覆盖度。

    简单区域采样存在两个缺陷:一是无论上述像素点区域和理想直线的距离如何,各区域相同的面积覆盖率将产生相同的灰度值,这仍然有可能产生锯齿效应;二是沿理想直线方向的相邻两个像素,有时候由于相交面积的差异会产生较大的灰度差,这实际上是不合理的。克服上述两个缺陷的方法是采用加权区域采样。

图4.89 简单区域采样的相交面积

(2)加权区域采样

        图4.89所示的简单区域采样是一种使用盒式滤波器进行前置滤波后再采样的方法。盒式滤波器的工作原理如图4.90-(a)所示。图中的正方体代表盒式滤波器,底面为一个像素区域,它是一个二维加权函数w,函数w的定义域为整个平面,在与直线段有交集的每一像素区域上取值为1,其它像素区域则取值为0。直线段经过的某个像素区域,该像素最终显示的灰度值可以通过该区域与直线段相交部分对函数w求积分得到。实质上就是求该相交区域各边垂直向上切割盒式立方体所得子体的体积,由于w取值为1,故积分值就等于相交区域的面积。

九、作业

课后习题

十、本章小结

在本章中,介绍了直线和曲线的生成算法并对其进行了详细的讲解。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第5章  三维图形生成和变换

一、教学目标

        通过对本章的学习,要求熟悉自由曲面的生成和三维图形变换。

二、教学要求

1、掌握自由曲面的生成;

2、掌握三维图形的变换和裁剪。

三、教学内容提要

5.1 三维图形的概念

5.2 自由曲面的生成

5.3 三维图形变换

5.4 三维图形剪裁和消隐技术 

四、教学重点、难点及解决方法

重点是掌握自由曲面的生成。

五、课时安排

    4学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

5.1   三维图形的概念

    在计算机图形学中最重要的部分还是三维图形生成与变换,不仅人们对它感兴趣,而且在实际应用中更加广泛。三维图形生成比起二维图形生成要复杂得多,其根本原因在于我们的图形输入设备和输出设备基本上都是二维的,用这些二维的图形设备去表现空间三维实体自然会增加许多复杂性优需要运用许多新的方法去处理三维图形。

正是利用这些曲线网格来近似地表示自由曲面,因此,在产生一张曲面时,我们可以利用一系列的纵横交错且相互平行的样条曲线来构造曲面,如下图所示。   

   我们如何确定这张曲面上任意一点位置呢?很明显,如果这点恰好落在某一条网格线上,如图A点,那么就可以根据这条网格线函数表示来计算这一点位置(坐标);若这一点不在任何网格线上,如图中的B点,那么就无法计算出该点精确位置,只能用离该点最近一条网格线上的点近似地表示。

这使得本来精度不很高近似曲面在这一点精度更加降低,所以用这种方法来产生曲面只适合于一部分精度要求不太高场合,我们可以把平面里自由曲线生成方法加以推广,借助于曲面的解析表达式来处理有关曲面问题。

   

   曲面的种类繁多,为便于讨论,将曲面分为两类,(1)规则曲面:如柱、锥、椭球、环、双曲面、抛物面等,它可以用参数方程解析地描述。

5.1 三维图形的概念

二、空间曲面的参数表示

在计算机图形学研究中,三维图形概念有几种:

1、是采用线框图构成的三维图形,这是最基本、最简单的,它实际上是在二维屏幕上展示的具有三维视觉效果的图形;

2、三维实体图形,它是采用各种颜色图案、纹理等填充过的图形,在视觉上也具有三维效果;

3、三维立体图形,它借助于光照、浓淡和明暗技术,产生了真正的三维立体效果。

    这些三维图形都是我们在计算机图形学中要研究和予以实现的内容。

5.2 自由曲面的生成

孔斯曲面

Coons曲面的拼合:设有两块相邻的曲面片P 与Q, 两块Coons 曲面片的拼接分为沿u 方向的拼接和沿v 方向的拼接。以沿u 方向的拼接为例  :

       1 .若要满足G 0 连续,则要求P 与Q 有共同的边界。

       2 .若要满足G 1 连续,则要求P 与Q 在共同的边界上有相同的切平面,即                k 为常数。

孔斯曲面分为第一类和第二类两种。

贝塞尔曲面

1.Bezier 曲面的定义

       在空间给定(n+1)×(m+1)个点Pij(i=0,1…n; j=0,1…m),则可逼近生成一个n×m次的Bezier曲面片,其定义为:

       称Pij为P(u,v)的控制顶点;把由两组多边形Pi0Pi1…Pim (i=0,1,…n)和P0jP1j…Pnj (j=0,1,…m)组成的网格称为P(u,v)的控制多面体(控制网格),记为{Pij}。同样,P(u,v)是对{Pij}的逼近, {Pij}是P(u,v)的大致形状的勾画。

       由16个控制顶点所构成的控制网格可绘制一个双三次(3×3次)Bezier曲面片,其矩阵表示为:

2.Bezier曲面的性质

Bezier曲面的许多性质与Bezier曲线的许多性质完全一致。

1)端点性质

2)边界线的位置

3)凸包性 

3. 双三次Bezier曲面(m=n=3)

 

 

 

 

 

 

 

 

 

 

 

 


B样条曲面

B样条曲面的定义:在空间给定(n+1)×(m+1) 个点Pij(i=0,1…n; j=0,1…m) ,则可逼近生成一个n×m 次的B 样条曲面片,其定义为: 相比于Bezier 曲面,B 样条曲面要更加逼近于控制网格。由16个控制顶点所构成的控制网格可绘制一个双三次(3×3次)B样条曲面片。

 

 

 

 


控制顶点、控制网格(特征网格)、B样条基函数。B样条曲面具有与B样条曲线相同的局部支柱性、凸包性、连续性、几何变换不变性等性质。

5.3 三维图形变换

三维图形的几何变换

   

1.三维图形平移变换

三维基本几何变换都是相对于坐标原点和坐标轴进行的几何变换

假设三维形体变换前一点为p(x,y,z),变换后为p'(x',y',z')。

 

2. 比例变换

比例变换的变换矩阵如下:

 

3.旋转变换

1)绕X的旋转

 

2)绕Y的旋转

 

3)绕Z的旋转

 

4.反射变换

关于xoy平面进行对称变换的矩阵计算形式为

 

关于yoz平面的对称变换为

 

关于zox平面的对称变换为:

 

5.4 三维图形剪裁和消隐技术

三维图形的投影

        将三维空间中的物体变为二维图形表示的过程称为投影变换。

        投影变换的分类: 投影的要素包括投影对象、投影中心、投影平面、投影线和投影。要作投影变换的物体称为投影对象;在三维空间中,选择一个点,记这个点为投影中心;不经过这个点再定义一个平面,记这个平面为投影平面;从投影中心向投影平面引任意多条射线,记这些射线为投影线;穿过物体的投影线与投影面相交,在投影面上形成物体的像,这个像记为三维物体在二维投影面上的投影。

       投影变换可分为两大类:透视投影和平行投影。它们的本质区别在于:透视投影的投影中心到投影面之间的距离是有限的,而平行投影的投影中心到投影面之间的距离是无限的。

1.  平行投影

       平行投影的投影中心与投影平面之间的距离为无穷远;投影线之间相互平行;平行线的平行投影仍是平行线。

       按照投影方向与投影平面的交角不同,平行投影分为两类:正平行投影和斜平行投影。 

1)正平行投影

正平行投影的投影方向垂直于投影平面。

       按照投影平面与坐标轴的交角不同,正平行投影又可分为两类:正投影与正轴测。

       当投影平面与某一坐标轴垂直时,得到的投影为正投影;否则,得到的投影为正轴测。

(1)正投影

       正投影也称为三视图。按照投影平面是否与Y轴、X轴、Z轴垂直,正投影分为主视图、侧视图和俯视图三种,此时投影方向分别与这个坐标轴的方向一致。

(2)正轴测

       根据变形系数之间的关系,正轴测投影可分为正等测投影、正二测投影、正三测投影 。

2)斜平行投影

斜平行投影的投影方向不垂直于投影平面,而是与投影面成α夹角。在工程制图中,经常选择一些兼有美观及绘图方便的α 角来作斜平行投影,常用的两种是斜等测和斜二测。

2. 透视投影

1)透视投影的术语和分类

       透视投影的投影中心与投影平面之间的距离为有限的。投影线(视线)从投影中心(视点)出发,投影线是不平行的。对于透视投影,一束平行于投影平面的平行线的投影仍可保持平行,而不平行于投影平面的平行线的投影会收敛到一个点,这个点称为灭点(Vanishing Point)。平行于坐标轴的平行线在投影平面上形成的灭点称为主灭点。

       根据主灭点的个数,透视投影可分为一点透视、二点透视和三点透视。

       (1)一点透视:有一个主灭点,即投影平面与一个坐标轴正交,与另外两个坐标轴平行。

       (2)二点透视:有两个主灭点,即投影平面与两个坐标轴相交,与另一个坐标轴平行。

       (3)三点透视:有三个主灭点,即投影面与三个坐标轴都相交。

2)透视投影的表示方法

       假设投影中心在坐标原点,投影平面与Z轴垂直,在z=d的位置上。点P(x,y,z)在投影平面上的投影点为:P’(x’,y’,d),可构造透视投影的变换矩阵T。

6.3 三维裁减

把二维线段的Cohen-Sutherland裁剪算法稍加改进,就能推广到三维平行投影的裁剪算法中。

       对空间任意一点P(x,y,z)按其所处位置赋予6位二进制编码。

              (1)两个端点的编码全为“0000”,直接保留;

              (2)对两端点的编码进行逻辑与运算,结果不为零,可直接舍弃;

              (3)否则,计算出线段与窗口表面的交点,并将线段分段后继续处理,直到余下的线段符合前两种简单情况为止。

九、作业

    课后习题

十、本章小结

在本章中,介绍了自由曲面的生成和三维图形的变换。

 

第6章  真实感图形生成技术

一、教学目标

        通过对本章的学习,要求熟悉各种光照模型和明暗处理方法以及阴影生成方法。

二、教学要求

1、掌握简单光照模型;

2、掌握明暗处理方法。

三、教学内容提要

6.l 概述 

6.2 简单光照模型 

6.3 明暗处理方法 

6.4 阴影生成方法 

6.5 整体光照模型 

6.6 纹理处理方法          

四、教学重点、难点及解决方法

重点是掌握简单光照模型的各种方法。

五、课时安排

   4学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

6.1 概述

一、真实感图形定义

    真实感图形的显示是使用计算机产生同照片同样的黑白图像或彩色图像。

计算机图形学研究目的最终是用计算机生成图形,具有真实感使物体和自然界中物体 相似,包括颜色、纹理、明暗等。

二、真实感图形应用

       1、产品外形设计

       2、飞行驾驶模拟训练

       3、动画制作、城市规划、医学气象等

三、真实感图形特点

       1、反映物体表面颜色和亮度

       2、表现物体质感

       3、能通过光照下物体的阴影,改善场景的深度感和层次感

       4、能模拟透明物体的透明效果和镜面物体的镜像效果

四、影响真实感图形因素

       1、物体本身形状

       2、物体表面特征:材质、感光度,纹理等

       3、照射物体光源

       4、物体与光源相对位置

       5、物体周围环境

6.2 简单光照模型

       一个物体表面为什么会出现明暗、颜色等,主要由于物体发光达到人眼的结果。

       光照在物体表面上有三种情况:

       1、反射光:光通过物体表面被反射;

       2、透视光:对于透明物体光穿过该物体而从另端射出;

       3、光被物体吸收而变成热。

      我们视觉效果是反射光和透视光。

下面讨论不包含透射光的简单光照模型。

假设物体不透明,那么物体表面呈现的颜色仅由其反射光决定,通常人们把反射光考虑成三个分量的组合,这三个分量分别是:

              环境反射

              漫反射

              镜面反射

6.2.1 环境反射光

       环境反射光是由于邻近物体所造成的光多次反射所产生的,其光亮度可表示为:

                               Ie=IaKa

式中     Ie----物体对环境光反射亮度;

            Ia----环境光亮度;

            Ka----物体表面对环境光反射系数(0≤Ka≤l)。

6.2.2 漫反射光

       漫反射光是由特定光源在物体表面反射光中那些向空间各方向均匀反射出去的光。设物体表面在P点法线为N,从P点指向光源的向量为L,两者夹角为θ。

于是,点P处漫反射光的强度为:

             Id =Ip kd cosθ

式中  Id ——表面漫反射光的亮度;

          Ip ——入射光的光亮度;

          kd——漫射系数  0≤Kd ≤l;

         θ——入射光线与法线间夹角,0≤θ≤π/2。

当物体表面垂直于入射光方向时(N、L方向一致)看上去最亮。当θ越来越大,接近900时,则看上去越来越暗。

6.2.3 镜面反射光

      上面讨论漫反射是一个粗糙无光泽表面,如粉笔。如果一个点光源照射到一个抛光的金属球时,在球上形成一块特别亮的区域,呈现所谓“高光”。它是光源在金属球面上产生的镜面反射光。

     对于一个理想的镜面,入射到表面上的光严格地遵守光的反射定律朝一个方向——镜面反射方向反射出去;对于一般光滑表面,由于表面具有一定粗糙度,其表面实际上是由许多朝向不同微小表面组成,其镜面反射光散布在反射方向周围 。 

B.T.Phong1975年提出来用余弦函数的幂次来模拟镜面

反射光的空间分布,可表示为:

                          Is=IpKs cosnφ

Is ——观察者接收到镜面反射光亮度;

Ip ——入射光的亮度;

φ ——镜面反射方向和视线方向的夹角;

 n ——镜面反射光的会聚系数

         (与物体表面光滑度有关)一般取1~2000;

Ks——镜面反射系统(与材料性质和入射光波长有关)。

表面越光滑,其镜面反射光会聚程度较高,n值较大。与漫反射不同,镜面反射光与物体颜色无关。

6.2.4 Phong光照模型

综上所述,从视点观察到物体表面上任一点亮度I应为环境光、漫反射光、镜面反射光的总和,即:

            I=Ie+Id+Is

     即:

            I=Ie Ka+Ip (Kd cosθ+K s cosnφ)

令L为入射光方向单位矢量,N为表面法线单位矢量,R为反射光方向单位矢量,V为视线方向单位矢量,如图,则余弦函数可用矢量点积来表示,即

       (L?N) =cosθ      (R?V)=cos φ

   I=Ia Ka+Ip [Kd (L?N)+K s (R?V) n]

对于彩色显示,可把光源分成红、绿、蓝(R?G?B)三基色光,对每一基色分别用相应算式来计算,

即    

            Ir =Ia Kar +Ip [Kdr (L?N)+Ks (R?V) n]

            Ig =Ia Kag+Ip [Kdg(L?N)+Ks (R?V) n]

            Ib =Ia Kab+Ip [Kdb (L?N)+Ks (R?V) n]

上式中镜面反射光一项对三个式子都是一样。

6.3.1 概述

       明暗处理就是使物体表面光强度强弱表现。

      上一节介绍了简单照明模型,只要知道物体表面某一点的法线就可以算出该点反射光强度。

       对于表面是弯曲的形体,计算出曲面每一点法线,然后再按照模型来计算每一点明暗程度,计算工作量太大。

6.3 明暗处理方法

因此,用平面多面体来逼近弯曲表面形体。对于平面多边形来说,由于它的每个表面都是平面,而在同一平面上,任一点法线都是一样,因此,只要用一个固定的强度值来表示面上所有点(即整个面)的明暗程度就可以了,这样使得计算工作大为简化。

6.3.1 概述

        为了不使光强度急剧变化,我们用下面两种方法。

1、哥罗德(Gouraud)强度插值法

2、冯(Phong)法向插值法

6.3.2 哥罗德(Gouraud)强度插值法

1、计算多边形每个顶点法向量

      求出与该顶点相邻的多面体各面的法向平均值,作为该顶点法向。如图P点法向量为:      

             Np=(N1+N2+N3)/3              

其中N1、N2、N3分别是以 P为公共顶点的三个面的外法向;Np是 P点外法向。

2、计算各个顶点的光亮度I1,I2,…Im

6.3.2 哥罗德(Gouraud)强度插值法

3、用插值方法计算出多边形上任一点的光强度,如图:

4、用扫描线方法沿水平方向插值来计算出多边形内部各点的光亮度值,例如点R的光亮

度可以用下式计算:利用哥罗德法思路简明,计算方便,但对于镜面反射处理不理想,我们可用下面方法处理。

6.3.3 冯(Phong)法向插值法

        我们上面介绍方法是以光强度进行插值,但对于镜面反射光亮度往往不理想,而Phong法是以法向进行插值,其原理和上面一样,所不同的是在上面插值公式中用N代替I即可,N是一个矢量,I是标量,所以法向插值计算量大一些,但产生效果好,比较真实,能显示出镜面特亮区域。

6.4 阴影生成方法

6.4.1 概述

1、定义:阴影是指景物中没有被光源直接照射的暗区。

      在场景中阴影显示出来,可增强图形立体感,使得计算机生成画面更具有真实感。

2、阴影分类

(1)自身阴影

(2)投射阴影

投射阴影又分为:本影和半影

1、本影

     物体影子中间全黑的轮廓分明部分是本影。本影是没有被光源照射部分。

2、半影

     本影周围半明半暗部分是半影,半影是一部分被光源照射,一部分未被光源照射。本影计算复杂,一般只考虑半影计算。

6.4.2 自身阴影生成方法

     生成过程如下:

(l)首先将视点置于光源位置,以光线照射方向作为观察方向,对在光照模型下的物体实施消隐算法,判别出在光照模型下的物体的“隐藏面”并在数据文件中加以标识;

(2)然后按实际的视点位置和观察方向,对物体实施消隐算法,生成真正消隐后的立体图形;

(3)检索数据文件,核查消隐后生成的图形中,是否包含有在光照模型下的“隐藏面”如有,则加以阴影符号标识这些面。

6.4.3 投射阴影生成方法

1、影域多面体方法

2、Z缓冲器方法

3、光线跟踪法

6.4.3 投射阴影生成方法

1、影域多面体方法

基本思想:先求出景物空间中光线被该物体轮廓多边形所遮挡的区域,即影域多面体。然后 再判断其后物体是否在该影域内,若在影域内为阴影。这个算法与扫描线算法相结合就容易实现。

6.4.3 投射阴影生成方法

2、Z缓冲器方法

        由于阴影是光线照射不到面观察者却可见到的区域,换句话说,阴影是相对于光源不可见而观察点却可见到的区域。所以在画面中生成阴影的过程基本上相当于二次消隐,一次是对光源消隐,另一次是对视点消隐,Z缓冲器算法就是基于这个原理。

该法的优点:

能处理任意复杂的景物,可以较方便地在光滑曲面上生成阴影,且计算量小,程序简单;

缺点:阴影缓冲器的存储耗费较大。

6.4.3 投射阴影生成方法

3、光线跟踪法

        要判断某点是否在阴影内,从该点的光源发一条射线,若与物体不相交,则说明不在阴影内,若与物体相交,说明在阴影内。

这种方法比较易于实现,且可以生成十分真实的阴影,但计算工作量较大。

6.5 整体光照模型和光线跟踪算法

前面介绍了简单光照模型,所考虑条件是对于不透明物体,若是透明物体,简单光照模型公式就不适合了。

    我们先考虑透明性物体简单模型。

6.5.1 透明性简单模型

条件:1、透明体不应折射

      2、无漫透视,光通过透明体时不产生模糊变形

6.5     整体光照模型

6.5.1 透明性简单模型

如图,A是透明体,Pt是视线穿过透明体与背后物体B的交点。此时由P点光到达

观察者光强度为:

              I=(l-t)Ic十tIt    0≤t≤1

Ic为 P点光亮度,t为透明系数,t=0时对应不透明面.t=1为透明面,Ic和It可用

前面介绍的Phong模型计算。

这种方法无法模拟光通过透明介质时产生折射现象,须用下面介绍的整体光照明模型。

6.5.2 整体光照模型

       景物表面某点P向观察点辐射的光亮度由三部分组成,依下式求出。

                  I=I1十Is Ks +It Kt

式中,

      I1——光源直接照射引起的反射光亮度,

                  按照 Phong模型来计算

      Is——在镜面反射方向上其它物体向点P轴射的光亮度;

      It——在折射方向上其它物体向点P辐射的光亮度;

      Ks——景物表面的反射系数;

      Kt——景物的透射系数。

Is、It的确定要求助于光线跟踪算法。

6.5.3 光线跟踪算法

如何求象素点P亮度,由三部分组成:

1、光源直接照射及环境光所产生局部光亮度。

2、反射方向②来的光对 A的作用。

3、透射方向③来的光对A点的作用。

A点光强度为:

     IA=I1A+IsAKsA+ItAKtA

为了求IsA和ItA ,必须求IB和IC:

                     IB= I1B+IsBKsB+ItBKtB

                     IC= I1C+IsCKsC+ItCKtC

IsC 可由连续跟踪内反射光线6求得,ItC=背景光。

最后,用 IsA= IB;ItC=IC代入求 A点光强度公式,即可求得A点光强度。

跟踪光线结束条件

跟踪光线未碰到任何物体;

跟踪光线碰到了场景背景;

跟踪光线在经过许多次反射和折射以后,光线对于视点的光强贡献小于某个设定值;

跟踪光线反射或折射次数(即跟踪深度)大于某个设定值;

6.5.4  辐射度算法

    辐射度算法的原理是任何击中一个表面的光都被反射回场景之中,是任何光线,不仅仅是直接从光源射出的光线,因此辐射度算法比上述光线跟踪算法要复杂些,同时它的效果也要好得多,可以生成高真实感的光照效果图(如下彩图)。

基本原则

辐射度算法的基本原则就是摒除对物体和光源的划分,认为所有的东西都是潜在的光源,任何可见的东西不是辐射光线,就是反射光线,或者两者都是,只要它是一个光的来源,它即为一个光源。

总之,一切周围能看到的东西都是光源,这样,当我们考虑场景中的某一部分应接受多少光强时,就必须把所有的可见物体发出的光线都累加进去。

九、作业

    课后习题

十、本章小结

在本章中,介绍了各种简单光照模型和明暗处理方法。

 

 

 

 

 

 

 

 

 

 

 

 

第8章  计算机动画技术

一、教学目标

        通过对本章的学习,要求熟悉计算机动画的概述和分类及原理。

二、教学要求

1、了解动画概述;

2、掌握计算机动画分类和原理。

三、教学内容提要

8.1计算机动画概述

8.2计算机动画的分类和原理

四、教学重点、难点及解决方法

重点是掌握计算机动画的分类和原理。

五、课时安排

    2学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

      8.1   计算机动画概述   

动画的定义:

就是一组连续的图像序列。当按一定的速率显示的时候,能传递一种运动的感觉。

动画的技术要求:

每一幅图像或者每一动画帧,都必须有机地、无缝地和其他的图像融合在一起,这样才能随着时间的变化,产生平滑的、连续的运动。

一、计算机动画历史与现状

 

    计算机动画技术可以看作计算机图形学的综合应用。

包括图形生成(二维、三维)尤其是真实感图形生成技术。

计算机动画最初产生和发展与传统动画制作有着密切关系。

 

(1)1963年,Bell实验室研究人员用计算机制作出了世界上第一部动画片。

计算机图形学与计算机动画不同,计算机动画属于四维空间(三维加上时间),而计算机图形学只限于三维空间。

(2)60年代期间,美国一些公司、研究机构和大学开发二

维动画系统,用计算机实现中间画面制作(关键帧)和自动

着色。

 

(3)在70年代初期,开始研制三维辅助动画系统。

 

(4)70年代期间至80年代初,随着计算机图形学理论发展,尤其三维物体造型的发展,人们开始研究计算机三维造型动画系统。

 

(5)80年代,研究动画生成的关键参数插值法、运动学算法和动力学算法等。

 

(6)80年代末进入90年代后,多种不同动画软件出现,如3DS,Animator等。

目前,随着计算机硬件性能价格比的快速提高和OpenGL、DirectX等图形标准的广泛应用,商用动画软件公司纷纷推出了动画软件的微机版本。如原来运行于工作站上价格昂贵的动画软件Alias|Wavefront、maya和softimage现在都已有了PC版本。

    随着PC 图形加速卡的性价比迅速提高,使得在基于PC的微机工作站上制作动画也能与在SGI工作站上一样得心应手。

    当前,商业动画软件的功能越来越强,已经能够轻松制作出许多足以以假乱真的影视动画特技,这在《侏罗纪公园》、《终结者》等电影中都得到了淋漓尽致的展现,观众已很难区分哪些是计算机生成的动画,哪些是模型制作的效果。

传统动画片生产过程      

1)剧本

    不带画面的整个故事的详细叙述,反映动画片大致概貌与镜头的剧本,如同故事片一样。

 

  2)设计稿    

    对动画片中出现多种角色选型、动作、色彩、气氛等设计,实际上完成手稿图工作。

 

  3)声音节拍   

    动作必须与对话声音相配合、协调一致。

 

  4)关键帧   

     动画处理中关键帧(也称原画)由经验丰富的动画设计者完成,通常由一个设计者完成某个角色。

二、传统动画与计算机动画

5)中间画   

     中间画是那些位于两个关键帧之间的画面,中间画一般由辅助动画设计者及其助手完成。

 

 

  6)测试   

    

  7)描线上墨    

    

8)上色   

     给多幅画面在透明片上涂上颜料

 

  9)检查   

     动画设计者在拍摄之前再次检查各镜头动作质量

 

 10)拍摄   

     这一工序在动画摄制机上完成。动画摄影师把动画系统通过拍摄依次记录在胶片上

 

 11)后期制作   

     编辑、剪接、对白、配音、剪带等后期制作工序是必不可少的

 

    

传统动画采用手工方法制作,精度差且效率低;

 

    计算机动画的实现,省去了繁杂的手工工序,使动画片的生产效率提高了许多倍。

 

    计算机动画立体感强,可以改变视角、视距、视野及景深,具有明暗光线变化和阴影,使物体产生不同灰度和颜色渐变以及逼真的光照,可以产生纹理质感,这些特点与效果是传统手工动画难以实现或不可能实现的。

三、计算机动画研究内容

 

 

  1、关键帧动画

  2、基于机械学的动画和工业过程动画仿真

  3、运动和路径的控制

  4、动画语言与语义

  5、基于智能的动画,机械人与动画

  6、动画系统用户界面

  7、科学可视化计算机动画表现

  8、特技效果,合成演员

  9、语言、音响合成,录制技术

8.2 计算机动画分类和原理

一、计算机动画的分类

1、二维动画(卡通动画)

    传统卡通动画先画出两个关键帧,然后在中间插入一系列画,计算机二维动画则借助计算机来完成中间画的自动生成。

一、计算机动画分类

2、三维动画

    如果说二维动画对应于传统卡通动画,那么三维动画

画则对应于木偶动画。

    木偶动画首先制作木偶、道具和场景,三维动画首先

建立角色、实物和场景三维数据。

    三维动画具有很强的真实感和立体感。

一、计算机动画分类

按照动画物体自身物理属性不同,三维动画也可分为:

1、刚体动画

2、软体动画

3、关节动画

4、粒子动画

二、计算机动画原理

1、关键帧动画

   通过一组关键帧或关键参数值而得到中间动画帧序列:

  (1)形状插值:从关键帧本身而得到中间动画帧;

  (2)关键参数插值:通过插值物体模型关键参数数值来

获得中间动画。

1)运动学算法:由运动学方程确定物体运动轨迹和速率。

2)动力学算法:由力学方程确定物体运动形式。

3)反向运动学算法:已知物体末端位置和状态,反求运动方程以确定运动形式。

4)反向动力学算法:已知物体末端位置和状态,反求动力学方程以确定运动形式。

5)随机运动算法:在某些场合下加进运动控制随机因素。

2、算法动画

  算法动画由算法实现,一般适用于三维情形。

算法动画是指按照物理或化学等自然规律对运动进行控制的方法、针对不同类型物体的运动方式,从简单的质点运动到复杂的涡流、有机分子碰撞等,一般按物体运动的复杂程度分为质点、刚体、可变软组织、链接物、变化物等类型、也可以按解析式定义物体。

    用算法控制运动的过程包括:给定环境描述、环境中的物体造型、运动规律、计算机通过算法生成动画帧。

    目前针对刚体和链接物已开发了不少较成熟算法,对软组织和群体运动控制方面也做了不少工作。

2、算法动画

一、旋转的四元数表示

计算机动画中常需对物体或角色进行旋转操作。

三维空间中的旋转可用:

    1、旋转矩阵

    2、欧拉角

    3、四元数(Quaternions)

等数学形式来表示 。

8.3 计算机动画的关键技术

一、旋转的四元数表示

四元数最早由Sir William Rowan Hamilton于1843年提出,从复数推广到四维空间而得,到1985年,Shoemake又把四元数引入到了计算机图形学中来。

四元数旋转表示具有这样的优点:

一、计算简单;

二、朝向插值较稳定而平滑;

三、几何意义明了。

此外,矢量代数,实数、复数和矢量都可以看作是四元数的特例,它们可以在一起统一进行运算。

一个四元数可以表示为:q = a + xi + yj + zk,

其中i、j、k的关系如下:

    i2 = j2 = k2 = -1

    i * j = k = -j * i

    j * k = i = -k * j

    k * i = j = -i * k

一、旋转的四元数表示

也可以简化表示为:q=(W,V )= W+V,其中W = a,V = xi + yj + zk(实部W是一个标量,虚部V代表向量,i, j, k 称为虚轴),尽管V称为向量,但不要将其看成是典型的3D向量,它是4D空间的“抽象”向量。

假设有两个四元数:

q1 = a1 + x1 i + y1 j + z1 k

q2 = a2 + x2 i + y2 j + z2 k

四元数的加法定义如下:

q1 + q2 =(W1,V1)+(W2,V2)

        =(W1+ W2)+(V1+ V2)

        = (a1+a2) + (x1+x2)i + (y1+y2)j

          +(z1+z2)k

四元数的乘法定义如下:

q1 * q2  = (W1,V1)*(W2,V2)

         = W1*W2 - V1.V2 + V1XV2 + W1*V2 + W2*V1

         =  (a1*a2 - x1*x2 - y1*y2 - z1*z2) 

           +  (a1*x2 + x1*a2 + y1*z2 - z1*y2) i 

           +(a1*y2 - x1*z2 + y1*a2 + z1*x2) j 

           +  (a1*z2 + x1*y2 - y1*x2 + z1*a2) k

其中V1.V2表示向量内积,V1XV2表示向量外积。

 

九、作业

课后习题

十、本章小结

在本章中,介绍了delphi的工具栏和状态栏的使用与设计。

 

第8章  Delphi图形及多媒体应用

一、教学目标

        通过对本章的学习,要求熟悉delphi的画布对象、显示图形组件、绘图区域组件、常用图像类、图像组件,并要求掌握与delphi的常用组件结合相应用。

二、教学要求

1、掌握delphi的图形处理;

2、掌握与delphi的常用组件使用的结合;

3、掌握delphi的图像处理。

三、教学内容提要

8.1 绘图组件 

8.2 图形列表组件 

8.3 图形栅格组件 

8.4 图形日历组件 

8.5 多媒体组件              

四、教学重点、难点及解决方法

重点是了解delphi的图形、图像组件创建和使用,并熟悉与delphi的常用组件的结合使用。

五、课时安排

    4学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

    Delphi提供了一些图形类组件,最常用的有绘图组件、图形列表组件、图形栅格组件、图表组件、图形日历组件、多媒体组件等。

8.1  绘 图 组 件
     8.1.1  Shape组件

        Shape (几何图形)组件可以显示一些常见的几何图形,如圆、矩形、正方形和椭圆等。

    1.主要属性

        Brush 属性:几何图形内的填充图案和颜色等特性。

        Shape属性:有stCircle(圆)、stEllipse(椭圆)、stRectangle(矩形)、stRoundrect(圆角矩形)、stRoundsquare(圆角正方形)和stsquare(正方形)6种取值,表示6种不同的几何图形。

     8.1.2  PaintBox组件

        PaintBox (画板)组件可让用户使用绘图语句在一块区域中作图。画板组件位于“System” 组件页上,主要使用Canvas (画布)属性来进行绘图,它是类TPaintBox 的对象。

     8.1.3  画布对象

         所有能够绘制图形的组件或区域都有一个Canvas 成员,它是类TCanvas 的对象。

        ClipRect属性:确定作图区域的范围;

        Brush属性:图形内的填充图案和颜色等特性;

        Pen属性:几何图形的画笔特性如颜色、线型和线宽等。

    1.画布对象的图形基础

        Canvas (画布)对象在Delphi 的绘图中起着关键的作用,它可以作为窗体、图像、图形组件或打印对象的数据成员。

(1)颜色。

         要指定绘图的颜色,可以在对象查看器中预定义,或在程序中给组件的Color 成员赋值,也可以利用有些组件如ColorDialog ,ColorGrid 来指定一个颜色,然后将其中的Color 属性值赋给组件的Color 成员,还可使用ColorToRGB (Color:Tcolor )函数给Color 成员配置颜色。

(2)画点。
(3)画笔。

         画笔成员Pen 是Tpen 的对象,用来控制几何图形的绘制方式,与Shape 组件的Pen 属性相同,有4 个子属性:Color (颜色)、Mode (模式)、Style (线形)和Width (线宽)。

(4)刷子。

       Canvas 对象中的Brush (刷子)成员确定填充某个闭合图形的方式。

(5)填充。

         填充封闭图形有两种方法,第一种方法是绘制图形前先给画布对象的Brush 属性赋值,通过其Color 子属性指定填充颜色,通过其Style 子属性指定填充方式。

     2.绘制简单图形

 (1 )直线。

        Canvas 对象画线调用MoveTo 和LineTo 两个方法。

(2)矩形。

        Canvas 对象画线调用Rectangle 方法。

(3)椭圆。

        Canvas 对象画椭圆调用Ellipse 方法。

(4)圆角矩形。

        Canvas 对象画圆角矩形调用RoundRect 方法。

(5)多边形。

        Canvas 对象画多边形调用Polygon 方法。

(6)折线。

        Canvas 对象画折线调用Polyline 方法。

(7)字符串显示。

         在作图区域中有时要用到字符串。

     8.1.4  Image组件

        Image 组件可以显示各种以文件形式存储的图形。

         要在Image 组件中装入图像,有两种方式:第一种方式是在设计时用Picture 属性静态装载图像;第二种方法是在运行时用LoadFromFile 函数动态装载图像。

     8.1.5  绘制图元文件

         标量图和矢量图的概念。位图文件记录了位图中每个像素的状态,称为标量图。标量图的不足之处在于当标量图缩放时,图形的形状将会发生变化。

    1.TMetafile类

        TMetafile 类用于处理图元文件自身,带有装载图元文件和保存图元文件的对象方法,以及确定图元文件主要特性的属性。

         TMetafile类的一个重要属性是Boolean型的Enhanced属性,当属性值为True时,文件格式为扩展图元文件,扩展名为.EMF;当属性值为False时,文件格式为Windows图元文件,扩展名为.WMF。

    2.TMetafileCanvas类

        TMetafileCanvas 类是TCanvas 类的派生类,是用于绘制图元文件的画布类。

        为了生成图元文件,首先创建一个TMetafile对象,然后使用TMetafileCanvas类的对象的构造器CreateWithComment与TMetafile类的对象相连。

        然后就可使用TMetafileCanvas类的绘图函数进行图元文件的绘制工作了。

    3.TMetafileImage类

        TMetafile 类内部封装有一个TMetafileImage 类的对象,该类包含图元文件的特殊信息,这些信息包括标准的扩展图元句柄HEnHMetafile 的指针和调色板句柄Hpalette 的指针,这两个指针的结构均由Windows 定义。

    4.显示图元文件

         要想显示图元文件,需要使用TCanvas 类对象的Draw 或StretchDraw 方法,将图元文件作为参数传给这两个方法。其中Draw 方法用于按原大小绘制图元文件,StretchDraw 方法用于按比例绘制图元文件。

     8.1.6  打印图形

         如果要打印图形,就需使用TPrinter 对象。在使用TPrinter 对象之前,先使主项目文件的uses 语句中包含Printers 单元。

8.2  图形列表组件
        图形列表,指的是将信息以图形方式列出来,如树状图、表状图等。

        Delphi提供的图形列表组件包括TreeView和ListView等。

     8.2.1  TreeView组件

        TreeView 组件是可以用来显示一组对象的树状层次结构,像Windows 资源管理器中的文件夹和文件的显示方式,能直观清晰地显示层次关系,含有可以控制树状外形伸展或折叠的工具按钮,可用TreeView 组件来显示一组容器或其他分级的元素之间的关系。

    1.常用属性

        Items 属性包含组件中所有项目,可以在设计时增加、删除和修改项目,在运行时可以通过这个属性访问每个项目并操作。

    2.设计树型列表

         要利用TreeView 组件建立一个树型图形列表,可执行如下操作。

(1)在组件板的“Win32”选项卡中选择TreeView组件,将其添加到窗体上。
(2)选定TreeView组件,在对象查看器对话框“Properties”选项卡的Items属性中,单击省略号按钮,打开“TreeView Items Editor”(项目编辑器)对话框。

     8.2.2  ListView组件

        ListView 组件与TreeView 组件不同,它并不将项目元素以树形显示,而是以图标加文件夹或文件名的形式显示。最典型的ListView 组件就是Windows 资源管理器右边的文件显示区,双击带图标的文件夹,就会显示下一级内容。

    1.常用属性

        ListView 组件的属性与TreeView 组件大部分相同,如Items ,StateImages 等,另外它还有一些其他属性。

    2.设计图形列表

         虽然ListView 组件的运行效果与TreeView 组件不同,但若要利用ListView 组件建立一个树形图形列表,方法与TreeView 组件的基本相同。

8.3  图形栅格组件
        Delphi有一类图形栅格组件,即网状图形表格,包括StringGrid组件、DrawGrid组件和ColorGrid组件。其中,StringGrid组件用于显示文本数据,DrawGird组件用于显示文本和图形,ColorGrid组件用于显示调色板。

     8.3.1  StringGrid组件

        StringGrid 组件可以将字符串列成栅格,而且其本身可存储数据。就本质而言,StringGrid 组件对应的类型TStringGrid 是TDrawGrid 类的一个子类。

     8.3.2  DrawGrid组件

        StringGrid 组件用来显示字符串,如果既要能显示图形,又要能显示字符串,则需要使用DrawGrid 组件。DrawGrid 组件与StringGrid 组件基本相似,但是DrawGrid 组件不能自己开辟Cells 数组来存储各单元格数据的值。

      8.3.3  ColorGrid组件

         ColorGrid 组件是一种颜色栅格组件,常用做调色板。

8.4  图形日历组件
        Delphi提供了3个图形化的日历组件——DateTimePicker组件、MonthCalendar组件和Calendar组件。

     8.4.1  DateTimePicker组件

        DateTimePicker 组件是输入日期与时间的简单工具。它有两种选择日期的形式,第一种形式是采用下拉式的组合框,单击箭头按钮,将打开一个图形化的日历;第二种形式是采用数字编辑框(SpinEdit )形式,单击上下箭头按钮,可调整日期。

     8.4.2  MonthCalendar组件

        MonthCalendar 组件与组合框形式的DateTimePicker 组件打开的下拉图形化日期完全相同。读取该组件的日期也是采用其Date 属性(无Time 属性)。

     8.4.3  Calendar组件

        Calendar 组件用以读取当前日期。

        Calendar 组件有一个Boolean 型的UseCurrentDate 属性,当该属性值为True 时,Calendar  组件采用操作系统的系统时间;当该属性值为False 时,Calendar 组件的时间由用户设定。

8.5  多媒体组件
        多媒体应用拓展了人和计算机交互的方式,综合利用多媒体的应用程序更具有表现力。在Delphi集成开发环境中,提供了两个多媒体组件:媒体播放组件和动画组件。编程人员可以使用这两个组件进行多媒体应用程序的设计和实现。

     8.5.1  MediaPlayer组件

        Delphi 提供了一个多媒体(MediaPlayer )组件,该组件用于进行多媒体播放。

        MediaPlayer组件封装了Windows的媒体控制接口(Media Control Interface,MCI)的大部分功能。

     8.5.2  Animate组件

        Animate 组件是Windows 9x 操作系统中,新增加的具有媒体播放能力的窗口组件。

        它可以在窗口中连续地播放AVI剪辑文件(AVI文件是Microsoft公司标准的音频和视频文件存储格式)。

    1.属性

        FileName 属性:指明了需要播放的AVI 剪辑文件名称;

        Open 属性:确定AVI 剪辑是否已经装入计算机的内存;

        StartFrame属性:用于设置AVI剪辑播放的起始帧;

        StopFrame属性:卡通构件的StopFrame属性用于设置AVl剪辑播放的终止帧;

        Active属性:当为True时播放AVI剪辑文件;为False时停止播放AVI剪辑文件;

        Repetitions属性:用于确定AVI剪辑的重复播放次数。

    2.方法

 (1 )Play 方法:

        用于播放AVI 剪辑文件操作。

(2)Reset方法:

         用于复位操作,通过调用这个方法使组件复位为默认设置值。

(3)Seek方法:

         用于播放所指定的帧。该方法的原型如下:

(4)Stop方法:

          用于终止播放操作。该方法的原型如下: Procedure Stop ;

         其效果与设置Active 属性值为false 时相同。

     8.5.3  Timer组件

        Timer 组件又叫定时器,操作系统每经过一定的间隔就触发一次OnTimer 事件,程序通过响应这个事件可以定时处理某些工作。

        一个应用程序中可以有几个定时器,每个定时器都独立工作。不过,定时器也是一种系统资源,尽量不要浪费。

    1.属性

        Enabled 属性:激活定时器,若为True ,定时器每隔一定的时间间隔,就触发一次OnTimer 事件;

        Interval 属性:时间间隔值,以毫秒为单位。利用它定义的时间间隔,触发OnTimer 事件,默认值为1000 (1s )。

    2.事件

        OnTimer 事件:当定义的时间间隔到后,触发该事件。

九、作业

课后习题

十、本章小结

在本章中,介绍了Delphi的图形及多媒体应用。

 

第9章  数据库编程

一、教学目标

        通过对本章的学习,要求熟悉delphi的数据库操作和编程技术,数据库组件的了解和使用。

二、教学要求

1、掌握delphi的ado组件;

2、掌握与delphi的数据控制组件;

3、掌握delphi的quickreport组件。

三、教学内容提要

9.1 数据库系统概述 

9.2 BDE组件 

9.3 ADO组件 

9.4 数据控制组件简介                       

四、教学重点、难点及解决方法

重点是了解delphi的各种数据库组件的设计与使用。

五、课时安排

    6学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

9.1  数据库系统概述

        数据库系统主要由三大部分组成:

        数据库管理系统(DBMS,它是专门负责组织和管理数据信息的程序);

        数据库应用程序(它使我们能够获取、显示和更新由DBMS存储的数据);

        数据库(按一定结构组织在一起的相关数据的集合)。

     9.1.1  数据库管理系统

         数据库管理系统是用于描述、管理和维护数据库的程序系统,是数据库系统的核心组成部分。它建立在操作系统的基础上,对数据库进行统一的管理和控制。其主要功能如下。

(1)描述数据库:

         描述数据库的逻辑结构、存储结构、语义信息和保密要求等。

(2)管理数据库:

          控制整个数据库系统的运行,控制用户的并发性访问,检验数据的安  全、保密与完整性,执行数据检索、插入、删除、修改等操作。

(3)维护数据库:

         控制数据库初始数据的装入,记录工作日志,监视数据库性能,修改更新数据库,重新组织数据库,恢复出现故障的数据库。

(4)数据通信:

         组织数据的传输。

     9.1.2  关系数据库

         一个关系数据库(Relational Database )是由若干表组成的。

        表(Table):一个表就是一组相关的数据按行排列,像一张表格一样。

        字段(Field):在表中,每一列称为一个字段。每一个字段都有相应的描述信息,如数据类型、数据宽度等。

       记录(Record):在表中,每一行称为一条记录。

       索引(Index):为了加快访问数据库的速度,许多数据库都使用索引。

     9.1.3  数据库应用程序

        DBMS 中存储了大量的数据信息,其目的是为用户提供数据信息服务,而数据库应用程序正是与DBMS 进行通信,并访问DBMS 中的数据,它是DBMS 实现其对外提供数据信息服务这一目的的唯一途径。

     9.1.4  Delphi数据库的体系结构

        Delphi 的数据库应用程序不能直接访问数据,而是使用附带的Borland 数据库引擎(Borland Database Engine ,BDE )、ADO 接口或ODBC 接口等来对数据资源直接进行访问。

9.2  BDE组件
    数据库引擎(Borland Database Engine,BDE)是Delphi及Borland其它开发平台中特有的用于访问数据库的一种机制,它可以让多个应用程序共享。

    BDE提供了强大的API调用函数库,可以对本地及远程数据库进行操作并且提供了几乎所有数据库的驱动程序,通过SQL Links 驱动程序又可以访问远程数据库,并且还可以通过ODBC 适配器来访问数据库。

     9.2.1  TTable组件介绍

        TTable 组件是Delphi 开发数据库应用程序中最常用的组件。它在应用程序访问数据库时起着极其重要的作用。

        TTable,TQuery和TStoreProc同属于数据集(DataSet)组件,它们从数据集继承而来,有着许多共同的属性、方法和事件。

    1.数据集组件的基本知识

         在Delphi 中,访问数据的基本单元是数据集对象。应用程序正是提供数据集组件来访问数据库的。

    2.TTable组件的主要属性

 (1 )DatabaseName 属性:

        DatabaseName 属性用来说明当前数据集的来源,即应用程序所利用的数据库的名字。

        它可以是BDE定义的数据库别名;也可以是数据库文件,数据表文件所在的路径;还可以是由TDataBase组件定义的数据库名,这要根据所使用的DBMS而定。

(2)TableName属性:

        TableName 是TTable 最重要的属性之一。它是用来说明这个TTable 组件所对应的是数据库中的哪一张数据库表格。它是在设计阶段给定的,它在DataBaseName 设定后给出。

(3)Active属性:

        Active 属性用来说明数据库文件的打开状态。通常应用Active 属性来决定及设定一个数据集组件与数据库数据之间的联系。  

(4)Bof(beginning of file)属性和Eof(end of file)属性。

        Bof 属性值为一个布尔值,表明当前记录指针所处的位置是否为数据集的第一个记录。如果Bof 属性值为True ,表明当前记录指针所处的位置是数据集的第一个记录。

(5)Fields属性:

        Fields 属性用来指出数据集的字段列表。应用Fields 属性可以访问数据库表格中的字段组合。

(6)Filter与Filtered。

        Filter 属性允许用户定义一个数据集过滤器。当过滤被数据集应用时,只有那些满足过滤器条件的记录才会被显示。

(7)IndexFieldNames属性:

        IndexFieldNames 属性显示了表格索引的字段名。IndexFieldNames 用来作为指明表格索引的一种方法,其中字段的排序非常重要。

     9.2.2  TQuery组件介绍

        TQuery 是一个建立在SQL 基础上的,专门用于对数据库中的数据进行查询的组件。TQuery 组件使用SQL ,可以一次访问数据库中的一个或多个表格。

        TQuery组件访问的表格可以是在远程服务器的数据库中的,也可以是当地的表格,还可以是ODBC从属数据库。

        SQL作为关系数据库管理系统中的一种通用的结构查询语言,已经被众多的数据库管理系统所采用。Delphi与使用SQL的数据库管理系统兼容,在使用Delphi开发数据库应用程序时,可以使用SQL编程,TQuery组件主要应用SQL。

    1.结构化查询语言

         结构化查询器(Standard Query Language ,SQL )是最重要的数据库操作语言。SQL 是过程性语言,允许用户提交一组命令查询或定义数据。

(1)查询单个表。

       ZG(GH,BMDM,XM,XB,CSRQ,ZC,GZ)  // 意思为:职工( 工号, 部门代码, 姓名, 性别, 出生日期, 职称, 工资) 。

(2)查询多个表。

         除了ZG 表我们要用到BM 数据表:

BM(BMDM,BMMC,FZR,BMDH)  // 意思为:部门( 部门代码, 部门名称, 负责人, 部门电话)

(3)添加数据。

         可以向数据库插入记录:

Insert Into ZG (GH,XM,ZC,GZ)  Values ('0027',' 罗德祥', ' 技术员',1300)

(4)删除记录。

         下面是从数据库中删除工号为“0027” 的记录:

        Delete ZG  Where GH='0027'

        上面的Where 子句指明了删除记录需要满足的条件。

(5)修改记录。

         如果将ZG 数据库表中GH='0005' 的记录的姓名字段由“ 郑幼秋” 修改为“ 郑美棠” ,可以使用如下的SQL 语句:

        UPDATE ZG  SET XM=" 郑美棠"  WHERE XM=" 郑幼秋"

    2.TQuery组件和TTable组件的比较

        TQuery 组件的重要性体现在:

        ·   可同时访问多张表格;

        ·   自动访问基本表格的子集,而不是访问所有的数据。

        TQuery组件和TTable组件同属于数据集组件,它们有着许多相似的地方,但也有各自特殊的地方。

        由TQuery组件和TTable组件的继承关系可知,TQuery组件和TTable组件同属于数据集组件,所以TTable组件继承来的属性、方法和事件,TQuery组件都具有。

    3.TQuery组件的重要属性

        TQuery 组件和TTable 组件同属于数据集组件,所以数据集组件具有的属性、方法和事件,TQuery 组件都具有。

(1)SQL。

        SQL 属性是TQuery 组件最重要的属性之一,它用来设置在TQuery 组件调用ExecSQL 或Open 方法执行查询时所需的选择条件。

(2)DataSource。

         设置DataSource 属性可以自动地将另一个数据集的字段值赋给当前查询的参数,但这些参数必须具有与该数据集相同的字段名。如果不同名,就不能自动地赋值,而必须为其编制程序。

(3)Params和ParamCount。

        Params 属性的基本格式如下:

        Property Params [ Index:Word ] :TParams;

(4)Prepared。

         通过检查Prepared 的属性值来确定是否准备好查询。如果Prepared 属性值为True ,说明已经准备好查询;反之,说明没有准备好。  

(5)RequestLive。

         设置RequestLive 属性来说明执行查询时,是否允许BDE 即时向应用程序返回对数据结果的修改。

        在应用程序中使用TQuery组件,其创建步骤如下。

        ① 从DataAccess组件板中选取TQuery组件放置在窗体或数据模块中,并指定它在应用程序中的名字。

        ② 设置DatabaseName属性为需查询的数据库名,DatabaseName属性值可以是一个BDE数据库别名,一个当地数据库的直接路径,还可以是应用程序中TDatabase组件的DatabaseName属性值。

        ③ 设置SQL属性中的SQL语句,并设置Params属性中的参数。

        ④ 如果查询的数据是通过数据控制组件来显示的,还要在窗体或数据模块中放置一个数据源组件TDataSource,并将其DataSet属性设置为该查询组件。

        它是用来返回查询结果并显示在数据浏览组件中的。通过设置数据浏览组件中的DataSource和DataField属性来联系数据浏览组件和数据源组件。

        ⑤ 激活查询组件。通过设置Active属性,或者调用Open方法或ExecSQL方法来使TQuery组件处于活动状态。

    4.TQuery组件的重要方法

         除了数据集组件共有的方法外,TQuery 组件有自己特有的方法。

(1)Create。

         调用Create 方法在运行时开始一个查询,TQuery 组件会自动地放置在窗体或数据模块中。

(2)Destroy。

         与Create 方法正好相反,调用Destroy 方法可取消与服务器之间的联系,撤销SQL 语句列表、参数列表、数据联系以及SQL 的存储区域,再调用它派生的destructor 。

(3)ExecSQL。

       调用ExecSQL 方法可执行当前SQL 属性中的SQL 查询语句。ExecSQL 用于不需要返回记录指针的数据访问,例如执行Insert ,Update ,Delete 和CreateTable 语句。而对于Select 语句,则应调用Open 方法。

(4)ParamByName。

        ParamByName 函数的基本格式如下:

        Function ParamByName(const Value:string):TParam;

 调用ParamByName 方法根据参数名来设置和使用参数信息。

        其中,Value是希望获取信息的参数的参数名。ParamByName方法主要用来在运行时设置参数值。在Select语句中的参数值不能为Null,但在Update和Insert语句中可以为Null。

(5)Prepare。

         调用Prepare 方法让BDE 和远程的数据库服务器为查询分配资源并执行一些优化操作,称为执行查询前的准备工作。

(6)UnPrepare。

         执行查询的准备工作会消耗一定的资源,所以在完成查询之后应该调用UnPrepare 方法来释放分配给查询的资源。

9.3  ADO组件
        通过ADO数据集访问组件,可以不借助BDE而是通过Microsoft公司的对象链接与嵌入(Object Linking and Embedding,OLE)来访问更为广泛的数据库中的数据。

        ADO是Microsoft ActiveX Data Objects的缩写,它是一系列使应用程序具有访问数据库能力的数据对象。Delphi的ADO组件应用Delphi组件的内容和使用方式来实现ADO数据对象的功能。最为突出的ADO对象包括Connection,Command,Recordset对象。

     9.3.1  TADOConnection组件

        Delphi 中的这个组件对应着ADO 数据对象中的Connection 对象。它用来建立与ADO 数据库之间的联系,由一个TADOConnection 建立的联系可以被多个ADO 数据集组件和操作组件通过设置它们的Connection 实现共享。

    1.TADOConnection的重要属性

 (1 )ConnectionString 。

        ConnectionString 属性用来指明数据库的连接信息。通过设置 ConnectionString 属性来指明将ADO 联系组件与数据集相连的必要信息。

        ConnectionString的属性值包含了一个或多个ADO用来建立联系的变元。如果是包含多个变元,那么它们相互之间要用冒号分开。

        在程序设计阶段,它可以通过激活对象观察器中的该属性栏,从允许的ADO数据库连接中选取。该属性值可以保存为文件之后使用,在以后使用时只需要在该属性栏中指明此文件名就可以再次使用该值。

        该属性值也可以包含用户的身份和密码等信息。当采用Open方法或通过ConnectionString显式地注册登录信息时,最好将LoginPrompt属性值设置为False,这样可以避免不必要的注册对话框。

        ADO的ConnectionString属性值支持Provider,Filename,RemoteProvider和RemoteServer 4种变元。其他的变元将不被ADO处理而只是简单地被传输。

(2)Connected。

        Connected 属性用来说明一个与数据库的联系是否被激活。设置Connected 属性值为True 可以建立一个与ADO 数据库之间的联系而不打开一个数据集;将Connected 属性设置为False 用来使一个联系失效。

(3)ConnectionObject。

        ConnectionObject 属性提供对ADO 联系对象的直接访问。通过设置ConnectionObject 属性可以取得与其参照的ADO 联系对象的直接联系。

(4)ConnectionTimeout。

        ConnectionTimeout 属性用来声明连接可能需要的最长时间。该属性的值是一个整数,它的单位是秒,默认值为15 。

    2.TADOConnection的重要方法

 (1 )Cancel 。

        Cancel 方法用来取消一个准备与ADO 数据库建立的联系。调用Cancel 方法要求联系的方式必须是非同步的。Cancel 方法的调用必须在连接的尝试开始以后并在联系成功或超时之前。

(2)Open。

        Open 过程的基本格式如下:

        procedure Open(const UserID:WideString;const Password:WideString);

        调用Open方法可开始建立与ConnectionString属性中指明的数据库之间的联系。

    3.TADOConnection的使用方法

         如果使用TADOConnection 组件可与ADO 数据库联系,这种联系被ADO 的操作和数据集组件绑定,即通过TADOConnection 组件建立与数据库之间的联系。

     9.3.2  TADOCommand组件

        TADOCommand 组件对应的是ADO 中的Command 对象。TADOCommand 组件用来处理对数据库的操作命令,例如专门的SQL 命令。

        TADOCommand组件更通常地是用来执行DDLSQL命令,或者执行一个不需要返回结果的存储过程。对于那些不返回结果的SQL语句,使用TADODataSet组件、TADOQuery组件或者TADOStoredProc组件会更好。

    1.TADOCommand的重要属性

 (1 )CommandText 。

        CommandText 属性用来说明要使用ADO 操作组件执行的命令内容。

        CommandText属性值是文本形式的命令,例如SQL语句、一个数据表格名或者一个存储过程名。

(2)CommandType。

        CommandType 属性用来说明在CommandText 属性中所说明操作的类型。

        CommandType的属性值应该与CommandText属性中的说明操作相一致,例如,当CommandText属性的内容为数据表格名时,CommandType的属性值就应当为cmdTable或者是cmdTableDirect。

(3)CommandObject。

         通过设置ConnectionObject 属性可以取得与其对应的ADO 操作对象直接联系。通过这种访问,应用程序可以使用与其对应的ADO 操作对象的方法和属性。在没有与之对应的ADO 操作对象,而使用TADOCommand 组件与数据库相连的组件中,这个属性显得尤为重要。

    2.TADOCommand的重要方法

 (1 )Execute 。

        Execute 函数用来立即执行CommandText 属性中定义的操作。

        当执行的操作是用来新增一个记录时,Execute函数将返回这个记录。而这个记录必须通过ADO数据集组件来访问,为了达到这个目的,需要将此ADO数据集组件的RecordSet属性直接设置为Execute函数的返回值。

(2)Cancel。

        Cancel 方法用来取消一个操作组件准备执行的操作。调用Cancel 方法要求执行操作的方式必须是非同步的。

    3.TADOCommand的使用

        TADOCommand 组件用来执行对数据库的操作。

        首先,在CommandText属性中说明使用ADO操作组件执行操作的内容。在程序设计阶段,在对象观察器对话框的CommandText属性栏中输入命令(一条SQL语句、一个数据表格名或一个过程名)。

     9.3.3  TADODataSet组件

        TADODataSet 是最常用的ADO 数据集组件。TADODataSet 可以从ADO 数据库中读取一张或多张数据表。这种读取可以是直接读取数据表格,也可以通过SQL 语句访问。

    1.TADODataSet组件的属性

         通过设置组件的属性,可以完成用户对数据访问的需要。

(1)ConnectionString。

        ConnectionString 属性用来指明数据库的连接信息。通过设置ConnectionString 属性来指明将ADO 数据集组件与数据集相连的必要信息。

(2)CommandText。

        CommandText 是一个可以用来表达语句、数据表格名或者执行的存储过程,要为该属性赋一个文本值。

(3)CommandType。

        CommandType 属性用来指明CommandText 属性的类型,该属性的值应该和CommandText 属性的值相一致。

(4)Connection。

        Connection 属性用来指明ADO 组件与ADO 数据库联系的方式。在程序设计阶段,从对象观察器对话框Connection 属性栏的下拉列表中选择可能的TADOConnection 对象。

    2.TADODataSet组件的方法

        TADODataSet 组件的方法大多是从TDataSet 处继承而来的,例如用来移动数据指针的First ,Next ,Last 和Prior 方法,用来编辑数据记录的Insert 和Edit 方法。

    3.TADODataSet组件的使用

        TADODataSet 组件使Delphi 的应用程序具有通过ADO 访问一个或多个数据表格的能力。

     9.3.4  TADOTable组件

        TADOTable 组件与TTable 组件的区别与TADOQuery 组件与TQuery 组件、TADOStoredProc 组件与TStoredProc 组件的区别一样。

        TADOTable组件与TTable组件的区别就在于前者通过ADO与数据库相连,而后者则是依靠BDE。

  9.4  数据控制组件简介

        在开发数据库应用程序时,利用数据访问组件建立了应用程序与数据库之间的联系,这时,只完成了一半。

        开发数据库应用程序是为了与数据库信息进行交互,也就是浏览和编辑数据库中的数据,因而设计用户接口也成为数据库应用程序开发中一个非常重要的方面。

     9.4.1  TDBGrid组件

        TDBGrid 组件的作用是将一个数据集记录显示在网格中,且可以对其中的数据进行编辑。

        在窗体中放置一个TDBGrid组件来显示和编辑一个数据集(table或query)中的记录,应用程序可以通过数据网格组件来插入、删除或编辑数据集中的数据,或者只是简单地利用它来显示数据集中的数据记录。

        TDBGrid组件的重要属性

 (1 )Columns 。

        Columns 属性用来读取和设置网格中列的特性。它可以在设计阶段由Columnseditor 对话框设置,也可以在应用程序运行时动态地设置。

(2)DataSource。

        DataSource 属性可以说是TDBGrid 组件最重要的一个属性,它指明了TDBGrid 组件中显示数据的来源。

(3)DefaultDrawing。

         将DefaultDrawing 属性设置为True ,允许TDBGrid 组件自动地在每一单元格中显示数据;而将DefaultDrawing 属性设置为False 会取消自动显示,只有当用户触发OnDrawColumnCell 事件或OnDrawDataCell 事件时才会显示相应单元格的数据内容。

(4)DragMode。

        DragMode 属性用来控制是否允许用户对数据单元进行拖放操作。

(5)EditorMode。

         EditorMode 属性用来控制是否允许编辑当前单元内容。

(6)Fields和FieldCount。

         通过设置Fields 属性可以直接地访问作为网格中一列的数据集中的字段对象。

(7)Options。

        Options 属性中包含了一系列规定TDBGrid 组件显示和编辑操作属性的选项。

(8)ReadOnly。

        ReadOnly 属性用来标识网格是只用来显示记录,还是允许用户通过它来编辑数据。

(9)SelectedField。

     9.4.2  TDBNavigator组件

        TDBNavigator 组件(又称为数据库导航器)用来在数据集中浏览数据和编辑数据,例如插入一条空记录或者提交记录等。

        TDBNavigator组件由一组控制按钮组成,通过这些控制按钮,用户可以完成在数据集中移动记录指针,增添或删除一项记录,编辑修改数据记录以及向数据库提交对数据集记录的修改等工作。

    1.TDBNavigator组件实现的主要功能

         在窗体中加入TDBNavigator 组件后,用户可以看见在窗体中出现了一组控制按钮。通过单击这些按钮可完成对数据集的一系列操作。

    2.TDBNavigator组件的重要属性

 (1 )ConfirmDelete 。

        ConfirmDelete 属性用来决定用户在删除记录时是否显示要求用户确认的消息框。

 使用这个属性可以防止用户无意中从数据集里删除了记录。

(2)DataSource。

         通过设置TDBNavigator 组件的DataSource 属性可将它与其控制的数据集联系起来。

(3)ShowHint与Hints。

        ShowHint 属性决定是否显示TDBNavigator 组件中各按钮的提示信息,如果ShowHint 属性值设为True ,当鼠标的光标在TDBNavigator 组件中的某一按钮上停留一段时间后,就会自动地出现提示信息。

(4)VisibleButtons。

        VisibleButtons 属性用来确定TDBNavigator 组件中需要显示哪些按钮,它包括10 个选项。

    3.TDBNavigator组件的重要事件

        TDBNavigator 组件的重要事件是OnClick 事件,它在TDBNavigator 组件的某个按钮被单击并执行完相应的操作之后触发。

     9.4.3  TDBText组件

        TDBText 组件是用来显示数据集里当前记录中一个特定字段的值的数据控制组件。

    1.DataSource

        DataSource 属性与其他的数据控制组件一样,设置为一个数据源组件的名称,通过此数据源组件与数据集取得联系,从而读取数据集中的数据。

    2.DataField

        DataField 属性用来确定TDBText 组件显示的是当前记录中哪个特定字段的值。在完成TDBText 组件与特定数据集的联系后,对象观察器对话框中的DataField 属性框会自动产生一个下拉列表,包含了当前打开数据集中的所有字段。

     9.4.4  TDBEdit组件

        TDBEdit 组件是用来显示和编辑数据集里当前记录中一个特定字段的值的数据控制组件。使用TDBEdit 组件允许用户编辑修改数据。

        TDBText组件显示和编辑修改的是当前记录中特定字段的值,所以随着记录指针的移动,其显示的内容也不断变化。它一次只能显示及编辑修改当前记录中特定的一个字段值。

     9.4.5  TDBMemo组件

        TDBMemo 组件用来显示和编辑数据集中的多行文本。TDBMemo 组件允许用户显示和编辑一个包含多行文本内容的字段。TDBMemo 组件的Text 属性代表了该字段的内容。

 

     9.4.6  TDBImage组件

        TDBImage 组件用来显示和编辑当前记录中的Graphic ,BLOB 类型的图形字段。

        TDBImage组件除了可以在窗体中显示数据集里的图形数据,还允许用户通过剪贴板对图形数据进行编辑操作。

     9.4.7  TDBListBox组件

         在用户更改当前记录中特定字段值的时候,可以使用TDBListBox 组件来提供给用户一个可选工程的列表。

     9.4.8  TDBComboBox组件

        TDBComboBox 组件与TDBList 组件的功能类似,也是在用户更改当前记录中特定字段值时,用来提供给用户一个可选工程的下拉列表;不同之处在于用户可以从下拉列表中选取适当的值来修改当前记录中的特定字段,也可以直接输入新的字段值。

        Items属性用来决定下拉列表的工程内容,和TDBList一样,组合框中的选项可以在设计阶段通过单击对象观察器对话框中的Items属性框激活String List Editor进行编辑,也可以在应用程序运行时,使用Items属性的Add方法动态地改变。

     9.4.9  TDBCheckBox组件

        TDBCheckBox 组件是允许用户选择或不选择一个值的数据控制组件,TDBCheckBox 组件与CheckBox 组件非常相似,只不过TDBCheckBox 组件指向数据集中一个特定的字段。

        因为复选框只能提供两个值,所以TDBCheckBox组件最适合于表达布尔类型数据的字段。总而言之,TDBCheckBox组件可以表达一组只包含两个可能值的数据。

     9.4.10  TDBRadioGroup组件

        TDBRadioGroup 组件是允许用户在一组选项中选取唯一一项的数据控制组件,TDBRadioGroup 组件与RadioGroup 组件的区别和TDBCheckBox 组件与CheckBox 组件的区别相同,TDBRadioGroup 组件必须指向数据集中一个特定的字段。

        TDBRadioGroup组件与TDBCheckBox组件的区别和RadioGroup组件与CheckBox组件的区别相同。

        TDBCheckBox组件用来提供给用户一个选项,用户可以选择或者不选择;而TDBRadioGroup组件用来提供一组两两互斥的选项,也就是说用户只能选择其中的一个选项。

九、作业

    课后习题

十、本章小结

在本章中,介绍了delphi的数据库各种组件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第10章  报表与图表

一、教学目标

        通过对本章的学习,要求熟悉delphi的quickReport组件和Rave组件的设计与使用。

二、教学要求

1、掌握delphi的QuickReport组件;

2、掌握delphi的Rave组件;

三、教学内容提要

10.1 QuickReport组件 

10.2 Rave报表设计器的组件 

10.3 Delphi中的Rave组件 

10.4 图表                          

四、教学重点、难点及解决方法

重点是了解delphi的报表的设计与使用。

五、课时安排

    6学时

六、教学设备

    课堂教学

七、检测教学目标实现程度的具体措施和要求

    通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容

10.1  QuickReport组件
     10.1.1  QuickReport 概述

    1 .关于报表Reports

         当需要使用各种数据及数据库完成工作时,经常面对的是分类、组织在多个表格或文件中的数据。

        这些数据以多种不同的方式相互关联,并且这些内部联系往往不是用户要查阅或使用的;或者公司的不同部门需要查阅不同的数据或各不相同的内部联系,使处理这些数据很困难。所有需要的这些信息确实是存在于数据库中的,但因为数据并非专门为各个部门组织或提取,所以信息寻找起来难度很大。

    2.QuickReport 概述

        QuickReport  是一种功能强大的可视化数据库报表、查询工具,它集成在Delphi  环境下,提供用数据库文件、表格创建报表的方法。

    3.QReport组件页

        Delphi 中的报表输出功能主要是通过QReport 组件面板中的组件实现的。通过这些组件可以设计出功能齐全、具有专业水平的报表。Delphi 中的QReport 组件页中有23 种组件。

     10.1.2  TQuickRep组件

        TQuickRep 组件是制作报表的基础,每一个报表窗口必须包含一个TQuickRep 组件。通过该组件可以设计报表的大小、页边距等属性。

    1.TQuickRep组件的主要属性

 (1 )Bands 。

        Bands 属性是TQuickRep 组件最重要的属性。

        它是一个属性集,该属性集由6个子属性组成,它们的作用是:每设置这些属性集中一个属性为True时,在TQuickRep组件中就自动增加一个相应的TQRBand组件。

(2)DataSet。

        DataSet 属性用来指定报表的数据源。这个数据源可以是TTable 或TQuery 组件。对于简单的列表类型报表,通常只使用一个数据集。但对于一个主/ 明细类型的报表来讲,TQuickRep  组件的DataSet 属性应设置成主数据集。

(3)Options。

        Options 属性集用于设置报表的3 种不同属性,包括FirstPageHeader ,LastPageFooter 和Compression 。

(4)Page。

        Page 属性用来设置报表中页的大小、页边距、页的方向等页属性以及系统打印机设置等。

(5)PrinterSettings。

        PrinterSettings 属性允许选择想要打印的副本数、起始页、终止页以及是否需要重复打印和打印输出的输出途径。

(6)ShowProgress。

        ShowProgress 属性允许在准备和打印报表期间显示一个过程对话框。过程对话框中包含一个Cancel 按钮,允许用户停止生成报表。

    2.TQuickRep组件的方法和事件

(1)OnNeedData事件用来从一个非DBE数据集中生成一个报表。当报表需要下一个记录的数据时,触发该事件。
如果没有连接到一个DBE数据集,则需要自己填写报表中TQuickLabel 组件的文本值。OnNeedData有一个名为MoreData的布尔类型的参数,在报表完成时需要将其设置成False。

 

(2)Preview方法用于报表预览。例如:Form1.QuickRep1.preview。其中,Form1是QuickRep1报表所在的窗体。
(3)Print方法用于报表打印。例如:Form1.QuickRep1.print。

      10.1.3  TQRSubDetail组件

         TQRSubDetail 组件用来在主表/ 明细表类型的报表中显示明细表的数据。

    1.TQRSubDetail组件的主要属性

 (1 )Bands 。

         可以对HasFooter 和HasHeader 属性进行设置。使用这两个属性可以创建Group Footer (组脚)和Group Header (组眉),这两个属性是用来显示明细表中记录字段的说明文字的。

(2)DataSet。

        DataSet 属性用来指明这个明细Band 上的组件从哪个数据集中获得数据。在生成主表/ 明细表类型的报表时,应该将其设置成“ 主表/ 明细表” 关系中明细表的数据库。

(3)Master。

        Master 属性需要设置成指向主表数据集连接的Band 。这通常是一个TQuickRep 组件,如果创建了一个主表/ 明细表类型的报表,这个属性需要指向第一个TQuickRep 组件。

    2.TQRSubDetail组件的方法和事件

        TQRSubDetail 组件主要的事件有AfterPrint ,BeforePrint 和OnNeedData 。

        BeforePrint事件一般用于在报表生成前对报表中的数据进行合法性的检查,以免报表中显示不必要的记录,还可以显示提示框以便在必需时取消打印。AfterPrint事件可以为用户在打印结束后进行后续工作。

     3.TQRSubDetail组件的用法

 (1 )在生成主表的TQuickRep 组件中加入TQRSubDetail 组件。
(2)根据需要决定是否设定Bands属性集中的HasHeader,HasFooter属性,如果需要在报表中增加明细表字段的说明文字,就设置HasHeader属性为Ture。
(3)设置DataSet属性为明细表的数据源。
(4)在TQRSubDetail组件中添加TQRDBText组件,用于显示明细表记录的各个字段。

     10.1.4  TQRBand组件

         每个报表中都包含了一种或者两种类型的TQRBand 组件。当通过TQuickRep 组件的Bands 属性向一个报表添加Band 时,Delphi 实际上创建了一个TQRBand 组件。

        有些Band自动打印,有些Band在每页中打印,还有些Band在整个报表中只打印一次。这些都取决于TQRBand组件的属性设置、方法的使用和事件的触发等。

     1.TQRBand组件的主要属性

 (1 )BandType 。
(2)ForceNewColmun。
(3)ForceNewPage。
(4)LinkBand。
(5)HasChild。

     2.TQRBand组件的方法和事件

        TQRBand 组件的BeforePrint 事件。在报表打印一个Band 时将触发BeforePrint 事件。

    3.TQRBand组件的一般用法

         在实际的报表制作中,TQRBand 组件一般由报表的核心组件生成,如TQuickRep 组件、TQRDetail 组件等。当然,也可以根据自己的需要在报表窗体中增加TQRBand 组件,步骤就和在窗体中增加其他组件一样。

    10.1.5  TQRChildBand组件

        TQRChildBand 组件用来创建与另一个Band 联系的Band ,非常类似一个明细Band 和一个子明细Band 的关系,但没有主表、明细表关系间的形式。

        通过拖放一个TQRChildBand组件到一个报表上,或者设置一个Band的HasChild属性为True,就可以创建一个子Band。通常需要使用子Band的情况是要有一个明细Band内显示备注信息,而这个备注信息后又跟随着其他的记录信息。

     10.1.6  TQRGroup组件

        TQRGroup 组件用来在一个报表内创建组,组主要用在主表/ 明细表类型的报表中,也可以在简单的列表类型的报表中使用。

        TQRGroup组件的Expression属性用来创建一个指明何时需要取消组的限制的表达式。

        该组件的Master属性用来指明TQRGroup组件从哪里得到它的数据。该属性通常连接到相关的TQuickRep组件上。

     10.1.7  TQRLabel组件

        TQRLabel 组件用来在报表中显示静态文本,就和使用TLabel 组件在一个窗体中显示静态文本一样。这个文本值在显示时不能被改变。TQRLabel 组件的属性、方法和事件以及用法和TLabel 组件基本一致。

10.2  Rave报表设计器的组件

        在Delphi 7之后的版本,默认安装了Nevrona公司的Rave Reports项,并且在“Tools”菜单中有“Rave Designer 5.0”命令。

Rave Designer集成开发环境的界面包括标题栏、菜单栏、快捷工具栏、组件栏和一些窗口。

     10.2.1  Rave 5的报表设计界面

        Rave 5 报表设计界面。

 (1 )标题栏显示了当前的工程名,位于窗口最上部。
 (2 )菜单栏中提供了一些命令,一些功能可通过菜单栏的菜单命令实现。
 (3 )快捷工具栏中为位图按钮,一些常用的菜单命令用这些按钮实现。
(4)报表组件栏分页显示各种组件(Standard,Report,Zoom,Colors,Lines,Fills,Fonts,Drawing,Bar Code,Alignment),在利用Rave开发应用程序的过程中,正确、合理地使用组件非常重要。用它可设计基于数据库和文本的复杂报表。

     10.2.2  Drawing(绘图)组件页

        Drawing 组件页中包含以下组件。

(1)Line component:画线组件,所画的线较灵活。它有颜色、线宽、线行等属性,设计者可根据需要更改其属性。要改变线的长短、位置,选中线条后,选择一个端点则光标会变为十字型,拖动即可。
(2)Hline:画水平线组件。
(3)Vline:画垂直线组件。
(4)Rectangle:画长方形组件,可以使用Fill组件填充。

     10.2.3  Bar Code(条形码)组件页

        Bar Code 组件页中包含以下组件。

(1)PostNetBarCode:打印邮件标签上包括 POSTNET的条码。
(2)I2of5BarCode:打印 Interleaved 2 of 5条码。
(3)Code39BarCode:打印standard and extended Code 39条码。

     10.2.4  Standard(标准)组件页

        Standard 组件页中包含以下组件。

 (1 )Text :该组件是在报表上固定的文字,例如报表的标题,可以设置字体的大小、颜色,它的Rotation 属性可以使要显示的字为任意角度。  
(2)Memo:该组件提供了多行文本的文字,与Delphi中的相似,其属性很多,但应用得不多,可以使用text属性添加文本。
(3)Section:该组件是其他组件的容器,可将其他组件固定在此组件中。

     10.2.5  Report(报表)组件页

         若报表需要的是数据库的数据,则应该使用Report 组件页中的组件。其中包含以下组件。

(1)DataText:

         用来显示数据库中内容比较短的信息,要用它显示相应的数据库字段信息,则要用到DataField  和DataView 两个属性,用来连接数据库和字段。

         使用DataText设计主从报表时,LookupDataView表示相应的数据连接,LookupDisplay表示显示内容,LookupField表示主报表相应的数字段进行关联的字段的内容,也就是主数据字段进行连接的字段。LookupInvalid表示控制相应错误产生后的情况。

(2)DataMemo:

         在Memo 的基础上支持了数据库的字段显示,使用DataField 和DataView 两个属性,用来连接数据库和字段。除了输出相应的文本内容外,还可以输出RTF 格式,显示RTF 格式,需要设置ContainsRTF 属性为True 。

(3)CalcTex:

         该组件用来统计报表字段的最大值、最小值、总和、统计值等内容,可直接使用,只需要通过CalcType 属性来设置,CalcType 属性包括ctAverage (求平均值)、CtCount (求个数)、ctMax (求最大值)、ctMin (求最小值)、ctSum (求累加和)。

(4)DataMirrorSection:

         与Section 组件相似。

     10.2.6  其他组件页

         在Rave 5 的报表设计界面中,还有以下一些组件页。

(1)Zoom(缩放)页:在设计报表时,放大、缩小报表页面。
(2)Colors(颜色)页:对选择的对象快速设置颜色。
(3)Lines(线型)页:对于选择的线,更改其线型。
(4)Fills(填充)页:对于正方形等图形设置填充样式。

10.3  Delphi中的Rave组件
Delphi中的Rave组件页包括RvProject,RvSystem,RvNDRWriter,RvCustomConnection,RvDataSetConnection,RvTableConnection,RvQueryConnection,RvRenderPreview,RvRenderPrinter,RvRenderPDF,RvRenderHTML,RvRenderRTF和RvRenderText这几个组件。

     10.3.1  RvProject组件

         在Rave 报表中,RvProject 组件是最为重要的一个,也是使用频率最高的一个组件。开发人员可以通过这个报表完成报表的打印和文件的生成与输出,通过此组件可以设置设计状态,也可以通过它来调用相应的报表设计器。

     10.3.2  RvSystem组件

        RvSystem 组件用于在打印或者预览报表时,进行打印参数设置,使用时与RvProject 结合。

     10.3.3  其他组件

         下面介绍Delphi 的Rave 组件板中的其他一些组件。

(1)RvNDRWriter组件:

         将一个报表保存为特殊的二进制格式,用于预览和打印。

(2)RvCustomConnection组件:

         在非数据库应用程序中,为Rave 报表提供数据。

(3)RvDataSetConnection组件:

         提供Rave 报表与数据源的连接,用于访问DataSet 和DataSet 组件派生的其他组件。

(4)RvTableConnection组件:

         提供Rave 报表与数据源的连接,用于访问Table 或Table 组件派生的其他组件。

(5)RvQueryConnection组件:

         提供Rave 报表与数据源的连接,用于访问Query 或Query 组件派生的其他组件。

10.4  图表

        所谓图表,指的是用图形方式表示表格数据,如棒图、饼图等。Delphi中有一图表组件——TeeChart,由David Berneda开发,授权Borland使用。

     10.4.1  DBChart组件

        DBChart (图表)组件提供了图表的基本结构,并提供了图表的可视化容器。然而,图表实际上是TChartSeries 类型的对象,一旦向窗体中添加Chart 组件,就可以建立一个或多个Series (序列)。

    2.图表数轴

         图表总共有左数轴、右数轴、顶数轴、底数轴和深度数轴5 个数轴。最常用的数轴是左数轴和底数轴,左数轴用以标识数值,底数轴用以标识序号。每个数轴都有范围、标题、数标、位置等属性。设置数轴通常在“Editing DBChart1” 对话框“Chart” 选项卡中的“Axis” 上进行。

    3.图表标题

         图表可以有上标题和下标题两个标题,在“Editing DBChart1” 对话框“Chart” 选项卡中的“Title” 上进行设置。两个标题可分别设置字体、大小、颜色和对齐方式。

    4.图表图例

         图表有一个图例,最初图例显示在图表右上角。用户可自行设置图例的位置(上、下、左、右)、内容(序列名称、序列数值、最近数值)、字体等,这些设置在“Editing DBChart1” 对话框“Chart” 选项卡中的“Legend” 上进行。

    5.图表修饰

         整个图表显示在一个面板上,该面板的属性在“Editing DBChart1” 对话框“Chart” 选项卡中的“Panel” 上进行设置。在图表左侧、底部、背部均有一个背景墙,这3 个背景墙在“Editing DBChart1” 对话框“Chart” 选项卡中的“Walls” 上进行设置。

九、作业

课后习题

十、本章小结

在本章中,介绍了delphi的报表的设计与实现。

 

相关推荐