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

📄 ang1.c

📁 vc编写的3D图形
💻 C
📖 第 1 页 / 共 2 页
字号:
        else if (y2 > 255.0) {
          y2 = linex[i];
          y_fac = 1;
        }
        else if (fabs(y2 - y1) > GRAD_THRESHOLD) {
          if (fabs(linex[i] - y1) < GRAD_THRESHOLD/2. && y2 < linex[i]) {
            y2 = linex[i];
            y_fac = 1;
          }
          else if ((y2 - linex[i]) < GRAD_THRESHOLD/2. && y1 > linex[i]) {
            y1 = linex[i];
            y_fac = 1;
          }
        }
        if (z1 > 255.0) {
          z1 = linex[i];
          z_fac = 1;
        }
        else if (z2 > 255.0) {
          z2 = linex[i];
          z_fac = 1;
        }
        else if (fabs(z2 - z1) > GRAD_THRESHOLD) {
          if (fabs(linex[i] - z1) < GRAD_THRESHOLD/2. && z2 < linex[i]) {
            z2 = linex[i];
            z_fac = 1;
          }
          else if (fabs(z2 - linex[i]) < GRAD_THRESHOLD/2. && z1 < linex[i]) {
            z1 = linex[i];
            z_fac = 1;
          }
        }
        lineg[i] = grad(x1, x2, y1, y2, z1, z2, x_fac, y_fac, z_fac);
        if (dispmode & 8) {
          /* combine with distance */
          lineg[i] = (float) lineg[i] * (1.0 - dist_weight) + 
                     (255.0-linex[i]) * dist_weight;
        }
      }
    }

  if (linex[255] > 255.0)
    lineg[255] = lined[255] = 0;
  else {
    if (dispmode & 1)
      lined[255] = 255.5 - linex[255];
    if (dispmode & 2) {
      lineg[255] = grad(0.0, 2.0, linex[254], linex[255], linex1[255], linex2[255],
                        1, 2, z_fac);
      if (dispmode & 8) {
        lineg[i] = (float) lineg[255] * (1.0 - dist_weight) + 
                   (255.0-linex[255]) * dist_weight;
        }

    }
   }


  if (fg != NULL) fwrite(lineg,sizeof(unsigned char),256,fg);
  if (fd != NULL) fwrite(lined,sizeof(unsigned char),256,fd);

}




doviews()
{
 FILE *fg,*fd,*fx,*fy;
 int z,i,j,k,mid;

 mid=1;

 fd = fg = NULL;
 if(dispmode & 1) {
   if ((fd=fopen(fnd,"wb")) == NULL) {
     printf("Error opening %s\n", fnd);
     exit(1);
   }
   printf("Created %s\n", fnd);
 }
 if (dispmode & 2) {
   if ((fg=fopen(fng,"wb")) == NULL) {
     printf("Error opening %s\n", fng);
     exit(1);
   }
   printf("Created %s\n", fng);
 }
 if ((fx=fopen(xfile,"rb")) == NULL || (fy=fopen(yfile,"rb")) == NULL) {
   printf("Error opening %s or %s\n", xfile, yfile);
   exit(1);
 }

/*read first three lines */
 for(i=0;i<3;i++){
     fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
     fread(fxbuf[i],1,FLOAT_LINE,fx);
     fseek(fy,(long)FLOAT_LINE*i,SEEK_SET);
     fread(fybuf[i],1,FLOAT_LINE,fy);
 }

 /* do first line (forward differene)*/
 getdistances(fxbuf[0],fybuf[0]);
 doline(fxbuf[0],fxbuf[0],fxbuf[1],fybuf[0],fybuf[0],fybuf[1],1,fg,fd);

 /* do middle lines (central diffrence) */
 for(z=0;z<(NLINES-2);z++){      /*for each slice */
     getdistances(fxbuf[mid],fybuf[mid]);
     doline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[succ(mid)],
            fybuf[mid],fybuf[prev(mid)],fybuf[succ(mid)],2,fg,fd);
     fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
     fseek(fy,(long)FLOAT_LINE*i,SEEK_SET);
     i++;
     fread(fxbuf[prev(mid)],1,FLOAT_LINE,fx);
     fread(fybuf[prev(mid)],1,FLOAT_LINE,fy);
     mid=succ(mid);
     printf(" line %d\r", z+2);
 }
 printf("\n");

 /* do last line (backward difference)*/
 getdistances(fxbuf[mid],fybuf[mid]);
 doline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[prev(mid)],
            fybuf[mid],fybuf[prev(mid)],fybuf[prev(mid)],1,fg,fd);

 if (fg != NULL) fclose(fg);
 if (fd != NULL) fclose(fd);
 fclose(fx);
 fclose(fy);
}

