求一简单的C语言动画程序。

求一简单的C语言动画程序。,第1张

C语言动画程序

#include <mathh>

#include <stdioh>

#include <graphicsh>

#include <dosh>

#define pi 31415926535

double ca3mm1(double m1,double m2);

double ca3fm1(double cosine,double sine);

double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang);

double ca6fm2(double a4m ,double a4f,double a5m , double a5f);

char inbox(int x,int y,int x1,int y1);

char buf();

main()

{

double m=30;

double xo=1000,yo=2000,a1=300,t1=pi;

double xc=xo+ma1,yc=yo;

double a2=80,a3,a4=250,a5=300,a6=200,a7=350;

double t2,t3,t4,t5,t6,t7;

double xo1=xo+m150,yo1=yo;

double xc1=xo1-ma1,yc1=yo1;

double i,j,k;

double l1;

double n=1161,nt;

initscreen();

setfillstyle(SOLID_FILL,DARKGRAY);

bar(0,0,640,480);

mybutton(10,10,"BEGIN",1,0);

mybutton(500,10,"EXIT",1,0);

line(0,69,640,69);

mouseinit();

changemousecross();

setmousexy(320,20);

mouseshow();

setmousearea(0,0,640,60);

do{

if(inbox(10,10,70,26)&&button()==1)

{mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }

if(inbox(500,10,555,26)&&button()==1)

{mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }

if(buf()==56)

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

switch (buf()){

case 18:{

mousehide();

mybutton(500,10,"EXIT",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(500,10,"EXIT",1,7);

mouseshow();

exit(0);

}

case 48: {

mousehide();

mybutton(10,10,"BEGIN",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(10,10,"BEGIN",1,7);

mouseshow();

goto run;

}

default:break;

}

}

}while(1);

run:

drawjijia(xo,yo,1);

drawjijia(xc,yc,1);

drawjijia(xo1,yo1,1);

drawjijia(xc1,yc1,1);

setwritemode(1);

do{

for(i=0;i<3600;i+=10)

{

t2=i;

a3=ca3mm1(a1cos(t1)+a2cos(t2pi/1800),a1sin(t1)+a2sin(t2pi/1800));

t3=ca3fm1(a1cos(t1)+a2cos(t2pi/1800),a1sin(t1)+a2sin(t2pi/1800));

a4=a3;

t4=t3;

t5=ca5fm2(a6,a5,a4,t4,0);

t6=ca6fm2(a4,t4,a5,t5);

t7=t6-900;

l1=xc1-xc-2ma7cos(t7pi/180);

nt=(asin(l1/2/(n/2))180/pi)-900;

drawline(xo,yo,a2,t2,m,LIGHTGRAY);

drawline(xo+ma2cos(t2pi/180),yo-ma2sin(t2pi/180),a5,t5,m,LIGHTGRAY);

drawline(xc,yc,a6,t6,m,LIGHTGRAY);

drawline(xc,yc,a7,t7,m,LIGHTGRAY);

drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);

drawline1(xo1+ma2cos((180-t2)pi/180),yo1-ma2sin((180-t2)pi/180),a5,t5,m,LIGHTGRAY);

drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);

drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);

for(j=-1;j<20;j++)

{ drawline(xc+ma7cos(t7pi/180),(yc-ma7sin(t7pi/180)-jnsin(ntpi/180)),n,nt,10,GREEN);

drawline1(xc1-ma7cos(t7pi/180),(yc1-ma7sin(t7pi/180)-jnsin(ntpi/180)),n,nt,10,DARKGRAY);

}

delay(300);

drawline(xo,yo,a2,t2,m,LIGHTGRAY);

drawline(xo+ma2cos(t2pi/1800),yo-ma2sin(t2pi/1800),a5,t5,m,LIGHTGRAY);

drawline(xc,yc,a6,t6,m,LIGHTGRAY);

drawline(xc,yc,a7,t7,m,LIGHTGRAY);

drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);

drawline1(xo1+ma2cos((180-t2)pi/180),yo1-ma2sin((180-t2)pi/180),a5,t5,m,LIGHTGRAY);

drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);

drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);

for(j=-1;j<20;j++)

