|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/**********************图形函数库************************
设计: ahu
主页: web.1816.net/~program
*********************************************************/
#include <graphics.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
#define PI 3.1415926
#define BEGIN_ setactivepage(1); /*输出到不可见活动页*/
#define END_ setactivepage(0); /*输出到可见活动页*/
#define end() closegraph() /*退出图形模式*/
int init(void); /*图形模式初始化*/
int init_in(void); /*图形模式初始化(需连接graphics.lib后使用)*/
void fivestar(int x0,int y0,int r,int color); /*五角星*/
void beyang(int nump,int size,int x[],int y[]); /*通过已知点的曲线*/
void tree(int x,int y,int size,int color); /*树*/
int save(int x1,int y1,int x2,int y2,char *filename); /*图形保存为文件(保存面积不要太大)*/
char *save_to_mem(int x1,int y1,int x2,int y2); /*图形保存到内存(保存面积不要太大)*/
int load(int x,int y,char *filename,int mode); /*图形文件的加载*/
/*请不要调用以下函数*/
#define beyang_f(t,x1,x2,x3) ((2*t*t-3*t+1)*x1+(4*t-4*t*t)*x2+(2*t*t-t)*x3)
int tree_f(int num,int x,int y,float size,float a);
/*请不要调用以上函数*/
void main()
{
/*简单实例*/
int ierror;
ierror=init();
if(ierror!=0)
{
printf("Graphic error:%s\n",grapherrormsg(ierror));
getch();
}
setbkcolor(WHITE);
setcolor(BLUE);
fivestar(500,100,24,BLUE);
tree(200,450,4,GREEN);
getch();
end();
}
int init(void)
{
int i,gdriver=DETECT,gmode,ierror;
initgraph(&gdriver,&gmode,"");
ierror=graphresult();
if(ierror!=0)
{
/*printf("Graphic error:%s\n",grapherrormsg(ierror));*/
return(ierror);
}
else return(0);
}
/*本程序实例要运行,在相同路径下必须有文件GRAPHICS.LIB,否者初始化会失败。
为了在没有GRAPHICS.LIB的情况下程序能运行,编写了以下函数。
但是它必须在从新连接graphics.lib后才能使用。*/
int init_in(void)
{
int i,gdriver=DETECT,gmode,ierror;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"");
ierror=graphresult();
if(ierror!=0)
{
/*printf("Graphic error:%s\n",grapherrormsg(ierror));*/
return(ierror);
}
else return(0);
}
void fivestar(int x0,int y0,int r,int color)
{
int i,rr;
float theta1=0.314156,theta2=0.942478;
int x[11],y[11],xy[22];
rr=r*0.38196;
for (i=0;i<5;i++)
{
x[2*i]=x0+r*cos(theta1);
y[2*i]=y0-r*sin(theta1);
x[2*i+1]=x0+rr*cos(theta2);
y[2*i+1]=y0-rr*sin(theta2);
theta1+=1.2566;
theta2+=1.2566;
}
x[10]=x[0];
y[10]=y[0];
for(i=0;i<=10;i++)
{
xy[2*i]=x;
xy[2*i+1]=y;
}
setfillstyle(1,color);
fillpoly(11,xy);
}
/*本函数用于绘制任意不规则曲线,它将已知点光滑连接起来,其一阶导数连续。
为了实现该功能,在数学上采用了的一些技巧。此方法为本人原创。*/
void beyang(int nump,int size,int x[],int y[])
{
int i,j,xx,yy;
float d,t,t1,t2,tt;
d=1.0/nump;
if(size==2) line(x[0],y[0],x[1],y[1]);
for(i=0;i<size-2;i++)
{
if(i==0)
{
for(j=0;j<nump/2;j++)
{
t=j*d;
xx=(int)(0.5+beyang_f(t,x,x[i+1],x[i+2]));
yy=(int)(0.5+beyang_f(t,y,y[i+1],y[i+2]));
if(j==0) moveto(xx,yy);
else lineto(xx,yy);
}
}
if(i<size-3)
{
for(j=nump/2;j<=nump;j++)
{
t1=j*d;
t2=t1-0.5;
tt=t2*PI;
xx=(int)(0.5+beyang_f(t1,x,x[i+1],x[i+2])*cos(tt)*cos(tt)+
beyang_f(t2,x[i+1],x[i+2],x[i+3])*sin(tt)*sin(tt));
yy=(int)(0.5+beyang_f(t1,y,y[i+1],y[i+2])*cos(tt)*cos(tt)+
beyang_f(t2,y[i+1],y[i+2],y[i+3])*sin(tt)*sin(tt));
lineto(xx,yy);
}
}
else
{
for(j=nump/2;j<=nump;j++)
{
t=j*d;
xx=(int)(0.5+beyang_f(t,x,x[i+1],x[i+2]));
yy=(int)(0.5+beyang_f(t,y,y[i+1],y[i+2]));
lineto(xx,yy);
}
}
}
}
/*一个递归调用的很好例子*/
int tree_f(int num,int x,int y,float size,float a)
{
int endx,endy;
if(num==0) return(1);
endx=x+(int)(size*cos(a));
endy=y+(int)(size*sin(a));
line(x,y,endx,endy);
tree_f(num-1,endx,endy,size*0.60,a+0.624);
tree_f(num-1,endx,endy,size*0.85,a+0.03);
tree_f(num-1,endx,endy,size*0.65,a-0.6);
}
void tree(int x,int y,int size,int color)
{
setcolor(color);
tree_f(10,x,y,(float)(size*10),-1.56);
}
/*将指定区域的图形保存到文件,实现方式很巧妙,
其特点是代码最少,效率最高。此方法为本人原创。*/
int save(int x1,int y1,int x2,int y2,char *filename)
{
FILE *fp;
long size;
char *w;
if((fp=fopen(filename,"wb"))==NULL) return(1);
size=imagesize(x1,y1,x2,y2);
if((w=(char*)malloc(size))==NULL) return(2);
getimage(x1,y1,x2,y2,w);
fwrite(&size,sizeof(long),1,fp);
fwrite(w,size,1,fp);
fclose(fp);
free(w);
return(0);
}
/*与保存到文件很相似,只是直接保存到内存中。
其主要目的是与输出到不可见活动页共同用于动画*/
char *save_to_mem(int x1,int y1,int x2,int y2)
{
long size;
char *image;
size=imagesize(x1,y1,x2,y2);
image=(char*)malloc(size);
getimage(x1,y1,x2,y2,image);
return(image);
}
int load(int x,int y,char *filename,int mode)
{
FILE *fp;
long size;
char *w;
if((fp=fopen(filename,"rb"))==NULL) return(1);
fread(&size,sizeof(long),1,fp);
if((w=(char*)malloc(size))==NULL) return(2);
fread(w,size,1,fp);
fclose(fp);
putimage(x,y,w,mode);
free(w);
return(0);
}
[完] |
|