dostrview()
{
 FILE *fg,*fd,*fx;
 int z,i,j,k,mid;

 mid=1;

 fd = fg = NULL;
 if(dispmode & 1) {
   if ((fd=fopen(fnd,"wb")) == NULL) {
     printf("Error opening %s\n", fnd);
     exit(1);
   }
   printf("Created %s\n", fnd);
 }
 if (dispmode & 2) {
   if ((fg=fopen(fng,"wb")) == NULL) {
     printf("Error opening %s\n", fng);
     exit(1);
   }
   printf("Created %s\n", fng);
 }
 if ((fx=fopen(xfile,"rb")) == NULL) {
   printf("Error opening %s\n", xfile);
   exit(1);
 }

/*read first three lines */
 for(i=0;i<3;i++) {
   fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
   fread(fxbuf[i],1,FLOAT_LINE,fx);
 }

 /* do first line (forward differene)*/
 dostrline(fxbuf[0], fxbuf[0], fxbuf[1], 1, fg, fd);

 /* do middle lines (central diffrence) */
 for(z=0;z<(NLINES-2);z++){      /*for each slice */
     dostrline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[succ(mid)],2,fg,fd);
     fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
     i++;
     fread(fxbuf[prev(mid)],1,FLOAT_LINE,fx);
     mid=succ(mid);
     printf(" line %d\r",z+2);
 }
 printf("\n");

 /* do last line (backward difference)*/
 dostrline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[prev(mid)],
           1,fg,fd);

 if (fg != NULL) fclose(fg);
 if (fd != NULL) fclose(fd);
 fclose(fx);
}

getang(ang)
int ang;
{
  sprintf(fng,"gang%03d.out",ang);
  sprintf(fnd,"dang%03d.out",ang);
  if( ( ang > 0) && ( ang < 90) ){
       xdir=forward;
       ydir=backward;
       sprintf(xfile,"%c:ydis2.dat",DR);
       sprintf(yfile,"%c:xdis1.dat",DR);
       xinc=1;
       yinc=-1;
   }
   else if( ( ang > 90) && ( ang < 180) ){
       xdir=forward;
       ydir=backward;
       sprintf(xfile,"%c:xdis1.dat",DR);
       sprintf(yfile,"%c:ydis1.dat",DR);
       xinc=1;
       yinc=-1;
       ang-=90;
   }
   else if( ( ang > 180) && ( ang < 270) ){
       xdir=forward;
       ydir=backward;
       sprintf(xfile,"%c:ydis1.dat",DR);
       sprintf(yfile,"%c:xdis2.dat",DR);
       xinc=1;
       yinc=-1;
       ang-=180;
   }
   else if( ( ang > 270) && ( ang < 360) ){
       xdir=forward;
       ydir=backward;
       sprintf(xfile,"%c:xdis2.dat",DR);
       sprintf(yfile,"%c:ydis2.dat",DR);
       xinc=1;
       yinc=-1;
       ang-=270;
   }
   else if (ang == 0) {
       xdir=forward;
       sprintf(xfile,"%c:ydis2.dat",DR);
       xinc=1;
       cosTheta = 1.0;
       sinTheta = 0.0;
       return(0);
   }
   else if (ang == 90) {
       xdir=forward;
       sprintf(xfile,"%c:xdis1.dat",DR);
       xinc=1;
       cosTheta = 1.0;
       sinTheta = 0.0;
       return(0);
   }
   else if (ang == 180) {
       xdir=forward;
       sprintf(xfile,"%c:ydis1.dat",DR);
       xinc=1;
       cosTheta = 1.0;
       sinTheta = 0.0;
       return(0);
   }
   else if (ang == 270) {
       xdir=forward;
       sprintf(xfile,"%c:xdis2.dat",DR);
       xinc=1;
       cosTheta = 1.0;
       sinTheta = 0.0;
       return(0);
   }
   else {
       printf(" Bad angle\n");
       exit(1);
  }
  IXmax = 127.5 * (1.0 + sqrt(2.0) * sin(((double) ang - 45.0) * PI / 180.0));
  THETA=(double)ang * PI/180;
  sinTheta=sin(THETA);
  cosTheta=cos(THETA);
  tgnTheta=sinTheta/cosTheta;
}
 
