當前位置:首頁 » 編程語言 » c語言如何實現復雜動畫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言如何實現復雜動畫

發布時間: 2023-08-31 15:11:28

① 如何用c語言編寫有圖形動畫類的程序

C做圖形很不好使,效果也次。建議用turbo c , 它有個graphic.h 頭文件 ,聲明了很多圖形函數,可以直接用,具體用法查資料慢慢看吧。 我給你一個常式吧(用turbo c 編譯) :

#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define N 200
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戲速度自己調整*/
struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變數*/
}food;/*食物的結構體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}
/*圖形驅動*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i<=600;i+=10)/*畫圍牆*/
{
rectangle(i,40,i+10,49); /*上邊*/
rectangle(i,451,i+10,460);/*下邊*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/
}
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機數發生器*/
food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方嚮往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節數*/
PrScore();/*輸出得分*/
while(1)/*可以重復玩游戲,壓ESC鍵結束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/
{
if(food.yes==1)/*需要出現新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;

while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/
}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}

for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}

for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到牆壁*/
{
GameOver();/*本次游戲結束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最後一節*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*圖形結束*/
void Close(void)
{
getch();
closegraph();
}

② c語言動畫編程

看啊
一群星星在追老鼠!!
#include <DOS.H>
#include<graphics.h>
#include<stdlib.h>
#include<math.h>
#define maxcircle 80
#define CR 1
main()
{union REGS r;
int dr=DETECT,mode=0;
int mx,my,mc;
int i, color[maxcircle];
double fx,fy,force=0;
double s,x[maxcircle],y[maxcircle];

initgraph(&dr,&mode,"");
r.x.ax=0;
int86(0X33,&r,&r);
r.x.ax=2;
int86(0x33,&r,&r);
for(i=0;i<maxcircle;i++)
{color[i]=random(16)+1;
x[i]=random(640);
y[i]=random(480);
}

while(!kbhit())
{
r.x.ax=3;
int86(0x33,&r,&r);
mx=r.x.cx;
my=r.x.dx;
mc=r.x.bx;
for(i=0;i<maxcircle;i++)
{
fx=mx-x[i];
fy=my-y[i];
s=sqrt(fx*fx+fy*fy+0.0012);
if(s!=0)
{
setcolor(0);
setfillstyle(1,0);

fillellipse(x[i],y[i],CR,CR);
setcolor(color[i]);
setfillstyle(1,color[i]);

force=random(30)/(double)10;

x[i]+=fx/s*force;
y[i]+=fy/s*force;

fillellipse(x[i],y[i],CR,CR);

}

}
if(mc==1)
{
cleardevice();
for(i=0;i<maxcircle;i++)
{x[i]=random(640);
y[i]=random(480);
color[i]=random(16)+1;
fillellipse(x[i],y[i],CR,CR);
}
}

}
}

③ 怎麼用C語言寫下雪的動畫效果

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

/*
*清除屏幕的shell命令/控制台命令,還有一些依賴平台的實現
*如果定義了__GNUC__就假定是使用gcc編譯器,為Linux平台
*否則認為是Window平台
*/
#ifdefined(__GNUC__)
//下面是依賴Linux實現
#include<unistd.h>
#definesleep_ms(m)
usleep(m*1000)

//向上移動游標函數Linux
staticvoid__curup(intheight)
{
inti=-1;
while(++i<height)
printf("33[1A");//先回到上一行
}
#else

//創建等待函數1s60幀相當於16.7ms=>1幀,我們取16ms
//咱么的這屏幕推薦1s25幀吧40ms
//這里創建等待函數以毫秒為單位,需要依賴操作系統實現
#include<Windows.h>
#definesleep_ms(m)
Sleep(m)

//向上移動游標
staticvoid__curup(intheight)
{
COORDcr={0,0};
//GetStdHandle(STD_OUTPUT_HANDLE)獲取屏幕對象,設置游標
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cr);
}
#endif/*__GNUC__跨平台的代碼都很醜陋*/

//定義初始屏幕的寬高像素宏
#define_INT_WIDTH(100)
#define_INT_HEIGHT(50)
//屏幕刷新幀的速率
#define_INT_FRATE(40)
//雪花飄落的速率,相對於屏幕刷新幀的倍數
#define_INT_VSNOW(10)

/*
*錯誤處理宏,msg必須是""括起來的字元串常量
*__FILE__:文件全路徑
*__func__:函數名
*__LINE__:行數行
*__VA_ARGS__:可變參數宏,
*##表示直接連接,例如a##b<=>ab
*/
#definecerr(msg,...)
fprintf(stderr,"[%s:%s:%d]"msg" ",__FILE__,__func__,__LINE__,##__VA_ARGS__);

/*
*屏幕結構體,具有寬高
*frate:繪制一幀的周期,單位是毫秒
*width:屏幕的寬,基於窗口的左上角(0,0)
*height:屏幕的高
*pix:用一維模擬二維主要結構如下
*0001001010
*0101010120
*...
*=>0表示沒像素,1表示1個像素,2表示2個像素....
*/
structscreen{
intfrate;//也可以用unsigned結構
intwidth;
intheight;
char*pix;
};

/*
*創建一個屏幕結構指針返回
*
*intfrate:繪制一幀的周期
*intwidth:屏幕寬度
*intheight:屏幕高度
*return:指向屏幕結構的指針
**/
structscreen*screen_create(intfrate,intwidth,intheight);

/*
*銷毀一個屏幕結構指針,並為其置空
*structscreen**:指向屏幕結構指針的指針,二級銷毀一級的
**/
voidscreen_destory(structscreen**pscr);

/**
*屏幕繪制函數,主要生成一個雪花效果
*
*structscreen*:屏幕數據
*return:0表示可以繪制了,1表示圖案不變
*/
intscreen_draw_snow(structscreen*scr);

/**
*屏幕繪制動畫效果,繪制雪花動畫
*
*structscreen*:屏幕結構指針
*/
voidscreen_flash_snow(structscreen*scr);

//主函數,主業務在此運行
intmain(intargc,char*argv[])
{
structscreen*scr=NULL;

//創建一個屏幕對象
scr=screen_create(_INT_FRATE,_INT_WIDTH,_INT_HEIGHT);
if(NULL==scr)
exit(EXIT_FAILURE);

//繪制雪花動畫
screen_flash_snow(scr);

//銷毀這個屏幕對象
screen_destory(&scr);

return0;
}

/*
*創建一個屏幕結構指針返回
*
*intfrate:繪制一幀的周期
*intwidth:屏幕寬度
*intheight:屏幕高度
*return:指向屏幕結構的指針
**/
structscreen*
screen_create(intfrate,intwidth,intheight)
{
structscreen*scr=NULL;

if(frate<0||width<=0||height<=0){
cerr("[WARNING]checkisfrate<0||width<=0||height<=0err!");
returnNULL;
}

//後面是為scr->pix分配的內存width*height
scr=malloc(sizeof(structscreen)+sizeof(char)*width*height);
if(NULL==scr){
cerr("[FATALG]Outofmemory!");
returnNULL;
}
scr->frate=frate;
scr->width=width;
scr->height=height;
//減少malloc次數,malloc消耗很大,內存泄露呀,內存碎片呀
scr->pix=((char*)scr)+sizeof(structscreen);

returnscr;
}

/*
*銷毀一個屏幕結構指針,並為其置空
*structscreen**:指向屏幕結構指針的指針,二級銷毀一級的
**/
void
screen_destory(structscreen**pscr)
{
if(NULL==pscr||NULL==*pscr)
return;
free(*pscr);
//避免野指針
*pscr=NULL;
}

//構建開頭的雪花,下面宏表示每_INT_SHEAD個步長,一個雪花,需要是2的冪
//static可以理解為private,宏,位操作代碼多了確實難讀
#define_INT_SHEAD(1<<2)
staticvoid__snow_head(char*snow,intlen)
{
intr=0;

//數據需要清空
memset(snow,0,len);
for(;;){
//取餘一個技巧2^3-1=7=>111,並就是取余數
intt=rand()&(_INT_SHEAD-1);
if(r+t>=len)
break;
snow[r+t]=1;
r+=_INT_SHEAD;
}
}
#undef_INT_SHEAD

//通過上一個scr->pix[scr->width*(idx-1)]=>scr->pix[scr->width*idx]
//下面的宏規定雪花左右搖擺0向左一個像素,1表示不變,2表示向右一個像素
#define_INT_SWING(3)
staticvoid__snow_next(structscreen*scr,intidx)
{
intwidth=scr->width;
char*psnow=scr->pix+width*(idx-1);
char*snow=psnow+width;
inti,j,t;//i索引,j保存下一個瞬間雪花的位置,t臨時補得,解決雪花重疊問題


//為當前行重置
memset(snow,0,width);
//通過上一次雪花位置計算下一次雪花位置
for(i=0;i<width;++i){
for(t=psnow[i];t>0;--t){//雪花可以重疊
//rand()%_INT_SWING-1表示雪花橫軸的偏移量,相對上一次位置
j=i+rand()%_INT_SWING-1;
j=j<0?width-1:j>=width?0:j;//j如果越界了,左邊越界讓它到右邊,右邊越界到左邊
++snow[j];
}
}
}

/**
*屏幕繪制函數,主要生成一個雪花效果
*
*structscreen*:屏幕數據
*return:0表示可以繪制了,1表示圖案不變
*/
int
screen_draw_snow(structscreen*scr)
{
//靜態變數,默認初始化為0,每次都共用
staticint__speed=0;
intidx;

if(++__speed!=_INT_VSNOW)
return1;

//下面就是到了雪花飄落的時刻了既__speed==_INT_VSNOW
__speed=0;

//這里重新構建雪花界面,先構建頭部,再從尾部開始構建
for(idx=scr->height-1;idx>0;--idx)
__snow_next(scr,idx);

//構建頭部
__snow_head(scr->pix,scr->width);

return0;
}

//buf保存scr中pix數據,構建後為(width+1)*height,後面宏是雪花圖案
#define_CHAR_SNOW『*『
staticvoid__flash_snow_buffer(structscreen*scr,char*buf)
{
inti,j,rt;
intheight=scr->height,width=scr->width;
intfrate=scr->frate;//刷新的幀頻率

//每次都等一下
for(;;sleep_ms(frate)){
//開始繪制屏幕
rt=screen_draw_snow(scr);
if(rt)
continue;

for(i=0;i<height;++i){
char*snow=scr->pix+i*width;
for(j=0;j<width;++j)
buf[rt++]=snow[j]?_CHAR_SNOW:『『;
buf[rt++]=『 『;
}
buf[rt-1]=『『;

//正式繪制到屏幕上
puts(buf);

//清空老屏幕,屏幕游標回到最上面
__curup(height);
}
}
#undef_CHAR_SNOW

/**
*屏幕繪制動畫效果,繪制雪花動畫
*
*structscreen*:屏幕結構指針
*/
void
screen_flash_snow(structscreen*scr)
{
char*buf=NULL;
//初始化隨機數種子,改變雪花軌跡
srand((unsigned)time(NULL));

buf=malloc(sizeof(char)*(scr->width+1)*scr->height);
if(NULL==buf){
cerr("[FATAL]Outofmemory!");
exit(EXIT_FAILURE);
}

__flash_snow_buffer(scr,buf);

//1.這里理論上不會執行到這,沒加控制器.2.對於buf=NULL,這種代碼可以省掉,看編程習慣
free(buf);
buf=NULL;
}

④ 如何利用C語言實現動畫

可以用windows.h的頭文件

然後裡面system("cls");
清除屏幕重新從第一行開始畫
還有tc環境畫圖下有graphics.h頭文件有畫圖的函數,但是vc沒有,如果想在控制台
下畫圖,給你一段代碼,直接添加你用的api函數就行了

#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <tchar.h>
extern "C"

⑤ 如何利用C語言實現動畫

基於擦除法的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. 總結

擦除法動畫設計原理易於理解,便於操作。並且它的程序運行所需內存空間也比上述四種常用方法要少得多,因為它在程序執行過程中不需將圖形存入內存再從內存調出,這節省了大量的內存空間。如果程序運行在內存緊張的環境中,如嵌入式系統中,這種方法尤其適用