{ drawline(xc+ma7cos(t7pi/180),(yc-ma7sin(t7pi/180)-jnsin(ntpi/180)),n,nt,10,GREEN);

drawline1(xc1-ma7cos(t7pi/180),(yc1-ma7sin(t7pi/180)-jnsin(ntpi/180)),n,nt,10,DARKGRAY);

}

setwritemode(0);

if(inbox(500,10,555,26)&&button()==1)

{mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }

if(buf()==56)

for(k=0;k<10000;k++){

switch (buf()){

case 18:{

mousehide();

mybutton(500,10,"EXIT",0,0);

mouseshow();

delay(4000);

mousehide();

mybutton(500,10,"EXIT",1,7);

mouseshow();

exit(0); }

default:break;

}

}

setwritemode(1);

}

}while(1);

}

drawline(double xo,double yo,double mo,double fujiao,double m,int color)

{

double x,y;

x=(xo+mmocos(fujiaopi/180));

y=(yo-mmosin(fujiaopi/180));

setcolor(color);

line (xo,yo,x,y);

}

drawline1(double xo,double yo,double mo,double fujiao,double m,int color)

{

double x,y;

x=(xo-mmocos(fujiaopi/180));

y=(yo-mmosin(fujiaopi/180));

setcolor(color);

line (xo,yo,x,y);

}

drawjijia(double x,double y,int shang)

{

setcolor(RED);

if (shang==1){

circle(x,y,3);

line(x-30,y+30,x-150,y+200);

moveto(x-15,(int)(y+20));

lineto((int)(x+15),(int)(y+20));

moveto((int)(x+15),(int)(y+20));

lineto(x+3,y+3);}

setcolor(RED);

if (shang==0){

circle((int)x,(int)y,3);

line (x-3,y-3,x-15,y-20);

moveto(x-15,y-20);

lineto(x+15,y-20);

moveto(x+15,y-20);

lineto(x+3,y-3);

}

}

double ca3mm1(double m1,double m2)

{

double temp;

temp = sqrt(m1m1 + m2m2);

return(temp);

}

double ca3fm1(double cosine,double sine)

{

float temp;

if (sine > 0 && cosine > 0)

temp = atan(sine / cosine) 180 / pi;

if (sine > 0 && cosine < 0)

temp = (atan(sine / cosine) + pi) 180 / pi;

if (sine < 0 && cosine < 0)

temp = (atan(sine / cosine) + pi) 180 / pi;

if (sine < 0 && cosine > 0)

temp = (atan(sine / cosine) + 2 pi) 180 / pi;

return(temp);

}

double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang)

{

double temp,sine1,cosine1;

cosine1 = (a6m a6m - a4m a4m - a5ma5m) / (2 a4m a5m);

sine1 = sqrt(1 - cosine1 cosine1);

if (shang==0)

sine1 = sine1(-1);

if (sine1 > 0 && cosine1 > 0)

temp = a4f + (atan(sine1 / cosine1) 180 / pi);

if (sine1 > 0 && cosine1 < 0)

temp = a4f + ((atan(sine1 / cosine1) + pi) 180 / pi);

if (sine1 < 0 && cosine1 < 0)

temp = a4f + ((atan(sine1 / cosine1) + pi) 180 / pi);

if (sine1 < 0 && cosine1 > 0)

temp = a4f + ((atan(sine1 / cosine1) + 2 pi) 180 / pi);

return(temp);

}

double ca6fm2(double a4m ,double a4f,double a5m , double a5f)

{

double temp,sine1,cosine1;

sine1 = a4m sin(a4f pi / 180) + a5m sin(a5f pi / 180);

cosine1 = a4m cos(a4f pi / 180) + a5m cos(a5f pi / 180);

if (sine1 > 0 && cosine1 > 0)

temp = (atan(sine1 / cosine1) 180 / pi);

if (sine1 > 0 && cosine1 < 0)

temp = ((atan(sine1 / cosine1) + pi) 180 / pi);

if (sine1 < 0 && cosine1 < 0)

temp = ((atan(sine1 / cosine1) + pi) 180 / pi);

if (sine1 < 0 && cosine1 > 0)

temp = ((atan(sine1 / cosine1) + 2 pi) 180 / pi);

return(temp);

}