/**********************************************************/
/**** MAIN ***** MAIN ***** MAIN ***** MAIN ***** MAIN ****/
/**********************************************************/
/* Command line input:
   ang [-a] [-r] [-g] [-n(d|g)] [-h] [-d]
   -a  : angle (no default)
   -r  : number of output images (default: 1)
   -g  : threshold for gradient (default: 3.0)
   -n  : not making distance (d) or gradient (g) image
   -h  : filling holes
   -d  : weight for distance combined with the gradient
 */

main(argc, argv)
int argc;
char *argv[];

{
  char filname[13];
  FILE *par;
  int ANG;
  int i;

 /* first get some parameters */
 if ((par=fopen("param.dat","r")) == NULL) {
   printf("Error opening PARAM.DAT\n");
   exit(1);
 }
 fscanf(par,"%c %d",&DR,&NLINES);
 fclose(par);
 if (argc != 1) {
   for (argc--; argc > 0; argc--) {
     if (**++argv == '-' || **argv == '/') {
       switch (tolower(*(*argv+1))) {
         case 'a':
           ANG = atoi(*argv+2);
           break;
         case 'r':
           number_pic = atoi(*argv+2);
           break;
         case 'g':
           GRAD_THRESHOLD = atof(*argv+2);
           break;
         case 'd':
           dispmode |= 8;
           if (*(*argv+2) != '\0')
             if ((dist_weight = atof(*argv+2)) < 0.0 || dist_weight > 1.0)
               dist_weight = 0.5;
           break;
         case 'n':
           switch (tolower(*(*argv+2))) {
             case 'd':
               dispmode &= 0xfe;
               break;
             case 'g':
               dispmode &= 0xfd;
               break;
             default:
               usage();
           }
           break;
           case 'h':
             dispmode |= 4;
             break;
         default:
           usage();         
       }
     }
     else
       usage();
   }
 }
 else {
   printf("Enter angle: ");
   scanf("%d", &ANG);
   if (ANG != 0) {
     printf("Enter number of rotations: ");
     scanf("%d", number_pic);
   }
 }

 if (number_pic <= 0) {
   printf("number_pic should be larger than 0!\n");
   exit(1);
 }
 if (GRAD_THRESHOLD <= 1.0) {
   printf("Gradient threshold should be larger than 1.0!\n");
   exit(1);
 }
 while (ANG < 0) ANG = 360 - ANG;
 if (ANG == 0 && number_pic > 1) number_pic = 1;

 for (i = 1; i <= number_pic; i++) {
   getang(ANG*i % 360);
   if (ANG*i % 90 != 0)
     doviews();
   else
     dostrview((ANG % 360) / 90);
 }

}


usage()
{
  printf("%s\n", usestr);
  exit(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -