计算机图形的动画显示实际上是一系列静止图像在不同位置的重放,大部分动态现实程序模拟运动的基本方法是相同的,即在屏幕某一显示位置上先擦出一个静止图像,然后在临近的位置上绘出下一副图,程序重复的执行擦出和绘制过程,就产生所需要的动画效果.这种动画方式对于简单的图形效果是很好的,但对于较为复杂的图形来说,效果就不是很好了,为了解决这一问题,用多页显示绘图的方法很有效.
在turbo c的图形子系统中,提供了两条重要的页面设置函数,即设置图形输出活动页函数setactivepage()和设置可见图形页函数setvisualpage(),其用法为:
#include
void far setvisualpage();
图形页实际上是一个虚假页面,是内存中开辟的一块内存缓冲区.活动图像也可以是当前显示页,也可以是非显示页,当用函数setactivepage()选定某一页为活动页后,其后所有的图形输出都针对该页,有了多个图形页,程序就可以将图形输出到一个非显示屏幕页上,然后通过调用setvisualpage()改变可见页来快速显示,关闭图形页面中的画面.
多个图形页交替显示的过程如下: 在所用的两个页面中,当一个可见页面用于显示时,另一个关闭页用于绘图.当新的画面上成后,就把两页进行转换,原作为显示用的页面在用来绘制新的图形.一般可把画面显示顺序作如下安排,第一页用于显示动画过程的1,3,5...等画面,第二页用于显示2,4,6...等画面,如此交替下去,利用页面转换技术进行动态显示,图形的擦出和重画过程都在后台进行,屏幕上出现的仅是整幅画面的瞬间切换,其动态效果十分平滑,如下面的程序.
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <math.h>
main()
{void * ptr;
int gd=DETECT,gm;
float i;
initgraph(&gd,&gm,"d:\\tc");
setactivepage(1);
setcolor(RED);
setfillstyle(1,14);
fillellipse(10,10,10,10);
ptr=malloc(imagesize(0,0,20,20));
getimage(0,0,20,20,ptr);
randomize();
setactivepage(0);
for(i=0;i<3000;i++)
putpixel(random(640),random(480),random(15));
for(i=0;i<6.28*4;i=i+0.005)
{putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
putimage(300+8*(cos(i)+(i)*sin(i)),240+6*(sin(i)-(i)*cos(i)),ptr,COPY_PUT);
if(kbhit()) break;
delay(10);
}
getch();
closegraph();
}