initscreen()

{

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(&gd,&gm,"");

}

看啊

一群星星在追老鼠!!

#include <DOSH>

#include<graphicsh>

#include<stdlibh>

#include<mathh>

#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,"");

rxax=0;

int86(0X33,&r,&r);

rxax=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())

{

rxax=3;

int86(0x33,&r,&r);

mx=rxcx;

my=rxdx;

mc=rxbx;

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

{

fx=mx-x[i];

fy=my-y[i];

s=sqrt(fxfx+fyfy+00012);

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/sforce;

y[i]+=fy/sforce;

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语言动画设计与实现

Movie design implement in C language base on erasure way

 东华理工学院计算机与通信系 姜林 何月顺 江西 南昌 330013

摘要:

 本文介绍了程序设计语言中动画设计的原理,在C语言中的动画设计常用方法,并提出了在C语言中新的动画设计方法――擦除法。阐述擦除法动画设计的原理,并通过一个具体的实例详细介绍了这种方法的设计实现,文中末尾总结了擦除法动画设计的优点及适用的范围。

关键字:擦除法;C语言;TurboC20;动画设计;原理;实现 

中图分类号: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 20; movie design; principium; implement

0. 引言

动画技术是计算机图形学中的重要内容,它广泛用于游戏娱乐,辅助教学,科学实验模拟等计算机辅助设计。用于动画设计的程序设计语言有多种,并且有多种方法。其中C语言程序设计又广泛用于各种软件开发项目中。因此,掌握C语言的动画设计方法对于软件开发很有必要。

1. 程序设计中动画原理

程序设计中动画设计的原理类似**的方法,它利用人的视觉具有暂留的生理特点,即人眼对动态图像的变化仅能分辨出时间间隔为25毫秒左右的变化,如果图像变化太快,则人眼无法分辨。在程序设计中我们可以在屏幕上画出一张图像,而将这张图像在不同时间出现,然后一张张快速(时间间隔小于25毫秒)呈现在屏幕上,从视觉效果上看这些画面就如同**在连续变化一样,给人以动的视觉感觉。

2. C语言动画设计常用方法

 

C语言常用动画设计方法[1]:

21 利用动态开辟图视口方法

在位置动态变化,但大小不变的图视口中(用setviewpot()函数[2]),设置固定图形,这样呈现在观察者面前的是当前图视口位置在动态变化,因而在屏上看到的图像就好像在动态变化一样。

22 利用显示页和编辑页交替变化

将当前显示页和编辑页分开(用setvisualpage()和setactivepage()函数),在编辑页上

画好图形后,立即令该页变为显示页,然后在上次显示页上进行画图,画好后,再交换,如此反复,在观察者的视觉上,就出现了动画的效果。

23 利用画面存储再重放的方法

如同制作幻灯片一样,将整个动画过程变成一个个片断,然后存储到显示缓冲区内,当把它们按顺序重放到屏幕上时,就出现了动画效果。

24 直接对图像动态存储器进行 *** 作

利用显示适配器上控制图像显示的各种寄存器和图像存储器VRAM,对其进行直接 *** 作和控制,从而可以高效快速的实现动画效果。

 上述4种方法均可以实现动画效果,但其 *** 作比较复杂,且在程序中要对图像不断进行存取 *** 作,这需要耗费大量内存资源。下面的擦除法动画设计可以解决上述问题。

3. 擦除法动画设计原理

擦除法动画设计方法在很多的动画制作工具(如flash)中大量使用,但在程序设计中却鲜有人用。它的设计原理是:利用同色原理,当图形色与背景色相同时人眼不能感知。在动画设计中,当在一个位置画了一张图像时,使图像色与背景色相异,然后再到另一个位置画一张图像并使图像色与背景色也相异,此时将先前画的图像在原位置再画一张,并使图像色与背景色相同,这样人眼只能看到新画的一张图像而看不到先前画的图像,从而先前画的图像感觉被擦除了。这样连续画多张图像并在每画一张新的图像,将原来的图像擦除,从而在观察者来看就实现了动画的效果。

4. 擦除法的动画设计实现

下面以一个上下翻滚的圆作为一个例子来讲解在TurboC20开发环境下用C语言来实现动画的设计过程,其中动画设计的方法是擦除法。具体的实现步骤如下:

41 TC的图形系统的初始化

TurboC20为用户提供了一个功能强大的画图软件库,它包括图形库文件(graphicslib),图形头文件(graphicsh)和许多图形显示器的驱动程序。在TurboC20开始进行图形设计前必须对之进行初始化,使系统知道要用什么类型的图形显示器的驱动程序,采用什么模式的图形方式,以及该适配器驱动程序的寻找路径名。这个初始化的函数是initgraph()。在本程序中的初始化如下:

gdriver=DETECT;

initgraph(&gdriver, &gmode, "");//图形显示器、显示模式、路径自动检测

42 画图

setcolor(LIGHTRED);//设置圆的线条颜色为淡红色

setlinestyle(0,0,1);//设置线条为形状为实线,线宽为一点宽

setfillstyle(1, 10);//设置圆的填充式样为以实填充,填充色为淡绿色

circle(300, 10+10y,15);//画一个圆心在坐标(300,10+10y),半径为15的圆

这个地方我们需要画一个圆(用draw()函数实现),并且设置圆的圆周线条的颜色(用setcolor()函数),设置线条类型(用setlinestyle()函数),设置圆的填充色和填充模式(用setfillstyle()函数),设置圆的填充色(用floodfill()),最后是画圆(用circle()函数)。在本程序(draw()函数)中的代码如下:

floodfill(300, 10+10y, 12);//给圆填充如上stfillstyle中的淡绿色

为了实现擦除 *** 作需在同一个位置再画一个圆(用clear()函数实现),该 *** 作只需将上面的画圆函数(draw()函数)改动两个设置即可,如下示:

setcolor(BLUE);//设置圆的线条颜色为蓝色(与背景色相同)

setfillstyle(1, 10);//设置圆的填充式样为以实填充,填充色为淡绿色

43 动画实现

本部分是核心部分,先设置背景色为蓝色(用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);//延迟01秒

clear(i);//擦除已画的圆

}

for(i=30;i>j;i--)//实现动画从下向上闪烁

{ draw(i);//画圆

delay(100000);//延迟01秒

clear(i);//擦除已画的圆

}

}

