📄 xgpaint3d.c
字号:
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 + -