c語言動畫
『壹』 c語言簡單動畫
自由落體運動:
#include <math.h>
#include <stdio.h>
#include <graphics.h>
#include <dos.h>
#define pi 3.1415926535
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=3.0;
double xo=100.0,yo=200.0,a1=30.0,t1=pi;
double xc=xo+m*a1,yc=yo;
double a2=8.0,a3,a4=25.0,a5=30.0,a6=20.0,a7=35.0;
double t2,t3,t4,t5,t6,t7;
double xo1=xo+m*150,yo1=yo;
double xc1=xo1-m*a1,yc1=yo1;
double i,j,k;
double l1;
double n=116.1,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<360.0;i+=1.0)
{
t2=i;
a3=ca3mm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));
t3=ca3fm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));
a4=a3;
t4=t3;
t5=ca5fm2(a6,a5,a4,t4,0);
t6=ca6fm2(a4,t4,a5,t5);
t7=t6-90.0;
l1=xc1-xc-2*m*a7*cos(t7*pi/180);
nt=(asin(l1/2/(n/2))*180/pi)-90.0;
drawline(xo,yo,a2,t2,m,LIGHTGRAY);
drawline(xo+m*a2*cos(t2*pi/180),yo-m*a2*sin(t2*pi/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+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((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+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN);
drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,DARKGRAY);
}
delay(300);
drawline(xo,yo,a2,t2,m,LIGHTGRAY);
drawline(xo+m*a2*cos(t2*pi/180.0),yo-m*a2*sin(t2*pi/180.0),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+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((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+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN);
drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,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+m*mo*cos(fujiao*pi/180));
y=(yo-m*mo*sin(fujiao*pi/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-m*mo*cos(fujiao*pi/180));
y=(yo-m*mo*sin(fujiao*pi/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-3.0,y+3.0,x-15.0,y+20.0);
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(m1*m1 + m2*m2);
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 - a5m*a5m) / (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,"");
}
『貳』 c語言字元動畫源代碼
#include<stdio.h>
#include<windows.h>
intmain()
{
for(;;)
{
printf("\");
Sleep(500);
printf("/");
Sleep(500);
printf("-");
Sleep(500);
}
return0;
}
莫非是類似這種?其實有了這個思路,自己利用循環可以做很多
『叄』 用C語言製作動畫
flash製作動畫:
打開Flash,點擊【文件】→【新建】,在打開的「新建」窗口中選擇「Flash文件(ActiveScript 3.0)「,然後點擊」確定「創建空白文檔。
點擊【插入】→【新建元件】,在打開的」新建元件「窗口中,將名稱設置為」運動的小人「,勾選」影片剪輯「,然後點擊」確定「按鈕。
點擊【文件】→【導入】→【導入到庫】,然後在打開的」導入到庫「窗口中,選擇事先准備好的小人走動姿勢圖片,全部選擇並點擊」打開「按鈕,導入到庫。
把庫中的「Result0」拖動到場景中。
點擊「時間軸」上的「新建圖層」按鈕,創建圖層2,然後在圖層2的第5幀處,點擊【插入】→【關鍵幀】,把庫中的「Result1」拖動到場景中。
利用同樣的原理,將」Result2「、 」Result3「和」Result4「分別到圖層3、圖層4和圖層5中,對應的幀分別為10、15和20處。
最後調整各個圖層圖像的延續時間。至此,運動的小人影片剪輯製作完成。
切換至主場景中,使主場景處於活動狀態,點擊」屬性「面板中的」大小「按鈕,將場景的大小設置為」800*300「,同時將背景色設置為」黑色「點擊」確定「按鈕。
從庫中將」運動的小人「影片剪輯拖動到場景左邊外邊。
然後在」時間軸「第30幀處,點擊【插入】→【時間軸】→【關鍵幀】,在30幀處插入關鍵幀,然後將小人從場景的左側外面拖動到場景右側外面。至此,整個動畫設置完成。
在1到30幀之間滑鼠右擊,選擇」創建補間動畫「。
最後按下鍵盤組合鍵」CTRL+Enter「進行測試。如果感覺小人運動不規律,可適當將1至30幀的距離調整的稍微大一些,直到滿意為止。
『肆』 求一個c語言字元動畫代碼
我這里有一個做成流星雨樣子的,應該符合你的要求
這個網站注冊後每天可以免費下一個,你可以先看看,有詳細的代碼和文檔
請給最佳答案謝謝
網頁鏈接
『伍』 如何利用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語言動畫編程
看啊
一群星星在追老鼠!!
#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語言實現動畫
基於擦除法的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. 總結
擦除法動畫設計原理易於理解,便於操作。並且它的程序運行所需內存空間也比上述四種常用方法要少得多,因為它在程序執行過程中不需將圖形存入內存再從內存調出,這節省了大量的內存空間。如果程序運行在內存緊張的環境中,如嵌入式系統中,這種方法尤其適用
『捌』 用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"
{
WINBASEAPI HWND WINAPI GetConsoleWindow();
}
int main(int argc, char *argv[]) //主線程運行結束,輔助線程也結束。
{
HWND hwnd;
HDC hdc;
printf("There are some words in console window!\n在控制台窗口中繪圖!\n");
system("Color 3D");
hwnd = GetConsoleWindow();
hdc = GetDC(hwnd);
MoveToEx(hdc,100,100,NULL);
LineTo(hdc, 200, 300);
Rectangle(hdc, 10, 30, 300, 50);
TextOut(hdc, 10, 10, _TEXT("Hello World\nYesNoConcel!"), 20);
ReleaseDC(hwnd, hdc);
getch();
printf("After drawing!\n");
return 0;
}
這個好像是只有用c++編譯器,具體我也忘了,如果.c後綴不行就用cpp後綴,基本語法c和c+差不多
『玖』 同學,怎麼用C語言製作簡單的動畫啊
因為C的圖形處理功能太一般,不便於創作大型動畫。製作動畫用flash。
flash製作動畫:
打開Flash,點擊【文件】→【新建】,在打開的「新建」窗口中選擇「Flash文件(ActiveScript 3.0)「,然後點擊」確定「創建空白文檔。
在圖層1 的第一幀,把庫中的「Result0」拖動到場景中。
點擊「時間軸」上的「新建圖層」按鈕,創建圖層2,然後在圖層2的第5幀處,點擊【插入】→【關鍵幀】,把庫中的「Result1」拖動到場景中。
利用同樣的原理,將」Result2「、 」Result3「和」Result4「分別到圖層3、圖層4和圖層5中,對應的幀分別為10、15和20處。
最後調整各個圖層圖像的延續時間。至此,運動的小人影片剪輯製作完成。
切換至主場景中,使主場景處於活動狀態,點擊」屬性「面板中的」大小「按鈕,將場景的大小設置為」800*300「,同時將背景色設置為」黑色「點擊」確定「按鈕。
從庫中將」運動的小人「影片剪輯拖動到場景左邊外邊。
然後在」時間軸「第30幀處,點擊【插入】→【時間軸】→【關鍵幀】,在30幀處插入關鍵幀,然後將小人從場景的左側外面拖動到場景右側外面。至此,整個動畫設置完成。
在1到30幀之間滑鼠右擊,選擇」創建補間動畫「。
最後按下鍵盤組合鍵」CTRL+Enter「進行測試。如果感覺小人運動不規律,可適當將1至30幀的距離調整的稍微大一些,直到滿意為止。