找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
.COM/.NET/.ORG 国际域名注册全功能虚拟主机/免备案虚拟主机
查看: 1636|回复: 4

TurboC2.0-;gt;图形函数库

[复制链接]

9

主题

9

回帖

3134

积分

论坛元老

积分
3134
发表于 2003-12-13 21:17:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/**********************图形函数库************************
设计: 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);

}



[完]
回复

使用道具 举报

281

主题

3228

回帖

55万

积分

管理员

积分
551869
发表于 2003-12-13 21:46:04 | 显示全部楼层
[emb6]
网路游侠 www.youxia.org
回复 支持 反对

使用道具 举报

77

主题

701

回帖

1万

积分

论坛元老

积分
16048
发表于 2003-12-15 16:31:05 | 显示全部楼层
[emb3]不懂啊!
回复 支持 反对

使用道具 举报

9

主题

9

回帖

3134

积分

论坛元老

积分
3134
 楼主| 发表于 2003-12-20 16:47:19 | 显示全部楼层
不懂

问我呀!~!·~!~!

那个地方不懂

[emb5][emb5][emb5][emb2]
回复 支持 反对

使用道具 举报

9

主题

9

回帖

3134

积分

论坛元老

积分
3134
 楼主| 发表于 2003-12-20 16:52:34 | 显示全部楼层
[emb7][emb7][emb7]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|西京校友网 ( 陕ICP备11003551号-5 )

GMT+8, 2025-5-8 23:39 , Processed in 0.025503 second(s), 8 queries , MemCache On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表