/* * lpsclinv.c: Invert Log Polar Mapping. * * May.15,'94. Oshiro. * Oct. 6,'94. Oshiro. 入力ファイルの形式を ppm にした. */ static char rcsid[]="$Id: lpsclinv.c,v 1.1 1995/05/10 18:19:27 oshiro Exp oshiro $"; #include #include #include #include #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 int main(int argc, char **argv) { FILE *fp; int width, height; int last_width, last_height; long x, y; int uwidth, vwidth; int img_type, depth; long u, v; long len; double r, logmaxr; double th; char *data; char *fname; if (argc != 3 && argc != 4 ) { fprintf(stderr, "Usage: lpsclinv width height [infile]\n"); exit(EXIT_FAILURE); } width =atoi(argv[1]); height=atoi(argv[2]); if (argc==4) { fname=argv[3]; fp=OpenAndCheckPPMFile(fname, &img_type, &uwidth, &vwidth, &depth); if (fp==NULL) { fprintf(stderr, "lpsclinv: Incorrect ppm file (%s).\n", fname); exit(EXIT_FAILURE); } } else { fp=stdin; if (CheckPPMFile(fp, &img_type, &uwidth, &vwidth, &depth)!=0) { fprintf(stderr, "lpsclinv: Incorrect ppm file (stdin).\n"); exit(EXIT_FAILURE); } } data=malloc(sizeof(char)*(long)vwidth*uwidth*3); if (data == NULL) { fprintf(stderr, "Fatal: Not enough memory.\n"); exit(EXIT_FAILURE); } len=fread(data, sizeof(char), (long)vwidth*uwidth*3, fp); fclose(fp); if (len < vwidth*uwidth) { fprintf(stderr, "Warning: Not enough data.\n"); } printf("P6\n%d %d\n255\n", width, height); /* logmaxr=log(sqrt(width/2*width/2 + height/2*height/2));*/ /* 上の式だと中心部が拡大されて変換される.*/ /* logmaxr=log(((widthheight)? width:height)/2); /* 上の式だと元画像と同じ大きさ(??チェックするべし!)で */ /* 周辺部が円になって変換される.*/ last_height=height/2+(height%2); last_width =width /2+(width %2); for (y=height/2; y>-last_height; y--) { for (x=-width/2; xuwidth || v<0 || v>vwidth) { putchar(0); putchar(0); putchar(0); continue; } putchar(data[v*(uwidth*3) + u*3 ]); putchar(data[v*(uwidth*3) + u*3+1]); putchar(data[v*(uwidth*3) + u*3+2]); } /* fprintf(stderr, "\n"); */ } return(EXIT_SUCCESS); }