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

📄 xgprint.c

📁 xgrafix 是PTSG模拟程序中的图形截面库 改版本是最新版本
💻 C
📖 第 1 页 / 共 4 页
字号:
  /* Calculating the rotation vectors */  n1 = sin(theWindow->theta * M_PI / 180.) * cos(theWindow->phi * M_PI / 180.);  n2 = sin(theWindow->theta * M_PI / 180.) * sin(theWindow->phi * M_PI / 180.);  n3 = cos(theWindow->theta * M_PI / 180.);  if (theta_flag == ABOVE) {    up1 = 0;    up2 = 1;    up3 = 0;  } else {    up1 = 0;    up2 = 0;    up3 = 1;  }  u1 = up2 * n3 - up3 * n2;  u2 = up3 * n1 - up1 * n3;  u3 = up1 * n2 - up2 * n1;  mag = sqrt(u1 * u1 + u2 * u2 + u3 * u3);  u1 /= mag;  u2 /= mag;  u3 /= mag;  v1 = n2 * u3 - n3 * u2;  v2 = n3 * u1 - n1 * u3;  v3 = n1 * u2 - n2 * u1;  /***********************************************************/  /* Calculating the bounding box and the projection scaling */  theBox[0].x = 0;  theBox[1].x = u1;  theBox[2].x = u1 + u2;  theBox[3].x = u2;  theBox[0].y = 0;  theBox[1].y = v1;  theBox[2].y = v1 + v2;  theBox[3].y = v2;  theBox[4].x = u2 + u3;  theBox[5].x = u3;  theBox[6].x = u1 + u3;  theBox[7].x = u1 + u2 + u3;  theBox[4].y = v2 + v3;  theBox[5].y = v3;  theBox[6].y = v1 + v3;  theBox[7].y = v1 + v2 + v3;  xprojmin = xprojmax = theBox[0].x;  yprojmin = yprojmax = theBox[0].y;  for (i = 1; i < 8; i++) {    xprojmin = (xprojmin < theBox[i].x) ? xprojmin : theBox[i].x;    xprojmax = (xprojmax > theBox[i].x) ? xprojmax : theBox[i].x;    yprojmin = (yprojmin < theBox[i].y) ? yprojmin : theBox[i].y;    yprojmax = (yprojmax > theBox[i].y) ? yprojmax : theBox[i].y;  }  /********************************************************************/  /* selecting the labels to print based on the given point of view   */  if (theta_flag != ABOVE) {    switch (phi_flag) {    case FIRST_QUAD:      if (theta_flag == UPPER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->Y_Min);	theString[0].x = u1;	theString[0].y = v1;	sprintf(theString[1].buffer, "%s", label_Ptr->Y_Label);	theString[1].x = u1 + .5 * u2;	theString[1].y = v1 + .5 * v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->Y_Max);	theString[2].x = u1 + u2;	theString[2].y = v1 + v2;	sprintf(theString[3].buffer, "%.4G", label_Ptr->X_Max);	theString[3].x = u1 + u2;	theString[3].y = v1 + v2;	sprintf(theString[4].buffer, "%s", label_Ptr->X_Label);	theString[4].x = .5 * u1 + u2;	theString[4].y = .5 * v1 + v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->X_Min);	theString[5].x = u2;	theString[5].y = v2;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u2;	theString[6].y = v2;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u2 + u3;	theString[7].y = v2 + v3;      } else if (theta_flag == LOWER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->X_Max);	theString[0].x = u1;	theString[0].y = v1;	sprintf(theString[1].buffer, "%s", label_Ptr->X_Label);	theString[1].x = .5 * u1;	theString[1].y = .5 * v1;	sprintf(theString[2].buffer, "%.4G", label_Ptr->X_Min);	theString[2].x = 0.0;	theString[2].y = 0.0;	sprintf(theString[3].buffer, "%.4G", label_Ptr->Y_Min);	theString[3].x = 0.0;	theString[3].y = 0.0;	sprintf(theString[4].buffer, "%s", label_Ptr->Y_Label);	theString[4].x = .5 * u2;	theString[4].y = .5 * v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->Y_Max);	theString[5].x = u2;	theString[5].y = v2;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u2;	theString[6].y = v2;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u2 + u3;	theString[7].y = v2 + v3;      }      break;    case SECOND_QUAD:      if (theta_flag == UPPER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->X_Max);	theString[0].x = u1 + u2;	theString[0].y = v1 + v2;	sprintf(theString[1].buffer, "%s", label_Ptr->X_Label);	theString[1].x = .5 * u1 + u2;	theString[1].y = .5 * v1 + v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->X_Min);	theString[2].x = u2;	theString[2].y = v2;	sprintf(theString[3].buffer, "%.4G", label_Ptr->Y_Max);	theString[3].x = u2;	theString[3].y = v2;	sprintf(theString[4].buffer, "%s", label_Ptr->Y_Label);	theString[4].x = .5 * u2;	theString[4].y = .5 * v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->Y_Min);	theString[5].x = 0.0;	theString[5].y = 0.0;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = 0.0;	theString[6].y = 0.0;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u3;	theString[7].y = v3;      } else if (theta_flag == LOWER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->Y_Max);	theString[0].x = u1 + u2;	theString[0].y = v1 + v2;	sprintf(theString[1].buffer, "%s", label_Ptr->Y_Label);	theString[1].x = u1 + .5 * u2;	theString[1].y = v1 + .5 * v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->Y_Min);	theString[2].x = u1;	theString[2].y = v1;	sprintf(theString[3].buffer, "%.4G", label_Ptr->X_Max);	theString[3].x = u1;	theString[3].y = v1;	sprintf(theString[4].buffer, "%s", label_Ptr->X_Label);	theString[4].x = .5 * u1;	theString[4].y = .5 * v1;	sprintf(theString[5].buffer, "%.4G", label_Ptr->X_Min);	theString[5].x = 0.0;	theString[5].y = 0.0;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = 0.0;	theString[6].y = 0.0;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u3;	theString[7].y = v3;      }      break;    case THIRD_QUAD:      if (theta_flag == UPPER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->Y_Max);	theString[0].x = u2;	theString[0].y = v2;	sprintf(theString[1].buffer, "%s", label_Ptr->Y_Label);	theString[1].x = .5 * u2;	theString[1].y = .5 * v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->Y_Min);	theString[2].x = 0.0;	theString[2].y = 0.0;	sprintf(theString[3].buffer, "%.4G", label_Ptr->X_Min);	theString[3].x = 0.0;	theString[3].y = 0.0;	sprintf(theString[4].buffer, "%s", label_Ptr->X_Label);	theString[4].x = .5 * u1;	theString[4].y = .5 * v1;	sprintf(theString[5].buffer, "%.4G", label_Ptr->X_Max);	theString[5].x = u1;	theString[5].y = v1;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u1;	theString[6].y = v1;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u1 + u3;	theString[7].y = v1 + v3;      } else if (theta_flag == LOWER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->X_Min);	theString[0].x = u2;	theString[0].y = v2;	sprintf(theString[1].buffer, "%s", label_Ptr->X_Label);	theString[1].x = .5 * u1 + u2;	theString[1].y = .5 * v1 + v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->X_Max);	theString[2].x = u1 + u2;	theString[2].y = v1 + v2;	sprintf(theString[3].buffer, "%.4G", label_Ptr->Y_Max);	theString[3].x = u1 + u2;	theString[3].y = v1 + v2;	sprintf(theString[4].buffer, "%s", label_Ptr->Y_Label);	theString[4].x = u1 + .5 * u2;	theString[4].y = v1 + .5 * v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->Y_Min);	theString[5].x = u1;	theString[5].y = v1;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u1;	theString[6].y = v1;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u1 + u3;	theString[7].y = v1 + v3;      }      break;    case FOURTH_QUAD:      if (theta_flag == UPPER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->X_Min);	theString[0].x = 0.0;	theString[0].y = 0.0;	sprintf(theString[1].buffer, "%s", label_Ptr->X_Label);	theString[1].x = .5 * u1;	theString[1].y = .5 * v1;	sprintf(theString[2].buffer, "%.4G", label_Ptr->X_Max);	theString[2].x = u1;	theString[2].y = v1;	sprintf(theString[3].buffer, "%.4G", label_Ptr->Y_Min);	theString[3].x = u1;	theString[3].y = v1;	sprintf(theString[4].buffer, "%s", label_Ptr->Y_Label);	theString[4].x = u1 + .5 * u2;	theString[4].y = v1 + .5 * v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->Y_Max);	theString[5].x = u1 + u2;	theString[5].y = v1 + v2;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u1 + u2;	theString[6].y = v1 + v2;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u1 + u2 + u3;	theString[7].y = v1 + v2 + v3;      } else if (theta_flag == LOWER) {	sprintf(theString[0].buffer, "%.4G", label_Ptr->Y_Min);	theString[0].x = 0.0;	theString[0].y = 0.0;	sprintf(theString[1].buffer, "%s", label_Ptr->Y_Label);	theString[1].x = .5 * u2;	theString[1].y = .5 * v2;	sprintf(theString[2].buffer, "%.4G", label_Ptr->Y_Max);	theString[2].x = u2;	theString[2].y = v2;	sprintf(theString[3].buffer, "%.4G", label_Ptr->X_Min);	theString[3].x = u2;	theString[3].y = v2;	sprintf(theString[4].buffer, "%s", label_Ptr->X_Label);	theString[4].x = .5 * u1 + u2;	theString[4].y = .5 * v1 + v2;	sprintf(theString[5].buffer, "%.4G", label_Ptr->X_Max);	theString[5].x = u1 + u2;	theString[5].y = v1 + v2;	sprintf(theString[6].buffer, "%.4G", label_Ptr->Z_Min);	theString[6].x = u1 + u2;	theString[6].y = v1 + v2;	sprintf(theString[7].buffer, "%.4G", label_Ptr->Z_Max);	theString[7].x = u1 + u2 + u3;	theString[7].y = v1 + v2 + v3;      }      break;    }  }  /**************************************************/  if (label_Ptr->Z_Max == label_Ptr->Z_Min || label_Ptr->Y_Max == label_Ptr->Y_Min ||      label_Ptr->X_Max == label_Ptr->X_Min)    return;  /****************************************************/  /* Initialize the PS file and load the dictionary  */  if (!(fp = fopen(eps_file_name, "a"))) {    printf("PostScriptOpenWindow(): File was not opened properly!");    return;  }  /************************************************/  /* Rotate, translate, and draw the boundaries */  fprintf(fp, "\n1 setlinejoin\n");  fprintf(fp, "612 0 translate\n");  fprintf(fp, "90 rotate\n");  fprintf(fp, "1 setlinewidth\n");  fprintf(fp, "0 setgray\n");  x1 = 132;  x2 = 684;  y1 = 108;  y2 = 504;  fprintf(fp, "%%Limits of the bounding box (PS and physical)\n");   fprintf(fp, "/xps1 %d def\n",x1);   fprintf(fp, "/yps1 %d def\n",y1);   fprintf(fp, "/xps2 %d def\n",x2);  fprintf(fp, "/yps2 %d def\n",y2);  c1 = (x2 - x1) / (xprojmax - xprojmin + DBL_MIN);  d1 = (xprojmax * x1 - xprojmin * x2) / (xprojmax - xprojmin + DBL_MIN) + 0.5;  c2 = (y2 - y1) / (yprojmax - yprojmin + DBL_MIN);  d2 = (yprojmax * y1 - yprojmin * y2) / (yprojmax - yprojmin + DBL_MIN) + 0.5;  if (theta_flag != ABOVE) {    switch (phi_flag) {    case FIRST_QUAD:      if (theta_flag == UPPER)	PaintWall(theBox, c1, d1, c2, d2, 0, BACK, fp);      else	PaintWall(theBox, c1, d1, c2, d2, 5, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 1, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 4, BACK, fp);      break;    case SECOND_QUAD:      if (theta_flag == UPPER)	PaintWall(theBox, c1, d1, c2, d2, 0, BACK, fp);      else	PaintWall(theBox, c1, d1, c2, d2, 5, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 1, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 2, BACK, fp);      break;    case THIRD_QUAD:      if (theta_flag == UPPER)	PaintWall(theBox, c1, d1, c2, d2, 0, BACK, fp);      else	PaintWall(theBox, c1, d1, c2, d2, 5, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 2, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 3, BACK, fp);      break;    case FOURTH_QUAD:      if (theta_flag == UPPER)	PaintWall(theBox, c1, d1, c2, d2, 0, BACK, fp);      else	PaintWall(theBox, c1, d1, c2, d2, 5, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 3, BACK, fp);      PaintWall(theBox, c1, d1, c2, d2, 4, BACK, fp);      break;    }  }  /*******************************/  /* painting the labels         */  if (strcmp(plot_title, label_Ptr->Z_Label)){ /* print title only if different */    fprintf(fp, "\n/Times-BoldItalic findfont 14 scalefont setfont\n");    fprintf(fp, "xps1 xps2 add 2 div yps2 18 add moveto\n");    fprintf(fp, "(%s) prtstrfrommidlow\n", plot_title);  }  fprintf(fp, "\n/Times-BoldItalic findfont 12 scalefont setfont\n");  fprintf(fp, "xps1 xps2 add 2 div yps2 8 add moveto\n");  fprintf(fp, "(%s) prtstrfrommidlow\n", label_Ptr->Z_Label);  if (theta_flag == ABOVE) {    fprintf(fp, "90 rotate\n");    fprintf(fp, "yps1 yps2 add 2 div -100 moveto\n");    fprintf(fp, "(%s) prtstrfrommidlow\n", label_Ptr->Y_Label);    fprintf(fp, "-90 rotate\n");    fprintf(fp, "xps1 xps2 add 2 div yps1 16 sub moveto\n");    fprintf(fp, "(%s) prtstrfrommidup\n", label_Ptr->X_Label);    fprintf(fp, "/Times-Bold findfont 12 scalefont setfont\n");    fprintf(fp, "xps1 yps1 16 sub moveto\n");    fprintf(fp, "(%.3G) prtstrfromritup\n", label_Ptr->X_Min);    fprintf(fp, "xps2 yps1 16 sub moveto\n");    fprintf(fp, "(%.3G) prtstrfromritup\n", label_Ptr->X_Max);    fprintf(fp, "xps1 8 sub yps2 8 sub moveto\n");    fprintf(fp, "(%.3G) prtstrfromritup\n", label_Ptr->Y_Max);    fprintf(fp, "xps1 8 sub yps1 moveto\n");    fprintf(fp, "(%.3G) prtstrfromritlow\n", label_Ptr->Y_Min);    fprintf(fp, "xps1 yps1 xps2 yps2 rectangle\n");  } else {    fprintf(fp, "%d %d moveto\n", (int) (c1 * theString[1].x + d1 - 15), (int) (c2 * theString[1].y + d2 - 15));    fprintf(fp, "(%s) prtstrfromritup\n", theString[1].buffer);    fprintf(fp, "%d %d moveto\n", (int) (c1 * theString[4].x + d1 + 15), (int) (c2 * theString[4].y + d2 - 15));    fprintf(fp, "(%s) prtstrfromlftup\n", theString[4].buffer);    fprintf(fp, "/Times-Bold findfont 12 scalefont setfont\n");    fprintf(fp, "%d %d moveto\n", x1, (int) (c2 * theString[0].y + d2 - 15));    fprintf(fp, "(%s) prtstrfromritup\n", theString[0].buffer);    fprintf(fp, "%d %d moveto\n", (int) (c1 * theString[2].x + d1 - 15), y1 - 15);    fprintf(fp, "(%s) prtstrfromritup\n", theString[2].buffer);    fprintf(fp, "%d %d moveto\n", (int) (c1 * theString[3].x + d1 + 15), y1 - 15);    fprintf(fp, "(%s) prtstrfromlftup\n", theString[3].buffer);    fprintf(fp, "%d %d moveto\n", x2, (int) (c2 * theString[5].y + d2 - 15));    fprintf(fp, "(%s) prtstrfromlftup\n", theString[5].buffer);

⌨️ 快捷键说明

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