动画实现后的最后效果图如下示。

44 关闭图形系统

当图形实现结束后需要关闭图形系统,利用函数closegraph()即可实现。

5. 总结

 擦除法动画设计原理易于理解,便于 *** 作。并且它的程序运行所需内存空间也比上述四种常用方法要少得多,因为它在程序执行过程中不需将图形存入内存再从内存调出,这节省了大量的内存空间。如果程序运行在内存紧张的环境中,如嵌入式系统中,这种方法尤其适用

三个问题:

1 你的flag没有初始化。

2 while(flag!=1){}中的代码有些问题。有几处应加上{ },给你改了一下:

while(flag!=1)

{

if(a5==0)

qianjin();

else

{ if(a4==0)

zuozhuan();

else

{ if(a6==0)

youzhuan();

else

flag=1;

}

}

}

3 为什么不在最外层设置大循环?

1、首先,打开vc60,建立程序编写页面,建立C语言环境,声明两个整数型变量。

2、随后,打出新的前三行,由于规律不明显,就用printf语句手动输入,要仔细观察模版。

3、观察可得,中间三行相同,就可以使用for循环,循环三行,每行的个数要仔细计算,模版很重要。

4、随后的七列逐渐减少,同样使用for循环进行循环七列递减的运算,这样还剩下最后一列。

5、最后一列,只有一个符号,相同于前三行,就是用printf语句直接编写最后一行。

6、这样就完成了程序的编写,这样就可以进行编译了,可以看到编译结果0错误,0警告,就可以运行程序了。

7、运行成功,看到程序运行框中出现了清晰的心图形,成功编程。

根据小车运行过程编写。

C语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX *** 作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。C语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

以上就是关于求一简单的C语言动画程序。全部的内容,包括:求一简单的C语言动画程序。、c语言动画编程、如何利用C语言实现动画等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10115405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存