图形旋转的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<stdlib.h>
#include<stdio.h>
#include<graphics.h>
#include<alloc.h>
#include<ctype.h>

int 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(cleancut<0) return;
setactivepage(LOADPAGE);
setvisualpage(ENHANCEPAGE);
for(x=minx;x<maxx;x++) {
for(y=miny;y<maxy;y++) {
if(getpixel(x,y)!=0) num=-1;
else num=0;
for(j=-1;j<2;j++) {
for(i=-1;i<2;i++) {
if(getpixel(x+i,y+j)!=0) num++;
}
}
if(num>cleancut) {
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;i<20;i++)
lineto(random(100)+minx,random(100)+miny);
for(i=0;i<10;i++)
fillellipse(random(50)+25+minx,random(50)+25+miny,random(25),random(25));
}

main()
{
char fname[50];
int flag=0;

load_convolution_matrix("matrix.dat");
printf(".CUT file (1) or test image (0)?");
scanf("%d",&flag);
flag= flag? 1:0;
if(flag) {
fflush(stdin);
printf("filename to process:");
gets(fname);
}

printf("Delete pixels with x or fewer neighbors. x=");
scanf("%d",&cleancut);
if(cleancut>8) 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<0 || c>=palette.size) return 0;
newpal.colors[c]= palette.colors[c]-newpal.colors[c];
setpalette(c,newpal.colors[c]);
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;i<cmy;i++) lines[i]=(char *)malloc(sizeof(char)*(maxx-minx+cmx+1));
setactivepage(LOADPAGE);
for(j=-cmy/2;j<cmy/2;j++) {
for(i=minx-cmx/2;i<(maxx+cmx/2+1);i++) {
lines[j+midy][i+offset]=getpixel(i,j+miny);
}
}
colmax=getmaxcolor();
for(j=miny;j<maxy;j++) {
setactivepage(LOADPAGE);
for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;k<nval;k++)
lines[end][k+offset]=getpixel(k,i);
for(i=minx;i<maxx;i++) {
/* Load & multiply neighbors into matrix */
setactivepage(LOADPAGE);
vx=vmat; vy=vmat+1; c=cmat; nval=0;
for(k=0;k<cmnum;k++) {
if(*c) nval+= lines[(*vy)+midy][i+(*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(nval<0) nval=0;
if(nval>colmax) nval=colmax;
/* Place new pixel value */
setactivepage(ENHANCEPAGE);
putpixel(i,j,nval);
}
if(kbhit()) { getch(); break; }
/* rotate line pointers */
temp=lines[0];
for(i=1;i<cmy;i++) lines[i-1]=lines[i];
lines[end]=temp;
}
for(i=0;i<cmy;i++) {
if(lines[i]!=NULL) free(lines[i]);
}
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;j<jm;j++) {
for(i=il;i<im;i++) {
*t++=i; *t++=j;
}
}
}

int load_convolution_matrix(char *fname)
{
/* Layout of matrix file:
#x #y
x0y0 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;j<jm;j++) {
for(i=0;i<im;i++) {
if( fscanf(mf,"%d",t++)!=1 ) {
printf("Unable to read matrix.\n");
abort();
}
}
}
fclose(mf);
build_offset_vectors();
}

int load_cut(char *fname)
{
static unsigned char st[3000];
char *sp=st,*spend;
int stp=0;
int width,height;
FILE *fp;
int x,y,xl,yl;
int i,n,len,d,j;

fp=fopen(fname,"rb");
width=getw(fp); height=getw(fp);
xl=cmx; yl=cmy;
minx=xl; miny=yl;
maxx=xl+width; maxy=yl+height;
if(maxy>(getmaxy()-cmy)) {
maxy=getmaxy()-cmy;
height=maxy-yl;
}
getw(fp);
y=yl-1;
for(sp=st,n=0;n<height;n++) {
stp=getw(fp);
for(sp=st,spend=st+stp;sp<spend;) *sp++=getc(fp);
sp=st; spend=sp+stp; x=xl; y++;
while(sp<spend) {
if(*((unsigned char *)sp)>0x80) {
len=(*sp++) & 0x7f;
if(!(*sp)) { x+=len; continue; }
setcolor(*sp++);
moveto(x,y);
linerel(len,0);
x+=len;
continue;
} else {
len=*sp++;
for(j=0;j<len;j++) putpixel(x++,y,*sp++);
continue;
}
}
}
fclose(fp);
}

posted on 2006-03-02 22:03 Aween's Blog 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/aween/archive/2006/03/02/341573.html

图形旋转的C语言源程序相关推荐

  1. c语言画图 钟表模拟程序,图形模拟时钟C语言课程设计

    图形模拟时钟C语言课程设计 更新时间:2017/2/2 9:03:00  浏览量:640  手机版 学号13082101182014-2015学年第二学期 <高级语言程序设计> 课程设计报 ...

  2. 一种简单的图形旋转算法

    图形旋转好玩又有实用性, 这里介绍一种简单的图形旋转算法. 具体步骤如下: 1. 首先将原图和旋转图的坐标原点都变换到图形的中心位置处. 2. 历遍旋转图形中的每一个pixel, 将pixel的坐标( ...

  3. 编写一个程序,实现将c语言源程序中的注释全部删除

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p257 习题8 6.编写一个程序,实现将c语言源程序中的注释全部删除 #include<stdl ...

  4. 串口调试助手c语言程序,串口调试助手C语言源程序

    串口调试助手C语言源程序 串口调试助手源程序 及编程详细过程 作者:龚建伟 2001.6.20 可以任意转载,但必须注明作者和说明来自http://doc.xuehai.net,不得作为商用 目次: ...

  5. c语言源程序要求每行只能书写一条语句,C语言章节习题集(全)

    可编辑 C语言程序设计 第一.二章 单项选择题 1. 将汇编语言编写的程序翻译成目标程序的程序是() A)解释 B)编译 C)汇编 D)目标 2. 不属于面向机器语言的是() A)符号语言 B)二进制 ...

  6. 配合理lcd的c语言小游戏,C语言源程序LCD.doc

    C语言源程序LCD C语言源程序 //******** 小波电子工作室 All rights reserved******//******** 个人主页:/niejinbo ** //******** ...

  7. c语言源程序结构是怎样的?

    一个C语言源程序至少一个有main函数,定义函数必须指定 4 个元素:返回类型.函数名.圆括号内的形参表(可能为空)和函数体.源程序的结构特点: 1.一个C语言源程序可以由一个或多个源文件组成. 2. ...

  8. 计算机图形学图形旋转_计算机图形学翻译

    计算机图形学图形旋转 计算机图形学| 翻译 (Computer Graphics | Translations) Transformation techniques mean to modify th ...

  9. 计算机图形学图形旋转_计算机图形学中的平板显示

    计算机图形学图形旋转 平板显示器 (Flat Panel Display) It is generally known as FPD, the flat-panel display is such a ...

最新文章

  1. 陕西信息计算机学校,陕西计算机信息专业学校
  2. 听说你想去大厂看妹子,带你看看字节跳动技术中台后端面试长啥样?
  3. Spread for WinRT 7新功能使用指南
  4. CF1497E2 Square-free division (hard version)
  5. 高度可定制化的方案_如何开发高度可定制的产品
  6. 最小值c语言 循环,C语言循环结构 -C语言求全班同学身高的最大值和最小值
  7. 上传jar到本地仓库
  8. append从一个添加到另一_小米的另一妙用,制作小米锅巴,吃着嘎嘣脆,一口一个香得很...
  9. mysql5.6初级使用方法学习第三天
  10. git reset/git checkout./撤销操作
  11. 【Android】科大讯飞——语音识别
  12. pgadmin4下载
  13. Lowest Common Ancestor
  14. 官宣一一塔米狗企业并购图谱功能上线啦
  15. 【MySQL基本查询】Create(创建), Retrieve(读取),Update(更新),Delete(删除)
  16. Autojs 微信添加好友脚本
  17. ISTQB基础级考试资料汇总
  18. 苹果开发者账号和证书那些事
  19. 盘点程序员的花式赚外快的骚操作
  20. 若依Ruoyi (java) 框架部署

热门文章

  1. 关于equals与hashcode的重写
  2. System.Transactions深入了解
  3. EMC助力广东福彩中心容灾系统建设
  4. React基础——快速搭建开发环境
  5. 谁来担责!无人驾驶汽车还需要汽车保险吗?
  6. [04] 前端构建工具区别
  7. 18-python基础7-闭包函数和装饰器
  8. Laravel深入学习5 - 应用架构
  9. 开源中国源码学习笔记
  10. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用