韩继英
(山西职业技术学院计算机工程系,山西太原030006)
C语言是一种功能强大的计算机程序设计语言,它具有很强的数据处理能力,应用范围广泛,不仅可以编写系统软件,而且还可以通过绘制三维、二维图像以及动画来实现可视化人机界面。
通常在C语言中使用频率最高的输出函数printf(),只能输出文本信息,不能实现绘图功能。为了实现这一功能,C语言的标准函数库还提供了一个功能强大的图形函数库,包含了所有的图形函数。当程序中需要使用到任何一个或多个图形函数时,都必须包含头文件graphics.h,而且这些图形函数都必须在特定的图形模式下才能使用。但C语言的默认模式是文本模式,在文本模式中,图形函数无法实现其功能,因此,必须先将计算机模式调整为图形模式。在图形模式下,我们可以通过图形函数实现可视化人机界面[1]。
文本模式显示数据的最小单位是字符,屏幕被划分为80列25行;而图形模式是以显示器屏幕上的每个发光点即象素为显示数据的最小单位的[2]。在此模式下,显示器屏幕上的象素数目是根据显示器的分辨率确定的。例如:分辨率为1 024×768,则屏幕被划分为768行1 024列,即每行有768个象素,每列有1 024个象素。一般情况下,显示器分辨率越高,象素越多,则显示的图形效果就越精确,越光滑。
在使用C语言的图形功能时,首先要将屏幕设置为图形模式,如不做此项工作,则屏幕的初始模式为文本模式,无法显示图形。将屏幕设置成图形模式由函数initgraph()来完成,此函数包含在头文件graphics.h中,因此在使用时要将该文件包含到程序中。在完成图形功能后用closegraph语句关闭图形模式,使屏幕返回到初始的文本模式。
下面的程序给出了绘制图形所需的必要操作,本程序在完成屏幕初始化后,画了一条从左上角到右下角的直线。
说明:
(1)程序中定义了gdriver和gmode,并给 gdriver赋值DETECT,表示让硬件自动监测图形驱动器与模式。
(2)initgraph()函数是初始化屏幕图形模式,""中应指明屏幕图形模式驱动程序所在的位置,如:"c:\borlandc\bgi",如当前目录包含该驱动程序时,可省略为:"",我们使用的驱动程序为EGAVGA.BGI,该驱动程序支持640×480分辨率16种颜色,分别用0~15表示*/
(3)line()函数是画直线函数,此程序中从左上角点(0,0)到右下角点(getmaxx(),getmaxy())画了一条直线。
(4)closegraph()函数是关闭图形模式,退回到文本模式。
图形模式下,有时也需要显示字符,我们还能够使用文件模式下的输出函数printf()以及字符处理函数putchar()、puts(),将文本信息输出到屏幕上。除此之外,C语言图形函数库还提供了专门用在图形模式下输出文本的一些函数,如outtextxy()等。对于输出的文本,还可以利用图形函数对其进行大小和颜色的设置。settextstyle()函数可以使文本在水平和垂直方向上放大相同的倍数;setusercharsize()函数可以分别设置水平和垂直方向上的放大倍数;setcolor()函数可以对输出文本的颜色进行设置。
在图形模式设置时,需要有相应的BGI文件,因此在将图形模式下编写好的程序复制到其他用户计算机,根本无法正常运行。必须将所有的BGI文件一起复制给用户,并且还要考虑路径是否存在问题。因此我们需要建立一个不需要驱动程序就可以独立运行的可以执行图形程序的有效方法,具体实现步骤如下:
1)使用命令:C:TC>BGIOBJEGAVGA
把原有的 EGAVGA.BGI驱动程序转换为 EGAVGA。OBJ目标文件。
2)使用命令:C:TC>TLINK C:TCLIBGRAPHICS.LIB+EGAVGA
把已经建立的OBG目标文件装入到GRAPHICS.LIB库文件中。
3)为了能够通知连接程序将EGAVGA驱动程序在连接时可以装入到用户的执行程序中,应在调用initgraph()函数前面加上语句:
registerbgidriver(EGAVGA_driver);
应用上面方法处理以后,经过编译连接生成的执行程序就能够在任意目录下运行了。
由于人的眼睛在视觉讯号分辨时,都会出现视觉暂留现象。医学证明:当一个物体的影象或者一幅画面消失后,留在人眼睛视网膜上的映像还可以保留1/24秒。动画、电视以及电影都是利用了人的这一视觉暂留特性,快速地显示一连串图形,并在每张图形上做一些小小的修改,从而达到动画的效果。
C语言中有一种逻辑运算称为“异或”运算。“异或”运算是指操作数1与操作数2的非同操作数1的非与操作数2的或的结果。例如:
0异或0=0
1异或0=1
0异或1=1
1异或1=0
由于0异或1结果为1,所以任何两种不相同的颜色值进行按位异或时,除和黑色进行按位异或后结果为原色外,其余都变成了和这两种颜色不同的另外一种颜色。因此,在实现动画时,可以将两种颜色值按位进行异或,从而模拟这两种颜色的重叠。即通过按位异或两个图形中相应的像素值来模拟这两个图形的重叠,从而不用顾及背景色,一直保持他们的可见性。任何一个数在和另一个数异或两次后,就可以还原。也就是说,在绘制图形时,如果在同一个坐标绘制两次某个图形,则这个图形就会消失,变为背景色。
因此,我们可以很轻松地利用异或技术来实现简单动画过程。先在屏幕上用某种颜色采用异或方式绘制一幅图,接着在同一个位置采用异或方式再画一次,将该图抹掉,然后根据运动轨迹在新的位置采用异或方式绘制第二幅图,同样再用异或方式绘制一次,将此画面消失,如此反复,直到绘制完最后一幅图为止[3]。在这个过程中,每幅画都绘制了两次,一次显示,一次擦除,只是每幅画的位置有所不同。
下面是应用异或方式实现绘制一个运动的圆的例子。
本例采用异或方式重画,画点开销较小,是绘制动画最好的选择。
本文主要是研究了在C语言的图形模式下,利用图形函数,采用异或方式,较好地实现了可视化人机界面[4]。这种方式操作方便,易于理解,是解决可视化人机界面有效的一种方式。
[1]杨宝华,袁志树,文昌辞.应用软件人机界面优化的研究[J].电脑知识与技术,2009(18):4817-4818.
[2]王士元.C高级适用程序设计[M].北京:清华大学出版社,2001.
[3]程书红,王毅.用C语言实现图形动画设计[J].电脑开发与应用,2010,23(2):78 -80.
[4]蔡青,蔡华.可视化技术及其发展[N].计算机世界网,1996-06-13.