home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum23.lzh / f23b / SOFTWARE / PDRAW / plotX.c < prev    next >
Text File  |  1992-01-15  |  29KB  |  843 lines

  1. /*   plotX.c - all the X10 routines  ***/
  2.  
  3. #include <X/Xlib.h>
  4. #include <X/Xkeyboard.h>
  5. #include <stdio.h>
  6. #include <strings.h>
  7. #include <math.h>
  8. #include "header.h" 
  9. #include "Xdefs.h"
  10.  
  11. #include "icon.ic"
  12. #include "iconMask.ic"
  13.  
  14. #define LEFT  0
  15. #define RIGHT 1
  16. #define BACK  2
  17. #define FRONT 3
  18.  
  19. #define X_DIM            600
  20. #define Y_DIM            600
  21. #define BDR_DIM          100
  22. #define VIEW_X_ORIGIN    0
  23. #define VIEW_Y_ORIGIN    0
  24. #define VIEW_X_DIM       1000 
  25. #define VIEW_Y_DIM       1000 
  26. #define NLINES           2
  27. #define DEFAULT_BORDER_WIDTH 3
  28. #define DEFAULT_FONT         "helv12b"
  29. #define DEFAULT_POSITION     "=%dx%d+0+0"   /* upper left hand corner */
  30. #define DEFAULT_BORDER_COLOR "Blue"
  31. #define DEFAULT_BACK_COLOR   "DarkBlue"
  32. #define DEFAULT_FORE_COLOR   "White"
  33. #define DEFAULT_MOUSE_COLOR  "White"
  34. #define DEFAULT_ICON_COLOR   "Red"
  35.  
  36. #define Long_Dotted XMakePattern(0x0101,16,1)  /* Line type */
  37. #define Dashed_1    XMakePattern(0x3f3f,16,1)  /* Line type */
  38. #define Dashed_2    XMakePattern(0x0707,16,1)  /* Line type */
  39. #define Dashed_3    XMakePattern(0x6666,16,1)  /* Line type */
  40.  
  41. #define KC_A    0302                    /* interesting letter keycodes */
  42. #define KC_B    0331   
  43. #define KC_C    0316 
  44. #define KC_D    0315
  45. #define KC_E    0314
  46. #define KC_F    0322
  47. #define KC_G    0330
  48. #define KC_H    0335
  49. #define KC_I    0346
  50. #define KC_J    0342
  51. #define KC_K    0347
  52. #define KC_L    0354
  53. #define KC_M    0343
  54. #define KC_N    0336
  55. #define KC_O    0353
  56. #define KC_P    0360
  57. #define KC_Q    0301
  58. #define KC_R    0321
  59. #define KC_S    0307
  60. #define KC_T    0327
  61. #define KC_U    0341
  62. #define KC_V    0323
  63. #define KC_W    0306
  64. #define KC_X    0310
  65. #define KC_Y    0334
  66. #define KC_Z    0303
  67. #define KC_DEL  0274
  68. #define KC_BAR  0324
  69.  
  70. /* events */
  71.  
  72. #define EVENT_A         1               /* user pressed "A" */
  73. #define EVENT_B         2               /* user pressed "B" */
  74. #define EVENT_C         3               /* user pressed "C" */
  75. #define EVENT_D         4               /* user pressed "D" */
  76. #define EVENT_E         5               /* user pressed "E" */
  77. #define EVENT_F         6               /* user pressed "F" */
  78. #define EVENT_G         7               /* user pressed "G" */
  79. #define EVENT_H         8               /* user pressed "H" */
  80. #define EVENT_I         9               /* user pressed "I" */
  81. #define EVENT_J        10               /* user pressed "J" */
  82. #define EVENT_K        11               /* user pressed "K" */
  83. #define EVENT_L        12               /* user pressed "L" */
  84. #define EVENT_M        13               /* user pressed "M" */
  85. #define EVENT_N        14               /* user pressed "N" */
  86. #define EVENT_O        15               /* user pressed "O" */
  87. #define EVENT_P        16               /* user pressed "P" */
  88. #define EVENT_Q        17               /* user pressed "Q" */
  89. #define EVENT_R        18               /* user pressed "R" */
  90. #define EVENT_S        19               /* user pressed "S" */
  91. #define EVENT_T        20               /* user pressed "T" */
  92. #define EVENT_U        21               /* user pressed "U" */
  93. #define EVENT_V        22               /* user pressed "V" */
  94. #define EVENT_W        23               /* user pressed "W" */
  95. #define EVENT_X        24               /* user pressed "X" */
  96. #define EVENT_Y        25               /* user pressed "Y" */
  97. #define EVENT_Z        26               /* user pressed "Z" */
  98. #define EVENT_BAR      27               /* user pressed space bar */
  99. #define EVENT_LEFT_D   28               /* user pressed left mouse button */
  100. #define EVENT_LEFT_U   29               /* user released l.m.b */
  101. #define EVENT_MIDDLE_D 30               /* user pressed middle button */
  102. #define EVENT_RIGHT_D  31               /* user pressed right button */
  103. #define EVENT_RIGHT_U  32               /* user released r.m.b */
  104. #define EVENT_NETWORK  33               /* incoming network packet */
  105. #define EVENT_INT      34               /* user pressed interrupt key */
  106. #define EVENT_TIMEOUT  35               /* nothing happened! */
  107.  
  108. int     background;                     /* color of background */
  109. int     foreground;                     /* color of lines and such */
  110. int     color1;                         /* color of 1st line */
  111. int     color2;                         /* color of 2nd line */
  112. int     color3;                         /* color of 3rd line */
  113. int     color4;                         /* color of 4th line */
  114. int     color5;                         /* color of 5th line */
  115. int     iconFore;                       /* icon foreground */
  116. int     iconBack;                       /* icon background */
  117. int     mouseground;                    /* mouse cursor color */
  118. int     highlight;                      /* flash colors */
  119.  
  120. Window      mwWindow;                   /* parent window */
  121. OpaqueFrame mwWin;                      /* frame for the window */
  122. Window      viewWindow;                 /* view window */
  123. Window      iconWindow;                 /* icon window */
  124. Bitmap      iconMask;                   /* mask for the icon outline */
  125. Pixmap      border_pixmap;              /* Pixmap for the border */
  126. Pixmap      icon_border_pixmap;         /* Pixmap for the icon border */
  127. FontInfo    *fontInfo;                  /* font information */
  128.  
  129. short gray_bits[16] = {
  130.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  131.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  132.    0xaaaa, 0x5555, 0xaaaa, 0x5555,
  133.    0xaaaa, 0x5555, 0xaaaa, 0x5555};
  134.  
  135. InitWindow(argc,argv)
  136. int argc;
  137. char **argv;
  138. {
  139.    char       *sprintf();
  140.    WindowInfo mwInfo;
  141.    int        defwidth, defheight;
  142.    char     def[128];
  143.  
  144.    /* Open display first */
  145.    if (!XOpenDisplay(display_name)){
  146.       fprintf(stderr,"%s:Could not open display %s\n",
  147.               progname,display_name);
  148.       exit(1);
  149.    }
  150.  
  151.    /* Merge Options */
  152.    Merge_Options();
  153.  
  154.    /* Allocate colors */
  155.    Alloc_Colors();
  156.  
  157.    /* Find a font */
  158.    if (!(fontInfo = XOpenFont(font_name))){
  159.       fprintf(stderr,"%s:Could not open font %s\n",progname,font_name);
  160.       exit(1);
  161.    }
  162.  
  163.    /* set up the main window */
  164.    mwWin.bdrwidth = border_width;
  165.    mwWin.border = border_pixmap;
  166.    mwWin.background = XMakeTile(background);
  167.    defwidth = X_DIM;
  168.    defheight= Y_DIM + fontInfo->height * (NLINES + 1);
  169.    sprintf(def,"=$dx%d+300+300",defwidth, defheight);
  170.    mwWindow = XCreate("Kenny_Plotter",progname,geometry,def,&mwWin,
  171.                        defwidth,defheight);
  172.  
  173.    if (!mwWindow) {
  174.       fprintf(stderr,"XCreateWindow failed");
  175.       exit(1);
  176.    }
  177.  
  178.    /* set up a subwindow */
  179.    viewWindow = XCreateTransparency(mwWindow,VIEW_X_ORIGIN,VIEW_Y_ORIGIN,
  180.                                              VIEW_X_DIM,VIEW_Y_DIM);
  181.  
  182.    /* set up the icon */
  183.    XQueryWindow(mwWindow, &mwInfo);
  184.    iconWindow = XCreateWindow(RootWindow,
  185.                        mwInfo.x + (mwInfo.width - icon_width) /2,
  186.                        mwInfo.y + (mwInfo.height - icon_height) /2,
  187.                        icon_width, icon_height, 3, icon_border_pixmap, 0);
  188.    XTileRelative(iconWindow);
  189.    XSetIconWindow(mwWindow, iconWindow);
  190.    iconMask = XStoreBitmap(icon_mask_width, icon_mask_height,
  191.                            icon_mask_bits);
  192.  
  193.    /* XSelectInput(mwWindow,ExposeWindow | UnmapWindow); */
  194.    XSelectInput(iconWindow,ExposeWindow | UnmapWindow); 
  195.    iconFore = foreground;
  196.    iconBack = background;
  197.  
  198.    XSelectInput(mwWindow,
  199.                 KeyPressed|ButtonPressed|ButtonReleased|
  200.                 EnterWindow|LeaveWindow|ExposeWindow|UnmapWindow);
  201.    XMapWindow(viewWindow);
  202.    XMapWindow(mwWindow);
  203. }
  204.  
  205. /* Initialize and merge the various options */
  206. Merge_Options()
  207. {
  208.    char    *option;
  209.  
  210.    if (reverse < 0) {
  211.       if ((option = XGetDefault(progname,"ReverseVideo")) != NULL)
  212.          if (strcmp(option,"on")) reverse = 1;
  213.    }
  214.    if (!geometry) {
  215.       option = XGetDefault(progname,"Geometry");
  216.       geometry = option ? option : "=+5+5";
  217.    }
  218.    if (!font_name) {
  219.       /* option = XGetDefault(progname,"BodyFont"); */
  220.       font_name = DEFAULT_FONT;
  221.    }
  222.    if (!border_color) {
  223.       option = XGetDefault(progname,"Border");
  224.       border_color = option ? option : DEFAULT_BORDER_COLOR;
  225.    }
  226.    if (!back_color) {
  227.       option = XGetDefault(progname,"Background");
  228.       back_color = option ? option : DEFAULT_BACK_COLOR;
  229.    }
  230.    if (!fore_color) {
  231.       option = XGetDefault(progname,"Foreground");
  232.       fore_color = option ? option : DEFAULT_FORE_COLOR;
  233.    }
  234.    if (!mouse_color) {
  235.       option = XGetDefault(progname,"Mouse");
  236.       mouse_color = option ? option : DEFAULT_MOUSE_COLOR;
  237.    }
  238.    if (!icon_color) {
  239.       option = XGetDefault(progname,"Icon");
  240.       icon_color = option ? option : DEFAULT_ICON_COLOR;
  241.    }
  242.    if (border_width <= 0) {
  243.       option = XGetDefault(progname,"BorderWidth");
  244.       border_width = option ? atoi(option) : DEFAULT_BORDER_WIDTH;
  245.    }
  246. }
  247.  
  248.  
  249. /* Allocate colors */
  250. Alloc_Colors()
  251. {
  252.    Color      cdef;
  253.  
  254.    /*if DisplayCells are less or equal to 2, then on monochrome display */
  255.    if (DisplayCells() <= 2) {                 
  256.       background =  BlackPixel;
  257.       foreground =  WhitePixel;
  258.       mouseground = WhitePixel;
  259.       color1 = foreground;
  260.       color2 = foreground;
  261.       color3 = foreground;
  262.       color4 = foreground;
  263.       color5 = foreground;
  264.       border_pixmap = XMakePixmap(XStoreBitmap(16,16,gray_bits),
  265.                                          BlackPixel,WhitePixel);
  266.       icon_border_pixmap = border_pixmap;
  267.    } else if (DisplayCells() > 2) {
  268.    /*if DisplayCells are greater than 2, then on color display */
  269.       if (XParseColor(back_color,&cdef) && XGetHardwareColor(&cdef))
  270.          background = cdef.pixel;
  271.       if (XParseColor(fore_color,&cdef) && XGetHardwareColor(&cdef))
  272.          foreground = cdef.pixel;
  273.       if (XParseColor(mouse_color,&cdef)&&XGetHardwareColor(&cdef))
  274.          mouseground = cdef.pixel;
  275.       if (XParseColor("yellow",&cdef)&&XGetHardwareColor(&cdef))
  276.          color1 = cdef.pixel;
  277.       if (XParseColor("cyan",&cdef)&&XGetHardwareColor(&cdef))
  278.          color2 = cdef.pixel;
  279.       if (XParseColor("green",&cdef)&&XGetHardwareColor(&cdef))
  280.          color3 = cdef.pixel;
  281.       if (XParseColor("red",&cdef)&&XGetHardwareColor(&cdef))
  282.          color4 = cdef.pixel;
  283.       if (XParseColor("blue",&cdef)&&XGetHardwareColor(&cdef))
  284.          color5 = cdef.pixel;
  285.       if (XParseColor(border_color,&cdef)&& XGetHardwareColor(&cdef))
  286.          border_pixmap = XMakeTile(cdef.pixel);
  287.       if (XParseColor(icon_color,&cdef) && XGetHardwareColor(&cdef))
  288.          icon_border_pixmap = XMakeTile(cdef.pixel);
  289.    }
  290.  
  291.    if (reverse) {
  292.       highlight  = background;
  293.       background = foreground;
  294.       foreground = highlight;
  295.       if (mouseground == background) mouseground = foreground;
  296.       color1 = foreground;
  297.       color2 = foreground;
  298.       color3 = foreground;
  299.       color4 = foreground;
  300.       color5 = foreground;
  301.    } else
  302.       highlight = foreground;
  303. }
  304.  
  305.  
  306. /* 
  307.  * Event handling. Presents a uniform event interface, and
  308.  * handles all other events in here. Only sees the events
  309.  * that affect it directly. They are:
  310.  *
  311.  *      keypresses 
  312.  *      mouse button clicks
  313.  *
  314.  * All other events should be swallowed by this routine. 
  315.  */
  316.  
  317. NextEvent()
  318. {
  319.    XEvent  xEvent;
  320.    int     event;
  321.  
  322.    while (1) {
  323.       if (XPending()) {
  324.          XNextEvent(&xEvent);
  325.          switch (xEvent.type) {
  326.          case KeyPressed:
  327.             event = 0;
  328.             switch(((XKeyEvent *) &xEvent)->detail&0xff) {
  329.             case KC_A:
  330.             case KC_KEYPAD_4:     event = EVENT_A;    return(event);
  331.             case KC_S:
  332.             case KC_KEYPAD_5:     event = EVENT_S;    return(event);
  333.             case KC_D:
  334.             case KC_KEYPAD_6:     event = EVENT_D;    return(event);
  335.             case KC_F:
  336.             case KC_KEYPAD_COMMA: event = EVENT_F;    return(event);
  337.             case KC_BAR:
  338.             case KC_CURSOR_RIGHT: event = EVENT_BAR;  return(event);
  339.             case KC_B:            event = EVENT_B;    return(event);
  340.             case KC_C:            event = EVENT_C;    return(event);
  341.             case KC_E:            event = EVENT_E;    return(event);
  342.             case KC_G:            event = EVENT_G;    return(event);
  343.             case KC_H:            event = EVENT_H;    return(event);
  344.             case KC_I:            event = EVENT_I;    return(event);
  345.             case KC_J:            event = EVENT_J;    return(event);
  346.             case KC_K:            event = EVENT_K;    return(event);
  347.             case KC_L:            event = EVENT_L;    return(event);
  348.             case KC_M:            event = EVENT_M;    return(event);
  349.             case KC_N:            event = EVENT_N;    return(event);
  350.             case KC_O:            event = EVENT_O;    return(event);
  351.             case KC_P:            event = EVENT_P;    return(event);
  352.             case KC_R:            event = EVENT_R;    return(event);
  353.             case KC_T:            event = EVENT_T;    return(event);
  354.             case KC_U:            event = EVENT_U;    return(event);
  355.             case KC_V:            event = EVENT_V;    return(event);
  356.             case KC_W:            event = EVENT_W;    return(event);
  357.             case KC_X:            event = EVENT_X;    return(event);
  358.             case KC_Y:            event = EVENT_Y;    return(event);
  359.             case KC_Z:            event = EVENT_Z;    return(event);
  360.             case KC_Q:
  361.             case KC_DEL:          event = EVENT_INT;  return(event);
  362.             }
  363.             break;
  364.  
  365. #define RightButton   0
  366. #define MiddleButton  1
  367. #define LeftButton    2
  368.  
  369.          case ButtonPressed:
  370.             event = 0;
  371.             switch(((XButtonPressedEvent *) &xEvent)->detail&0xff) {
  372.             case RightButton:     event = EVENT_RIGHT_D;   return(event);
  373.             case MiddleButton:    event = EVENT_MIDDLE_D;  return(event);
  374.             case LeftButton:      event = EVENT_LEFT_D;    return(event);
  375.             }
  376.             break;
  377.  
  378.          case ButtonReleased:
  379.             event = 0;
  380.             switch(((XButtonReleasedEvent *) &xEvent)->detail&0xff) {
  381.             case RightButton:     event = EVENT_RIGHT_U;   return(event);
  382.             case LeftButton:      event = EVENT_LEFT_U;    return(event);
  383.             }
  384.             break;
  385.  
  386.          case EnterWindow:
  387.             break;
  388.  
  389.          case LeaveWindow:
  390.             break;
  391.  
  392.          case ExposeWindow:
  393.             if (((XExposeWindowEvent *)&xEvent)->window == iconWindow) {
  394.                repaintIcon();
  395.                break;
  396.             }
  397.             repaintWindow();
  398.             break;
  399.  
  400.          case UnmapWindow:
  401.             break;
  402.          }
  403.       }
  404.    }
  405. }
  406.  
  407. /* Actually put up the pictures on the screen */
  408. repaintWindow()
  409. {
  410.    /* graphics routine */
  411.    ShowView(); 
  412. }
  413.  
  414. repaintIcon()
  415. {
  416. XBitmapBitsPut(iconWindow, 0, 0, icon_width, icon_height, icon_bits,
  417.                iconFore, iconBack, iconMask, GXcopy, AllPlanes);
  418. }
  419.  
  420.  
  421. RunOps()
  422. {
  423.    int event;
  424.    double theta = 0.0;
  425.    double phi   = 0.0;
  426.    double conv;
  427.  
  428.    conv = 3.14159/180.0;
  429.  
  430.    while(1) {
  431.       event = NextEvent();
  432.       switch (event) {
  433.       case EVENT_LEFT_D    :
  434.       case EVENT_RIGHT_D   : 
  435.       case EVENT_MIDDLE_D  :
  436.       case EVENT_INT       : XDestroyWindow(mwWindow);
  437.                              XFlush(); 
  438.                              return; break;
  439.       case EVENT_L  : theta = theta + 10*conv; 
  440.                       read_view(theta,phi); 
  441.                       ShowView();
  442.                       break;
  443.       case EVENT_J  : phi = phi - 10*conv; 
  444.                       read_view(theta,phi); 
  445.                       ShowView();
  446.                       break;
  447.       case EVENT_K  : phi = phi + 10*conv; 
  448.                       read_view(theta,phi); 
  449.                       ShowView();
  450.                       break;
  451.       case EVENT_H  : theta = theta - 10*conv; 
  452.                       read_view(theta,phi); 
  453.                       ShowView();
  454.                       break;
  455.       case EVENT_O  : theta = 0.0;  phi = 0.0;
  456.                       read_view(theta,phi); 
  457.                       ShowView();
  458.                       break;
  459.       case EVENT_F  : theta = theta + 90*conv; 
  460.                       read_view(theta,phi); 
  461.                       ShowView();
  462.                       break;
  463.       case EVENT_S  : phi = phi - 90*conv; 
  464.                       read_view(theta,phi); 
  465.                       ShowView();
  466.                       break;
  467.       case EVENT_D  : phi = phi + 90*conv; 
  468.                       read_view(theta,phi); 
  469.                       ShowView();
  470.                       break;
  471.       case EVENT_A  : theta = theta - 90*conv; 
  472.                       read_view(theta,phi); 
  473.                       ShowView();
  474.                       break;
  475.       case EVENT_BAR:
  476.       default       : break;
  477.       }
  478.    }
  479. }
  480.  
  481. ShowView()
  482. {
  483.    char       *text;
  484.    int        text_len, width;
  485.  
  486.    XClear(viewWindow);
  487.    text = "Type 'q' or 'Q' to quit";
  488.    text_len = strlen(text);
  489.    width = XStringWidth(text,fontInfo,0,0);
  490.    XText(mwWindow,(X_DIM-width)/2,5,text,text_len,
  491.          fontInfo->id,foreground,background);
  492.    axesX();
  493.    plotX();
  494. }
  495.  
  496. axesX()
  497. {
  498.    xyzdata  midpoint();
  499.    char     *sprintf(), *strcpy();
  500.  
  501.    extern   double   xmin, ymin, zmin, xmax, ymax, zmax;
  502.  
  503.    int      text_len, text_width, char_width;
  504.    int      posx, posy, i;
  505.    double   xtmp, ytmp, ztmp, dl, ratio, vallbl;
  506.    xyzdata  mpt;
  507.    char     text[100];
  508.  
  509.    char_width = XStringWidth("a",fontInfo,0,0);
  510.  
  511.    /* Draw the axes - parallel to X */
  512.    draw_Xline(xmin,ymin,zmin,xmax,ymin,zmin,1);
  513.    draw_Xline(xmin,ymax,zmin,xmax,ymax,zmin,2);
  514.    draw_Xline(xmin,ymin,zmax,xmax,ymin,zmax,1);
  515.    draw_Xline(xmin,ymax,zmax,xmax,ymax,zmax,1);
  516.  
  517.    /* Draw the axes - parallel to Y */
  518.    draw_Xline(xmin,ymin,zmin,xmin,ymax,zmin,1);
  519.    draw_Xline(xmax,ymin,zmin,xmax,ymax,zmin,2);
  520.    draw_Xline(xmin,ymin,zmax,xmin,ymax,zmax,1);
  521.    draw_Xline(xmax,ymin,zmax,xmax,ymax,zmax,1);
  522.  
  523.    /* Draw the axes - parallel to Z */
  524.    draw_Xline(xmin,ymin,zmin,xmin,ymin,zmax,1);
  525.    draw_Xline(xmax,ymin,zmin,xmax,ymin,zmax,2);
  526.    draw_Xline(xmin,ymax,zmin,xmin,ymax,zmax,1);
  527.    draw_Xline(xmax,ymax,zmin,xmax,ymax,zmax,1);
  528.  
  529.    /* Find midpoints of lines */
  530.    mpt = midpoint(xmin,ymax,zmin,xmax,ymax,zmin,0.5);
  531.  
  532.    /* X-Axis Label */
  533.    strcpy(text,"X");
  534.    text_len = strlen(text);
  535.    text_width = XStringWidth(text,fontInfo,0,0);
  536.    posx = (int)(mpt.x) - char_width/2;
  537.    posy = Y_DIM - (int)(mpt.y) + char_width;
  538.    XText(viewWindow,posx,posy,text,text_len,
  539.          fontInfo->id,foreground,background);
  540.  
  541.    /* Find midpoints of lines */
  542.    mpt = midpoint(xmax,ymin,zmin,xmax,ymax,zmin,0.5);
  543.  
  544.    /* Y-Axis Label */
  545.    strcpy(text,"Y");
  546.    text_len = strlen(text);
  547.    text_width = XStringWidth(text,fontInfo,0,0);
  548.    posx = (int)(mpt.x) - char_width/2;
  549.    posy = Y_DIM - (int)(mpt.y) + char_width;
  550.    XText(viewWindow,posx,posy,text,text_len,
  551.          fontInfo->id,foreground,background);
  552.  
  553.    /* Find midpoints of lines */
  554.    mpt = midpoint(xmax,ymin,zmin,xmax,ymin,zmax,0.5);
  555.  
  556.    /* Z-Axis Label */
  557.    strcpy(text,"Z");
  558.    text_len = strlen(text);
  559.    text_width = XStringWidth(text,fontInfo,0,0);
  560.    posx = (int)(mpt.x) - 2*char_width;
  561.    posy = Y_DIM - (int)(mpt.y) + char_width;
  562.    XText(viewWindow,posx,posy,text,text_len,
  563.          fontInfo->id,foreground,background);
  564.  
  565.    /* Draw the tick marks */
  566.    dl    = 0.1*(xmax-xmin);
  567.    for (i=0; i<=xticks; i++) {
  568.       ratio = i/(double)xticks;
  569.       xtmp = xmin + (xmax-xmin)*ratio;
  570.       draw_Xline(xtmp,ymax,zmin,xtmp,ymax+dl,zmin,2);
  571.       mpt = midpoint(xmin,ymax,zmin,xmax,ymax,zmin,ratio);
  572.       vallbl = xtmp;
  573.       sprintf(text,"%6.2f",vallbl);
  574.       text_len = strlen(text);
  575.       text_width = XStringWidth(text,fontInfo,0,0);
  576.       posx = (int)(mpt.x) + 8;
  577.       posy = Y_DIM - (int)(mpt.y)+10;
  578.       XText(viewWindow,posx,posy,text,text_len,
  579.             fontInfo->id,foreground,background);
  580.    }
  581.    for (i=0; i<=yticks; i++) {
  582.       ratio = i/(double)yticks;
  583.       ytmp = ymin + (ymax-ymin)*ratio;
  584.       draw_Xline(xmax,ytmp,zmin,xmax+dl,ytmp,zmin,2);
  585.       mpt = midpoint(xmax,ymin,zmin,xmax,ymax,zmin,ratio);
  586.       vallbl = ytmp;
  587.       sprintf(text,"%6.2f",vallbl);
  588.       text_len = strlen(text);
  589.       text_width = XStringWidth(text,fontInfo,0,0);
  590.       posx = (int)(mpt.x) - (int)(1.5*text_width);
  591.       posy = Y_DIM - (int)(mpt.y) + 10;
  592.       XText(viewWindow,posx,posy,text,text_len,
  593.             fontInfo->id,foreground,background);
  594.    }
  595.    for (i=0; i<=zticks; i++) {
  596.       ratio = i/(double)zticks;
  597.       ztmp = zmin + (zmax-zmin)*ratio;
  598.       draw_Xline(xmax,ymin,ztmp,xmax,ymin-dl,ztmp,2);
  599.       mpt = midpoint(xmax,ymin,zmin,xmax,ymin,zmax,ratio);
  600.       vallbl = ztmp;
  601.       sprintf(text,"%6.2f",vallbl);
  602.       text_len = strlen(text);
  603.       text_width = XStringWidth(text,fontInfo,0,0);
  604.       posx = (int)(mpt.x) - (int)(1.5*text_width);
  605.       posy = Y_DIM - (int)(mpt.y) - 20;
  606.       XText(viewWindow,posx,posy,text,text_len,
  607.             fontInfo->id,foreground,background);
  608.    }
  609. }
  610.  
  611. draw_Xline(x1, y1, z1, x2, y2, z2, ithk)
  612. double x1, y1, z1, x2, y2, z2;
  613. int ithk;
  614. {
  615.    xyzdata point1, point2, newpt1, newpt2;
  616.    xyzdata transform_point();
  617.    int     ix1, iy1, ix2, iy2;
  618.  
  619.    point1.x = x1;
  620.    point1.y = y1;
  621.    point1.z = z1;
  622.  
  623.    point2.x = x2;
  624.    point2.y = y2;
  625.    point2.z = z2;
  626.  
  627.    newpt1 = transform_point(point1,view_transfo);
  628.    newpt2 = transform_point(point2,view_transfo);
  629.  
  630.    ix1 = (int)newpt1.x;
  631.    iy1 = Y_DIM-(int)newpt1.y;
  632.    ix2 = (int)newpt2.x;
  633.    iy2 = Y_DIM-(int)newpt2.y;
  634.  
  635.    /* draw the line */
  636.    XLine(viewWindow,ix1,iy1,ix2,iy2,
  637.          ithk,ithk,foreground,GXcopy,AllPlanes);
  638. }
  639.  
  640. plotX()
  641. {
  642.    xyzdata transform_point();
  643.  
  644.    extern double   xmin, ymin, zmin, xmax, ymax, zmax;
  645.    extern int     line, linechange;
  646.    extern int     marker, markerchange;
  647.    extern int     linetyp[MAXTYPE],markertype[MAXTYPE];
  648.    extern int     hiddenline, quick_sort;
  649.    extern segmptr segmhead;
  650.  
  651.    Vertex  vlist[MAXPTS];
  652.    segmptr S;
  653.    nodeptr Nd;
  654.    int     kl, km;
  655.    int     j,npts,linepattern;
  656.    xyzdata point, newpt;
  657.  
  658.    if (hiddenline==ON) {
  659.       /* sort the mesh */
  660.       if (quick_sort)
  661.          do_quick_sort();
  662.       else
  663.          bubble_sort();
  664.    }
  665.  
  666.    kl = linetype[0];
  667.    km = markertype[0];
  668.    S  = segmhead;
  669.    for ( ; S!=NULL; S=S->next) {
  670.       /* rescale points */
  671.       j = 0;
  672.       for (Nd=S->head; Nd!=NULL; Nd=Nd->next) {
  673.          point.x = Nd->x;
  674.          point.y = Nd->y;
  675.          point.z = Nd->z;
  676.          newpt = transform_point(point,view_transfo);
  677.          vlist[j].x = (int)newpt.x;
  678.          vlist[j].y = Y_DIM - (int)newpt.y;
  679.          vlist[j].flags = 0;
  680.          j++;
  681.       }
  682.       npts = j;
  683.  
  684.       /* plot the points */
  685.       if (line == ON) {
  686.          linepattern = linetypX(kl);
  687.          if (hiddenline == ON) 
  688.             XDrawFilled(viewWindow,vlist,npts,color2,GXcopy,AllPlanes);
  689.          XDrawDashed(viewWindow,vlist,npts,1,1,
  690.                      color1,linepattern,GXcopy,AllPlanes);
  691.       }
  692.       
  693.  
  694.       if (marker == ON) {
  695.          km = km % 5;
  696.          switch (km) {
  697.          case 0 : for (j=0; j < npts; j++) 
  698.                      XLine(viewWindow,
  699.                      vlist[j].x,vlist[j].y,vlist[j].x,vlist[j].y,
  700.                      1,1,foreground,GXcopy,AllPlanes);
  701.                   break;
  702.          case 1 : for (j=0; j < npts; j++) 
  703.                      XLine(viewWindow,
  704.                      vlist[j].x-1,vlist[j].y-1,vlist[j].x-1,vlist[j].y-1,
  705.                      3,3,foreground,GXcopy,AllPlanes);
  706.                   break;
  707.          case 2 : for (j=0; j < npts; j++) {
  708.                      XLine(viewWindow,
  709.                      vlist[j].x-2,vlist[j].y-2,vlist[j].x+2,vlist[j].y+2,
  710.                      1,1,foreground,GXcopy,AllPlanes);
  711.                      XLine(viewWindow,
  712.                      vlist[j].x+2,vlist[j].y-2,vlist[j].x-2,vlist[j].y+2,
  713.                      1,1,foreground,GXcopy,AllPlanes);
  714.                   }
  715.                   break;
  716.          case 3 : for (j=0; j < npts; j++) {
  717.                      XLine(viewWindow,
  718.                      vlist[j].x-2,vlist[j].y-2,vlist[j].x-2,vlist[j].y+2,
  719.                      1,1,foreground,GXcopy,AllPlanes);
  720.                      XLine(viewWindow,
  721.                      vlist[j].x-2,vlist[j].y+2,vlist[j].x+2,vlist[j].y+2,
  722.                      1,1,foreground,GXcopy,AllPlanes);
  723.                      XLine(viewWindow,
  724.                      vlist[j].x+2,vlist[j].y+2,vlist[j].x+2,vlist[j].y-2,
  725.                      1,1,foreground,GXcopy,AllPlanes);
  726.                      XLine(viewWindow,
  727.                      vlist[j].x+2,vlist[j].y-2,vlist[j].x-2,vlist[j].y-2,
  728.                      1,1,foreground,GXcopy,AllPlanes);
  729.                   }
  730.                   break;
  731.          case 4 : for (j=0; j < npts; j++) {
  732.                      XLine(viewWindow,
  733.                      vlist[j].x  ,vlist[j].y-2,vlist[j].x+2,vlist[j].y  ,
  734.                      1,1,foreground,GXcopy,AllPlanes);
  735.                      XLine(viewWindow,
  736.                      vlist[j].x+2,vlist[j].y  ,vlist[j].x  ,vlist[j].y+2,
  737.                      1,1,foreground,GXcopy,AllPlanes);
  738.                      XLine(viewWindow,
  739.                      vlist[j].x  ,vlist[j].y+2,vlist[j].x-2,vlist[j].y  ,
  740.                      1,1,foreground,GXcopy,AllPlanes);
  741.                      XLine(viewWindow,
  742.                      vlist[j].x-2,vlist[j].y  ,vlist[j].x  ,vlist[j].y-2,
  743.                      1,1,foreground,GXcopy,AllPlanes);
  744.                   }
  745.                   break;
  746.          }
  747.       }
  748.       if (linechange == ON) kl++;  
  749.       if (markerchange == ON) km++;  
  750.  
  751.    }
  752.    /* redraw some of the axes */
  753.    if (hiddenline==ON) redraw_axesX();
  754. }
  755.  
  756. /* redraw some of the axes, depending on which corner is closest */
  757. redraw_axesX()
  758. {
  759.    xyzdata transform_point();
  760.    extern  double xmin, ymin, zmin, xmax, ymax, zmax;
  761.    xyzdata point;
  762.    double  maxz;
  763.    int     maxpt=0,i,j,k;
  764.  
  765.    maxz = -1.0e10;
  766.    /* find the i,j,k of the closest corner */
  767.    for (i=0; i<2; i++)
  768.    for (j=0; j<2; j++)
  769.    for (k=0; k<2; k++) {
  770.       point.x = xmin + i*(xmax-xmin);
  771.       point.y = ymin + j*(ymax-ymin);
  772.       point.z = zmin + k*(zmax-zmin);
  773.       point = transform_point(point,view_transfo);
  774.       if (point.z > maxz) {
  775.          maxz = point.z;
  776.          maxpt = i+2*j+4*k;
  777.       }
  778.    }
  779.  
  780.    /* find the corresponding point */
  781.    switch (maxpt) {
  782.       case 0 : /* printf("xmin  ymin  zmin\n"); */
  783.                draw_Xline(xmin,ymin,zmin,xmax,ymin,zmin,1);
  784.                draw_Xline(xmin,ymin,zmin,xmin,ymax,zmin,1);
  785.                draw_Xline(xmin,ymin,zmin,xmin,ymin,zmax,1);
  786.                break;
  787.       case 1 : /* printf("xmax  ymin  zmin\n");*/
  788.                draw_Xline(xmax,ymin,zmin,xmin,ymin,zmin,1);
  789.                draw_Xline(xmax,ymin,zmin,xmax,ymax,zmin,2);
  790.                draw_Xline(xmax,ymin,zmin,xmax,ymin,zmax,2);
  791.                break;
  792.       case 2 : /* printf("xmin  ymax  zmin\n"); */
  793.                draw_Xline(xmin,ymax,zmin,xmax,ymax,zmin,2);
  794.                draw_Xline(xmin,ymax,zmin,xmin,ymin,zmin,1);
  795.                draw_Xline(xmin,ymax,zmin,xmin,ymax,zmax,1);
  796.                break;
  797.       case 3 : /* printf("xmax  ymax  zmin\n"); */
  798.                draw_Xline(xmax,ymax,zmin,xmin,ymax,zmin,2);
  799.                draw_Xline(xmax,ymax,zmin,xmax,ymin,zmin,2);
  800.                draw_Xline(xmax,ymax,zmin,xmax,ymax,zmax,1);
  801.                break;
  802.       case 4 : /* printf("xmin  ymin  zmax\n"); */
  803.                draw_Xline(xmin,ymin,zmax,xmax,ymin,zmax,1);
  804.                draw_Xline(xmin,ymin,zmax,xmin,ymax,zmax,1);
  805.                draw_Xline(xmin,ymin,zmax,xmin,ymin,zmin,1);
  806.                break;
  807.       case 5 : /* printf("xmax  ymin  zmax\n"); */
  808.                draw_Xline(xmax,ymin,zmax,xmin,ymin,zmax,1);
  809.                draw_Xline(xmax,ymin,zmax,xmax,ymax,zmax,1);
  810.                draw_Xline(xmax,ymin,zmax,xmax,ymin,zmin,2);
  811.                break;
  812.       case 6 : /* printf("xmin  ymax  zmax\n"); */
  813.                draw_Xline(xmin,ymax,zmax,xmax,ymax,zmax,1);
  814.                draw_Xline(xmin,ymax,zmax,xmin,ymin,zmax,1);
  815.                draw_Xline(xmin,ymax,zmax,xmin,ymax,zmin,1);
  816.                break;
  817.       case 7 : /* printf("xmax  ymax  zmax\n"); */
  818.                draw_Xline(xmin,ymax,zmax,xmax,ymax,zmax,1);
  819.                draw_Xline(xmax,ymin,zmax,xmax,ymax,zmax,1);
  820.                draw_Xline(xmax,ymax,zmin,xmax,ymax,zmax,1);
  821.                break;
  822.       default: break;
  823.    }
  824. }
  825.  
  826. linetypX(linetyp)
  827. int linetyp;
  828. {
  829.    int linepat;
  830.  
  831.    linetyp = linetyp % 7;
  832.    switch (linetyp) {
  833.    case 0 : linepat = SolidLine; break;
  834.    case 1 : linepat = DashedLine; break;
  835.    case 2 : linepat = DottedLine; break;
  836.    case 3 : linepat = DotDashLine; break;
  837.    case 4 : linepat = Dashed_1; break;
  838.    case 5 : linepat = Dashed_2; break;
  839.    case 6 : linepat = Dashed_3; break;
  840.    }
  841.    return(linepat);
  842. }
  843.