📄 xgprint.c
字号:
/* 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 + -