📄 grad1.c
字号:
fxbuf[succline][0],1,z_factor);
}
/* do rest of pixels inside line */
for(i=1;i<255;i++)
if(fxbuf[line][i]==256)lineg[i]=lined[i]=0;
else{
if (dispmode & 1)
lined[i]=255-fxbuf[line][i]; /*distance shade */
if (dispmode & 2) {
y1 = fxbuf[line][i-1];
y2 = fxbuf[line][i+1];
factor = 2;
if (fabs(y1 - y2) > GRAD_THRESHOLD) {
if (fabs(y1 - fxbuf[line][i]) < GRAD_THRESHOLD/2.) {
y2 = fxbuf[line][i];
factor = 1;
}
else if (fabs(fxbuf[line][i] - y2) < GRAD_THRESHOLD/2.) {
y1 = fxbuf[line][i];
factor = 1;
}
}
z1 = fxbuf[prevline][i];
z2 = fxbuf[succline][i];
if (z_factor == 2 && fabs(z1 - z2) > GRAD_THRESHOLD) {
if (fabs(z1 - fxbuf[line][i]) < GRAD_THRESHOLD/2.) {
z2 = fxbuf[line][i];
z_factor = 1;
}
else if (fabs(fxbuf[line][i] - z2) < GRAD_THRESHOLD/2.) {
z1 = fxbuf[line][i];
z_factor = 1;
}
}
/* lineg[i]=grad(fxbuf[line][i-1],fxbuf[line][i+1],fxbuf[prevline][i],
fxbuf[succline][i],2,z_factor); */
lineg[i]=grad(y1, y2, z1, z2, factor, z_factor);
}
}
/* do last pixel in line */
if(fxbuf[line][255]==256) lineg[255]=lined[255]=0;
else{
if (dispmode & 1)
lined[255]=255-fxbuf[line][255]; /*distance shade */
if (dispmode & 2)
lineg[255]=grad(fxbuf[line][255],fxbuf[line][254],
fxbuf[prevline][255],
fxbuf[succline][255],1,z_factor);
}
if (dispmode & 2)
fwrite(lineg,1,256,fg); /* write to output files */
if (dispmode & 1)
fwrite(lined,1,256,fd);
}
/* create an gradient and distance shaded view */
doviews(namedis,nameg,named,nlines)
char *namedis,*nameg,*named; /* floating file , gradiet and distance files*/
int nlines; /* number of lines in image */
{
FILE *fg,*fd,*ffloat;
int z,i,j,k,midline;
char lined[256],lineg[256]; /* gradient and distance value buffers */
midline=1; /* middle line in input buffer */
/* open output and input files */
fd = fg = NULL;
if (dispmode & 1)
fd=fopen(named,"wb");
if (dispmode & 2)
fg=fopen(nameg,"wb");
ffloat=fopen(namedis,"rb");
fread(fxbuf,1,3*256*sizeof(float),ffloat); /* read first three floating lines */
/* do first line */
doline(lineg,lined,0,0,1,1,fg,fd);
/* do rest of lines */
for(z=0;z<(nlines-2);z++){ /*for each inside line */
doline(lineg,lined,midline,prev(midline),succ(midline),2,fg,fd);
fread(fxbuf[prev(midline)],1,256*sizeof(float),ffloat); /*read next floating line */
midline=succ(midline);
}
/* do last line */
doline(lineg,lined,midline,prev(midline),midline,1,fg,fd);
/* close all files */
if (fg != NULL) fclose(fg);
if (fd != NULL) fclose(fd);
fclose(ffloat);
}
/**********************************************************/
/**** MAIN ***** MAIN ***** MAIN ***** MAIN ***** MAIN ****/
/**********************************************************/
/* Usage: grad [filename] [-f] [-l] [-z] [-t] [-d] [-n(d|g)] [-g]
[-h] [-v(bo|to|rl|ll|re|fr)] [-c(rl|ll|re|fr)]
[-i(x(r|l)|y(u|d))] [-o(x(r|l)|y(f|b)|z(h|f))]
*/
main(argc, argv)
int argc;
char *argv[];
{ char filename[13];
FILE *par;
FILE *fp;
int i, n;
char cmd[80];
int scanxdir[3], scanydir[3], scanzdir[3]; /* scanning directions */
int imagex[4], imagey[4], imagez[4]; /* image/scan direction */
int temp_nlines; /* temporary line numbers */
/* set clipping planes */
clipx[0] = clipy[0] = 0;
clipx[1] = clipy[1] = 256;
/* set image orientation to left->right, down->up */
image_or[0] = image_or[1] = 1;
/* set object orientation to right->left, back->front, feet->head */
object_or[0] = object_or[1] = object_or[2] = 1;
/* get parameters from the command line */
/* set other defaults */
ZOOM = 1.0;
FIRSTSLICE = 1;
LASTSLICE = 256;
THRESHOLD = 175;
DR = 'D';
dispmode = 3;
header_blocks = 1;
if (argc > 1) {
/* get parameters */
for (argc--, argv++; argc > 0; argc--, argv++) {
if (**argv == '-' || **argv == '/') {
switch (tolower(*(*argv+1))) {
case 'z':
ZOOM = atof(*argv+2);
break;
case 'f':
FIRSTSLICE = atoi(*argv+2);
break;
case 'l':
LASTSLICE = atoi(*argv+2);
break;
case 't':
THRESHOLD = atoi(*argv+2);
break;
case 'g':
GRAD_THRESHOLD = atof(*argv+2);
break;
case 'd':
DR = *(*argv+2);
break;
case 'h':
header_blocks = atoi(*argv+2);
break;
case 'n':
switch (tolower(*(*argv+2))) {
case 'd':
dispmode &= 0xfe;
break;
case 'g':
dispmode &= 0xfd;
break;
default:
usage();
}
break;
case 'v':
/* viewing directions */
if (views == 0xFFFF) views = 0;
if (tolower(*(*argv+2)) == 'b' &&
tolower(*(*argv+3)) == 'o')
views |= 1;
else if (tolower(*(*argv+2)) == 't' &&
tolower(*(*argv+3)) == 'o')
views |= 1 << 1;
else if (tolower(*(*argv+2)) == 'r' &&
tolower(*(*argv+3)) == 'l')
views |= 1 << 2;
else if (tolower(*(*argv+2)) == 'l' &&
tolower(*(*argv+3)) == 'l')
views |= 1 << 3;
else if (tolower(*(*argv+2)) == 'r' &&
tolower(*(*argv+3)) == 'e')
views |= 1 << 4;
else if (tolower(*(*argv+2)) == 'f' &&
tolower(*(*argv+3)) == 'r')
views |= 1 << 5;
else if (tolower(*(*argv+2)) == 'n' &&
tolower(*(*argv+3)) == 'o')
views = 0;
else
usage();
break;
case 'c':
/* clipping planes */
if (tolower(*(*argv+2)) == 'r' &&
tolower(*(*argv+3)) == 'l')
clipx[0] = atoi(*argv + 4);
else if (tolower(*(*argv+2)) == 'l' &&
tolower(*(*argv+3)) == 'l')
clipx[1] = atoi(*argv + 4);
else if (tolower(*(*argv+2)) == 'r' &&
tolower(*(*argv+3)) == 'e')
clipy[0] = atoi(*argv + 4);
else if (tolower(*(*argv+2)) == 'f' &&
tolower(*(*argv+3)) == 'r')
clipy[1] = atoi(*argv + 4);
else
usage();
break;
case 'i':
/* image orientation */
if (tolower(*(*argv+2)) == 'x' &&
tolower(*(*argv+3)) == 'r')
image_or[0] = 1;
else if (tolower(*(*argv+2)) == 'x' &&
tolower(*(*argv+3)) == 'l')
image_or[0] = -1;
else if (tolower(*(*argv+2)) == 'y' &&
tolower(*(*argv+3)) == 'u')
image_or[1] = 1;
else if (tolower(*(*argv+2)) == 'y' &&
tolower(*(*argv+3)) == 'd')
image_or[1] = -1;
else
usage();
break;
case 'o':
/* object orientation */
if (tolower(*(*argv+2)) == 'x' &&
tolower(*(*argv+3)) == 'r')
object_or[0] = -1;
else if (tolower(*(*argv+2)) == 'x' &&
tolower(*(*argv+3)) == 'l')
object_or[0] = 1;
else if (tolower(*(*argv+2)) == 'y' &&
tolower(*(*argv+3)) == 'f')
object_or[1] = 1;
else if (tolower(*(*argv+2)) == 'y' &&
tolower(*(*argv+3)) == 'b')
object_or[1] = -1;
else if (tolower(*(*argv+2)) == 'z' &&
tolower(*(*argv+3)) == 'h')
object_or[2] = 1;
else if (tolower(*(*argv+2)) == 'z' &&
tolower(*(*argv+3)) == 'f')
object_or[2] = -1;
else
usage();
break;
default:
usage();
}
}
else {
strncpy(fnamein, *argv, 45);
strcat(fnamein, ".000");
}
}
}
else {
cmd[0] = 1;
while(cmd[0]) {
/* display defaults */
printf("1 : filename - %s\n", fnamein);
printf("2 : first slice - %d, last slice - %d\n", FIRSTSLICE,
LASTSLICE);
printf("3 : zoom - %f\n", ZOOM);
printf("4 : dens. threshold - %d\n", THRESHOLD);
printf("5 : temp. drive - %c\n", toupper(DR));
printf("6 : display - (%s) (%s)\n",
(dispmode & 1) ? "distance" : "",
(dispmode & 2) ? "gradient" : "");
printf("7 : grad. threshold - %f\n", GRAD_THRESHOLD);
printf("8 : header blocks - %d\n", header_blocks);
printf("9 : views - %s %s %s %s %s %s %s\n",
(views & 1) ? "BO" : "",
(views & 1<<1) ? "TO" : "",
(views & 1<<2) ? "RL" : "",
(views & 1<<3) ? "LL" : "",
(views & 1<<4) ? "RE" : "",
(views & 1<<5) ? "FR" : "",
(views == 0) ? "NO" : "");
printf("10: clipping planes - RL %d LL %d RE %d FR %d\n",
clipx[0], clipx[1], clipy[0], clipy[1]);
printf("11: image orientation - X %d Y %d\n",
image_or[0], image_or[1]);
printf("12: objct orientation - X %d Y %d Z %d\n",
object_or[0], object_or[1], object_or[2]);
printf("\n Enter number to change any item, or ENTER to start\n");
if (gets(cmd) == NULL) exit(0);
if (cmd[0]) {
for (i = 0; !isdigit(cmd[i]) && cmd[i] != '\0'; i++) ;
if (isdigit(cmd[i])) {
sscanf(&cmd[i], "%d", &i);
switch (i) {
case 1:
printf("Enter file name : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%s", fnamein);
strcat(fnamein, ".000");
break;
case 2:
printf("Enter first scan : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%d", &FIRSTSLICE);
printf("Enter last scan : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%d", &LASTSLICE);
break;
case 3:
printf("Enter zoom factor : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%f", &ZOOM);
break;
case 4:
printf("Enter threshold : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%d", &THRESHOLD);
break;
case 5:
printf("Enter temporary drive : ");
if (gets(cmd) == NULL) exit(0);
for (i = 0; !isalpha(DR = cmd[i]) && DR != '\0'; i++) ;
if (!isalpha(DR)) DR = 'd';
break;
case 6:
printf("1 to turn distance %s, and 2 gradient %s\n",
(dispmode & 1) ? "off" : "on",
(dispmode & 2) ? "off" : "on");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%d", &i);
dispmode ^= 1 << --i;
break;
case 7:
printf("Enter gradient threshold : ");
if (gets(cmd) == NULL) exit(0);
sscanf(cmd, "%f", &GRAD_THRESHOLD);
break;
case 8:
printf("Enter number of header blocks : ");
if (gets(cmd) == NULL) exit(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -