⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grad1.c

📁 vc编写的3D图形
💻 C
📖 第 1 页 / 共 3 页
字号:
                        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 + -