基于擦除法的C语言动画设计与实现 Movie design implement in C language base on erasure way 东华理工学院计算机与通信系 姜林 何月顺 江西 南昌 330013
摘要: 本文介绍了程序设计语言中动画设计的原理,在C语言中的动画设计常用方法,并提出了在C语言中新的动画设计方法――擦除法。阐述擦除法动画设计的原理,并通过一个具体的实例详细介绍了这种方法的设计实现,文中末尾总结了擦除法动画设计的优点及适用的范围。 关键字:擦除法;C语言;TurboC2.0;动画设计;原理;实现 中图分类号:TP312 Summary: Through the principium of movie design in program design language, the thesis present movie design general way in C language, and bring forward new movie design way――erasure . The thesis also expatiate the principium of erasure way, particular describe the design implement of erasure by a instance. The end summarize the excellence and range of erasure way. Key words: erasure way; C language ; TurboC 2.0; movie design; principium; implement
0. 引言
动画技术是计算机图形学中的重要内容,它广泛用于游戏娱乐,辅助教学,科学实验模拟等计算机辅助设计。用于动画设计的程序设计语言有多种,并且有多种方法。其中C语言程序设计又广泛用于各种软件开发项目中。因此,掌握C语言的动画设计方法对于软件开发很有必要。
1. 程序设计中动画原理
程序设计中动画设计的原理类似电影的方法,它利用人的视觉具有暂留的生理特点,即人眼对动态图像的变化仅能分辨出时间间隔为25毫秒左右的变化,如果图像变化太快,则人眼无法分辨。在程序设计中我们可以在屏幕上画出一张图像,而将这张图像在不同时间出现,然后一张张快速(时间间隔小于25毫秒)呈现在屏幕上,从视觉效果上看这些画面就如同电影在连续变化一样,给人以动的视觉感觉。
2. C语言动画设计常用方法 C语言常用动画设计方法[1]: 2.1 利用动态开辟图视口方法 在位置动态变化,但大小不变的图视口中(用setviewpot()函数[2]),设置固定图形,这样呈现在观察者面前的是当前图视口位置在动态变化,因而在屏上看到的图像就好像在动态变化一样。 2.2 利用显示页和编辑页交替变化 将当前显示页和编辑页分开(用setvisualpage()和setactivepage()函数),在编辑页上 画好图形后,立即令该页变为显示页,然后在上次显示页上进行画图,画好后,再交换,如此反复,在观察者的视觉上,就出现了动画的效果。 2.3 利用画面存储再重放的方法 如同制作幻灯片一样,将整个动画过程变成一个个片断,然后存储到显示缓冲区内,当把它们按顺序重放到屏幕上时,就出现了动画效果。 2.4 直接对图像动态存储器进行操作 利用显示适配器上控制图像显示的各种寄存器和图像存储器VRAM,对其进行直接操作和控制,从而可以高效快速的实现动画效果。 上述4种方法均可以实现动画效果,但其操作比较复杂,且在程序中要对图像不断进行存取操作,这需要耗费大量内存资源。下面的擦除法动画设计可以解决上述问题。
3. 擦除法动画设计原理
擦除法动画设计方法在很多的动画制作工具(如flash)中大量使用,但在程序设计中却鲜有人用。它的设计原理是:利用同色原理,当图形色与背景色相同时人眼不能感知。在动画设计中,当在一个位置画了一张图像时,使图像色与背景色相异,然后再到另一个位置画一张图像并使图像色与背景色也相异,此时将先前画的图像在原位置再画一张,并使图像色与背景色相同,这样人眼只能看到新画的一张图像而看不到先前画的图像,从而先前画的图像感觉被擦除了。这样连续画多张图像并在每画一张新的图像,将原来的图像擦除,从而在观察者来看就实现了动画的效果。
4. 擦除法的动画设计实现
下面以一个上下翻滚的圆作为一个例子来讲解在TurboC2.0开发环境下用C语言来实现动画的设计过程,其中动画设计的方法是擦除法。具体的实现步骤如下: 4.1 TC的图形系统的初始化 TurboC2.0为用户提供了一个功能强大的画图软件库,它包括图形库文件(graphics.lib),图形头文件(graphics.h)和许多图形显示器的驱动程序。在TurboC2.0开始进行图形设计前必须对之进行初始化,使系统知道要用什么类型的图形显示器的驱动程序,采用什么模式的图形方式,以及该适配器驱动程序的寻找路径名。这个初始化的函数是initgraph()。在本程序中的初始化如下: gdriver=DETECT; initgraph(&gdriver, &gmode, "");//图形显示器、显示模式、路径自动检测 4.2 画图 setcolor(LIGHTRED);//设置圆的线条颜色为淡红色 setlinestyle(0,0,1);//设置线条为形状为实线,线宽为一点宽 setfillstyle(1, 10);//设置圆的填充式样为以实填充,填充色为淡绿色 circle(300, 10+10*y,15);//画一个圆心在坐标(300,10+10y),半径为15的圆 |
这个地方我们需要画一个圆(用draw()函数实现),并且设置圆的圆周线条的颜色(用setcolor()函数),设置线条类型(用setlinestyle()函数),设置圆的填充色和填充模式(用setfillstyle()函数),设置圆的填充色(用floodfill()),最后是画圆(用circle()函数)。在本程序(draw()函数)中的代码如下: floodfill(300, 10+10*y, 12);//给圆填充如上stfillstyle中的淡绿色
为了实现擦除操作需在同一个位置再画一个圆(用clear()函数实现),该操作只需将上面的画圆函数(draw()函数)改动两个设置即可,如下示: setcolor(BLUE);//设置圆的线条颜色为蓝色(与背景色相同) setfillstyle(1, 10);//设置圆的填充式样为以实填充,填充色为淡绿色 4.3 动画实现 本部分是核心部分,先设置背景色为蓝色(用setbkcolor()函数),再在屏幕上画一个填充色为淡绿色的圆(draw()函数)。设置一个循环控制语句实现在屏幕上不同的位置画圆,同时在每画一个圆后作一个时间的延迟(用delay()函数),再在延迟后实现擦除操作,即调用clear()函数。其流程图及代码如下: setbkcolor(BLUE);//设置背景色为蓝色 for(j=20;j>0;j=j-4)//控制动画实现的次数为20次 { for(i=j;i<30;i++)//实现动画从上向下闪烁 { draw(i);//画圆 delay(100000);//延迟0.1秒 clear(i);//擦除已画的圆 } for(i=30;i>j;i--)//实现动画从下向上闪烁 { draw(i);//画圆 delay(100000);//延迟0.1秒 clear(i);//擦除已画的圆 } |
} 动画实现后的最后效果图如下示。
4.4 关闭图形系统 当图形实现结束后需要关闭图形系统,利用函数closegraph()即可实现。 5. 总结 擦除法动画设计原理易于理解,便于操作。并且它的程序运行所需内存空间也比上述四种常用方法要少得多,因为它在程序执行过程中不需将图形存入内存再从内存调出,这节省了大量的内存空间。如果程序运行在内存紧张的环境中,如嵌入式系统中,这种方法尤其适用。
参考文献: [1]王士元 C高级实用程序设计[M] 清华大学出版社 2001. [2]徐金梧 Turbo C实用大全[M] 机械工业出版社 2002. [3] Donald Hearn 计算机图形学(第三版)[M] 电子工业出版社 2005. [4]Stephen Prata C Primer Plus [M]Sams Corporation 2002. [5] 郑军红C语言程序设计教程 武汉大学出版社[M] 2005.
作者简介:姜林,1977.11,湖南常德人,硕士研究生,东华理工学院计算机与通信系教师,研究方向为程序设计语言,计算机图形学,分布式数据库 何月顺,男,1971.9,湖南道县人,东华理工学院计算机通信系副教授,南京航空航天大学在读博士研究生。1994至今,在计算机教研室从事计算机应用专业的教学科研工作,主要从事计算机网络、数据库应用、计算机图形图像处理方向的研究 通信地址:江西南昌昌北下罗麦庐大道东华理工学院莫斯软件学院教师办公室 330013 电话:13517004917 Emain: jianglin@ecit.edu.cn
|