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

📄 xgpaint3d.c

📁 xgrafix 是PTSG模拟程序中的图形截面库 改版本是最新版本
💻 C
📖 第 1 页 / 共 3 页
字号:
      free(theMeshPoint[i]);    }    free(theMeshPoint);    theWindow->theMesh = (MeshType **) malloc(m * sizeof(MeshType *));    theMeshPoint = theWindow->theMesh;    for (i = 0; i < m; i++) {      theMeshPoint[i] = (MeshType *) malloc(n * sizeof(MeshType));    }    theWindow->xSize = m;    theWindow->ySize = n;  }  RescaleThreeDWindow(theWindow,&mstart,&mend,&nstart,&nend);  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;    x1 = 0;  x2 = Tk_Width(tkwin);  y1 = 1;  y2 = Tk_Height(tkwin) - (theFontAscent + theFontDescent + 7);  theWindow->ulxc = x1;  theWindow->ulyc = y1;  theWindow->lrxc = x2;  theWindow->lryc = y2;  /* Clear client area. */  theClientArea.x = x1;  theClientArea.y = y1;  theClientArea.width = x2 - x1;  theClientArea.height = y2 + (theFontAscent + theFontDescent + 7);  XSetClipRectangles(theDisplay, theWindow->xwingc, 0, 0, &theClientArea, 1, Unsorted);  /*******************************************************************/  XSetForeground(theDisplay, theWindow->xwingc, GrayShade[3]);  XFillRectangle(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		 0, 0, Tk_Width(tkwin), Tk_Height(tkwin));    /******************************************************/  /* Determining the octant where the viewer is located */    theWindow->theta = fmod(180. + theWindow->theta, 180.);  theWindow->phi = fmod(360. + theWindow->phi, 360.);    if (0 <= theWindow->phi && theWindow->phi <= 90)    phi_flag = FIRST_QUAD;  else if (90 < theWindow->phi && theWindow->phi <= 180)    phi_flag = SECOND_QUAD;  else if (180 < theWindow->phi && theWindow->phi <= 270)    phi_flag = THIRD_QUAD;  else if (270 < theWindow->phi && theWindow->phi <= 360)    phi_flag = FOURTH_QUAD;    if (theWindow->theta == 0.0)    theta_flag = ABOVE;  else if (0 < theWindow->theta && theWindow->theta <= 90)    theta_flag = UPPER;  else    theta_flag = LOWER;    /************************************/  /* 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) {    sprintf(theString[0].buffer, "%.4G", label_Ptr->Y_Max);    sprintf(theString[1].buffer, "%s", label_Ptr->Y_Label);    sprintf(theString[2].buffer, "%.4G", label_Ptr->Y_Min);    sprintf(theString[3].buffer, "%.4G", label_Ptr->X_Min);    sprintf(theString[4].buffer, "%s", label_Ptr->X_Label);    sprintf(theString[5].buffer, "%.4G", label_Ptr->X_Max);  } else {    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;    }  }  /*******************************/  /* painting the color spectra  */    if (Is_ColorCode_On(theWindow)) {    for (i = 0; i < 2 * MAXTHREEDCOLORS; i += 2) {      XSetForeground(theDisplay, theWindow->xwingc, ThreeDColor[i / 2]);      thePolygon[0].x = ToShort(theWindow->ulxc + i);      thePolygon[0].y = 0;      thePolygon[1].x = ToShort(theWindow->ulxc + i);      thePolygon[1].y = ToShort(theWindow->ulyc);      XDrawLines(theDisplay, theWindow->pixmap_buffer,		 theWindow->xwingc, thePolygon, 2, CoordModeOrigin);      thePolygon[0].x = ToShort(theWindow->ulxc + i + 1);      thePolygon[0].y = 0;      thePolygon[1].x = ToShort(theWindow->ulxc + i + 1);      thePolygon[1].y = ToShort(theWindow->ulyc);      XDrawLines(theDisplay, theWindow->pixmap_buffer,		 theWindow->xwingc, thePolygon, 2, CoordModeOrigin);    }    XSetForeground(theDisplay, theWindow->xwingc, ThreeDColor[0]);    XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		theWindow->ulxc, theWindow->ulyc + theFontAscent + 2, "L", 1);        XSetForeground(theDisplay, theWindow->xwingc, ThreeDColor[MAXTHREEDCOLORS - 1]);    XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		theWindow->ulxc + 2 * MAXTHREEDCOLORS - XTextWidth(theFontStruct, "H", 1),		theWindow->ulyc + theFontAscent + 2, "H", 1);    y1 += theFontHeight + 2;  }  /***************************************/  /* painting the labels                 */    theWindow->c2 = c2 = (y1 - y2) / (yprojmax - yprojmin + DBL_MIN);  theWindow->d2 = d2 = (yprojmax * y2 - yprojmin * y1) /     (yprojmax - yprojmin + DBL_MIN) + 0.5;  XSetForeground(theDisplay, theWindow->xwingc, theWinTextColor);  if (theta_flag == ABOVE) {    i = strlen(theString[0].buffer);    i1 = XTextWidth(theFontStruct, theString[0].buffer, i);    j = strlen(theString[1].buffer);    j1 = XTextWidth(theFontStruct, theString[1].buffer, j);    k = strlen(theString[2].buffer);    k1 = XTextWidth(theFontStruct, theString[2].buffer, k);    maxlen = (i1 > j1) ? i1 : j1;    maxlen = (k1 > maxlen) ? k1 : maxlen;        XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		x1 + maxlen - i1, y1 + theFontAscent, theString[0].buffer, i);    XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		x1 + (maxlen - j1) / 2, (y1 + y2) / 2, theString[1].buffer, j);    XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		x1 + maxlen - k1, y2 - theFontDescent, theString[2].buffer, k);    x1 += maxlen + 2;        i = strlen(theString[3].buffer);    j = strlen(theString[4].buffer);    k = strlen(theString[5].buffer);    k1 = XTextWidth(theFontStruct, theString[5].buffer, k);        XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		x1, y2 + theFontAscent + 2, theString[3].buffer, i);    XDrawString(theDisplay, theWindow->pixmap_buffer, theWindow->xwingc,		(x1 + x2) / 2, y2 + theFontAscent + 2, theString[4].buffer, j);

⌨️ 快捷键说明

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