图形旋转的C语言源程序.doc_第1页
图形旋转的C语言源程序.doc_第2页
图形旋转的C语言源程序.doc_第3页
图形旋转的C语言源程序.doc_第4页
图形旋转的C语言源程序.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图形旋转的C语言源程序/*/* CONVOLVE.C - Turbo C 2.0 implementation of image convolution */* - by Wesley G. Faler. All code is as is. There */* is NO copyright. Use this code as you will, and if you make */* money at it, good for you. */*/#include#include#include#include#includeint load_cut(char *fname);int load_convolution_matrix(char *fname);int convolve_image(void);int swap_pictures(void);int minx,maxx,miny,maxy;int LOADPAGE=0;int ENHANCEPAGE=1;int *cmat, *pmat, *vmat;int cmx,cmy,cmnum;struct palettetype palette,newpal;int driver,mode;int cleancut=-1;int init_graphics(void)driver=DETECT; mode=0;detectgraph(&driver,&mode);if(driver=VGA) mode=VGAMED;initgraph(&driver,&mode,);getpalette(&palette);getpalette(&newpal);int cleanup_image(void)int i,j,num,x,y,k;if(cleancut0) return;setactivepage(LOADPAGE);setvisualpage(ENHANCEPAGE);for(x=minx;xmaxx;x+) for(y=miny;ymaxy;y+) if(getpixel(x,y)!=0) num=-1;else num=0;for(j=-1;j2;j+) for(i=-1;icleancut) k=getpixel(x,y);setactivepage(ENHANCEPAGE);putpixel(x,y,k);setactivepage(LOADPAGE);k=ENHANCEPAGE; ENHANCEPAGE=LOADPAGE; LOADPAGE=k;void show_test_image(void)int i;minx=cmx; miny=cmy;maxx=100+minx; maxy=100+miny;setcolor(1);moveto(minx,miny);randomize();for(i=0;i20;i+)lineto(random(100)+minx,random(100)+miny);for(i=0;i8) cleancut=8;init_graphics();setactivepage(1); cleardevice();setactivepage(0); cleardevice();setactivepage(LOADPAGE); setvisualpage(LOADPAGE);if(flag) load_cut(fname);else show_test_image();cleanup_image();setvisualpage(ENHANCEPAGE);convolve_image();swap_pictures();restorecrtmode();int toggle_colors(char c)c=tolower(c);c=c-a;if(c=palette.size) return 0;newpal.colorsc= palette.colorsc-newpal.colorsc;setpalette(c,newpal.colorsc);return 1;int swap_pictures(void)int mode=0;char a;setvisualpage(LOADPAGE);for(;) a=getch();if(a=27) return;if(toggle_colors(a) continue;if(mode=0) setvisualpage(ENHANCEPAGE);if(mode=1) setvisualpage(LOADPAGE);mode=1-mode;int convolve_image(void)int i,j,k,nval;int *vx, *vy, *c;int colmax,offset,end,midy;char *lines=NULL;char *temp=NULL;offset=-minx+(cmx/2);end=cmy-1; midy=cmy/2;lines=(char *)malloc(cmy*sizeof(char *);for(i=0;icmy;i+) linesi=(char *)malloc(sizeof(char)*(maxx-minx+cmx+1);setactivepage(LOADPAGE);for(j=-cmy/2;jcmy/2;j+) for(i=minx-cmx/2;i(maxx+cmx/2+1);i+) linesj+midyi+offset=getpixel(i,j+miny);colmax=getmaxcolor();for(j=miny;jmaxy;j+) setactivepage(LOADPAGE);for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;knval;k+)linesendk+offset=getpixel(k,i);for(i=minx;imaxx;i+) /* Load & multiply neighbors into matrix */setactivepage(LOADPAGE);vx=vmat; vy=vmat+1; c=cmat; nval=0;for(k=0;kcmnum;k+) if(*c) nval+= lines(*vy)+midyi+(*vx)+offset*(*c);/* if(*c) nval+= getpixel(i+(*vx),j+(*vy) * (*c); */c+;vx+=2; vy+=2;/* Cut off values too high or too low */if(nvalcolmax) nval=colmax;/* Place new pixel value */setactivepage(ENHANCEPAGE);putpixel(i,j,nval);if(kbhit() getch(); break; /* rotate line pointers */temp=lines0;for(i=1;icmy;i+) linesi-1=linesi;linesend=temp;for(i=0;icmy;i+) if(linesi!=NULL) free(linesi);if(lines!=NULL) free(lines);return;int build_offset_vectors(void)int *t;int il,im,jl,jm,i,j;il=-cmx/2; im=cmx+il;jl=-cmy/2; jm=cmy+jl;t=vmat;for(j=jl;jjm;j+) for(i=il;iim;i+) *t+=i; *t+=j;int load_convolution_matrix(char *fname)/* Layout of matrix file:#x #yx0y0 x1y0 . xny1. . . .x0ym x1ym . xnym*/FILE *mf;int *t;int i,j,im,jm;if( (mf=fopen(fname,rt)=NULL ) printf(Cannot load matrix file.n);abort();fscanf(mf,%d%d,&im,&jm);if( (im&1)=0 | (jm&1)=0 ) printf(Convolution matrix MUST have a center point.n);abort();if( (cmat=(int *)calloc(im*jm,sizeof(int)=NULL ) printf(Unable to calloc convolution matrix.n);abort();if( (vmat=(int *)calloc(2*im*jm,sizeof(int)=NULL ) printf(Unable to calloc offset vector matrix.n);abort();cmx=im; cmy=jm; cmnum=im*jm;t=cmat;for(j=0;jjm;j+) for(i=0;i(getmaxy()-cmy) maxy=getmaxy()-cmy;height=maxy-yl;getw(fp);y=yl-1;for(sp=st,n=0;nheight;n+) stp=getw(fp);for(sp=st,spend=st+stp;spspend;) *sp+=getc(fp);sp=st; spend

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论