home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / misc / math / cp / source / drawview.c < prev    next >
C/C++ Source or Header  |  1994-05-01  |  29KB  |  1,285 lines

  1. #include "cp.h"
  2.  
  3. #define SIZETIC  5  /* size major tik in pixels */
  4. #define BOXOFF   10  /* add to filename box size */
  5. #define TIKCOLOR 2  /* color for tiks */
  6. #define BORDER   20 /* size between filename boxes */
  7.  
  8. struct RastPort *rp;
  9. struct ViewPort *vp;
  10.  
  11. struct World wd;
  12. struct CurView cv;
  13.  
  14. WORD WIDTH;
  15. WORD HEIGHT;
  16. WORD OFFSET;
  17.  
  18. WORD xoff;
  19. WORD yoff;
  20.  
  21. LONG precision = 2L;
  22.  
  23. /* Draw everything if full is TRUE autoscale */
  24.  
  25. void DrawView ( BOOL full )
  26. {
  27.  
  28.       vp = &(Scr-> ViewPort); /* Always reinit since could be new screen */
  29.       rp = PlotWindowWnd-> RPort;
  30.  
  31.     if (cv.xmin>=cv.xmax||cv.ymin>=cv.ymax)    FindWorld ();
  32.  
  33.      if( !(IsListEmpty(SetList)))
  34.        {
  35.  
  36.           if( full ) FindWorld ();
  37.     
  38.         if (! HandlePlotWindowIDCMP()) Death(0);
  39.  
  40.           SetAPen(rp,1);
  41.  
  42.           OFFSET = rp->Font->tf_YSize + 2 * BORDER + Scr-> BarHeight;
  43.           HEIGHT = PlotWindowWnd-> Height - OFFSET - ( CPANEL ? 4 : 3 ) * GADHEIGHT;
  44.  
  45.           yoff = OFFSET + HEIGHT;
  46.  
  47.           xoff = rp-> Font-> tf_XSize * 6 + BORDER + SIZETIC;
  48.  
  49.           DrawFileNameBoxes( yoff - HEIGHT);
  50.  
  51.           if ( WIDTH < BORDER || HEIGHT < BORDER ) Death(20);
  52.  
  53.           DrawColorBox( xoff , yoff, WIDTH, HEIGHT, 14);
  54.  
  55.           XAxis();
  56.           YAxis();
  57.           LabelTitle();
  58.           
  59.           DrawAllSets ();
  60.  
  61.           if ( sym ) SymAllSets();
  62.           if ( grid ) Grid();
  63.        }
  64.      else
  65.          Erase( TRUE );
  66. }
  67.  
  68. /* Draw all sets in SetList */
  69.  
  70. void DrawAllSets ()
  71. {
  72. WORD p = 4;
  73. struct Set *node;
  74.  
  75.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  76.        {
  77.  
  78.           SetAPen(rp,min(p,lastcolor));
  79.  
  80.           DrawSet ( node-> FirstPoint );
  81.  
  82.           p++;
  83.  
  84.           if ( p > lastcolor - 2 ) p = 4;
  85.  
  86.              if(! HandlePlotWindowIDCMP())    Death(5);
  87.  
  88.        }
  89. }
  90.  
  91. /* Draw symbols on all sets */
  92.  
  93. void SymAllSets ()
  94. {
  95. struct Set *node;
  96.  
  97.      SetDrMd( rp, JAM2);
  98.  
  99.      if (depth > 2)
  100.           SetAPen(rp,15);
  101.      else
  102.           SetAPen(rp,1);
  103.  
  104.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  105.        {
  106.  
  107.           SymSet ( node-> FirstPoint );
  108.  
  109.              if(! HandlePlotWindowIDCMP())    Death(5);
  110.  
  111.        }
  112. }
  113.  
  114. /* Adjust view so all data sets show */
  115.  
  116. void FindWorld ()
  117. {
  118. struct Set *node;
  119.  
  120.      node = (struct Set *)SetList-> lh_Head;
  121.  
  122.      wd.xmax = node-> xmax;
  123.      wd.xmin = node-> xmin;
  124.      wd.ymax = node-> ymax;
  125.      wd.ymin = node-> ymin;
  126.  
  127.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  128.        {
  129.  
  130.           wd.xmax = max( wd.xmax, node-> xmax);
  131.           wd.xmin = min( wd.xmin, node-> xmin);
  132.           wd.ymax = max( wd.ymax, node-> ymax);
  133.           wd.ymin = min( wd.ymin, node-> ymin);
  134.  
  135.        }
  136.  
  137.      cv.xmax = wd.xmax;
  138.      cv.xmin = wd.xmin;
  139.      cv.ymax = wd.ymax;
  140.      cv.ymin = wd.ymin;
  141.  
  142.      wd.xdelta = wd.xmax - wd.xmin;
  143.      wd.ydelta = wd.ymax - wd.ymin;
  144.  
  145.      cv.xdelta = wd.xdelta;
  146.      cv.ydelta= wd.ydelta;
  147. }
  148.  
  149. /* Draw one set */
  150.  
  151. void DrawSet ( struct Point *ThisPoint )
  152. {
  153. LONG qx, qy;
  154. LONG le, te, re, be;
  155.  
  156. struct Rectangle rect;
  157. struct Region *new_region;
  158. struct Region *old_region;
  159.  
  160.      rect.MinX = xoff;
  161.      rect.MaxX = xoff + WIDTH;
  162.      rect.MinY = yoff - HEIGHT;
  163.      rect.MaxY = yoff;
  164.  
  165.      le = PlotWindowWnd-> LeftEdge;
  166.      te = PlotWindowWnd-> TopEdge;
  167.      re = PlotWindowWnd-> LeftEdge + PlotWindowWnd-> Width;
  168.      be = PlotWindowWnd-> TopEdge + PlotWindowWnd-> Height;
  169.  
  170.      if ( ! (new_region = NewRegion())) return;
  171.  
  172.      if ( ! (OrRectRegion( new_region, &rect))) return;
  173.  
  174.      if (( old_region = InstallClipRegion( PlotWindowWnd-> WLayer, new_region ))) return;
  175.  
  176.      qx = ScaleX( ThisPoint-> xval);
  177.      qy = ScaleY( ThisPoint-> yval);
  178.  
  179.      if ( qx < le ) qx = le;
  180.      if ( qx > re ) qx = re;
  181.      if ( qy < te ) qy = te;
  182.      if ( qy > be ) qy = be;
  183.  
  184.      Move ( rp, qx, qy );
  185.  
  186.      do
  187.        {
  188.  
  189.           ThisPoint = ThisPoint-> NextPoint;
  190.  
  191.           qx = ScaleX( ThisPoint-> xval);
  192.  
  193.           /* need to change if not time sampled data */
  194.           if ( qx < le ) continue;
  195.           if ( qx > re && RealTime ) break;
  196.  
  197.           qy = ScaleY( ThisPoint-> yval);
  198.  
  199.           if ( qy < te ) qy = te;
  200.           if ( qy > be ) qy = be;
  201.  
  202.           Draw ( rp, qx, qy);
  203.  
  204.        } while ( ThisPoint-> NextPoint );
  205.  
  206.      new_region = InstallClipRegion(PlotWindowWnd->WLayer, old_region);
  207.  
  208.      DisposeRegion(new_region);
  209. }
  210.  
  211. /* draw symbols on one set */
  212.  
  213. void SymSet ( struct Point *ThisPoint )
  214. {
  215. LONG qx, qy;
  216. WORD dx, dy;
  217. BOOL clip;
  218.  
  219.      dx = xoff + WIDTH;
  220.      dy = yoff - HEIGHT;
  221.  
  222.      do {
  223.  
  224.  
  225.           clip = FALSE;
  226.  
  227.           qx = ScaleX( ThisPoint-> xval);
  228.           qy = ScaleY( ThisPoint-> yval);
  229.  
  230.           if ( qx < xoff )
  231.             {
  232.                qx = xoff;
  233.                clip = TRUE;
  234.             }
  235.           else if ( qx > dx )
  236.             {
  237.                qx = dx;
  238.                clip = TRUE;
  239.             }
  240.           if ( qy > yoff )
  241.             {
  242.                qy = yoff;
  243.                clip = TRUE;
  244.             }
  245.           else if ( qy < dy )
  246.             {
  247.                qy = dy;
  248.                clip = TRUE;
  249.             }
  250.  
  251.           if ( !clip )
  252.             {
  253.                Move ( rp, qx - 1, qy + 1);
  254.                Draw ( rp, qx + 1, qy - 1);
  255.                Move ( rp, qx + 1, qy + 1);
  256.                Draw ( rp, qx - 1, qy - 1);
  257.             }
  258.  
  259.           ThisPoint = ThisPoint-> NextPoint;
  260.  
  261.      } while ( ThisPoint );
  262. }
  263.  
  264. /* Draw recessed bevel box filled with color */
  265.  
  266. void DrawColorBox ( WORD xs ,WORD ys , WORD xw ,WORD yh, WORD color)
  267. {
  268.  
  269.      SetAPen( rp, (MONO ? 0 : color));
  270.  
  271.      RectFill( rp, xs, ys - yh - 1, xs + xw, ys + 1 );
  272.  
  273.      DrawBevelBox( rp, xs - 2, ys - yh - 1 , xw + 5, yh + 4, GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE);
  274. }
  275.  
  276.  
  277. /* Draw Color boxes with filenames in them */
  278.  
  279. WORD DrawFileNameBoxes( WORD ys)
  280. {
  281. struct Set *node;
  282. struct TextExtent txex;
  283. WORD p = 4, h = 0, w = 0, xs, ns = 0;
  284.  
  285.  
  286.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  287.        {
  288.           TextExtent( rp, node-> fn, strlen( node-> fn ), &txex);
  289.  
  290.           w = max( w, txex.te_Width);
  291.           h = max( h, txex.te_Height);
  292.  
  293.           ns++;
  294.        }
  295.  
  296.      w += BOXOFF;
  297.      h += BOXOFF;
  298.  
  299.      SetBPen( rp, 1);
  300.  
  301.      if ( ns > 1 )
  302.           xs = PlotWindowWnd-> Width - w - BORDER;
  303.      else
  304.        {
  305.           xs = ( PlotWindowWnd-> Width / 2 - w / 2);
  306.           ys = (WORD)(txex.te_Height * 1.5);
  307.        }
  308.  
  309.      WIDTH = PlotWindowWnd-> Width - (ns > 1 ? w + 2 * BORDER : xoff) - xoff; /* if only one set fnbox on top so width = windowwidth - 2*xoff */
  310.  
  311.     Erase(FALSE); /* need to erase before drawing fnboxes but could not get calc width till now */
  312.     
  313.     if (NOFNAME) return((WORD)xoff);
  314.  
  315.      for ( node = (struct Set *)SetList-> lh_Head; node-> snode.ln_Succ; node = (struct Set *)node-> snode.ln_Succ )
  316.        {
  317.           SetAPen( rp, p);
  318.  
  319.           ys += h;
  320.  
  321.           TextExtent( rp, node-> fn, strlen( node-> fn ), &txex);
  322.  
  323.           if ( ns>1 || MONO == FALSE ) DrawColorBox( xs , ys, w, h, p );
  324.  
  325.           SetDrMd( rp, (JAM2 | INVERSVID));
  326.  
  327.           Move ( rp, xs + w/2 - txex.te_Width/2 , ys - BOXOFF / 2 );
  328.           Text( rp, node-> fn, strlen( node-> fn));
  329.  
  330.           ys += BORDER;
  331.  
  332.           SetDrMd( rp, JAM2);
  333.  
  334.           p++;
  335.           if ( p > lastcolor - 2 ) p = 4;
  336.        }
  337.  
  338.      return (WORD)( ns > 1 ? w + 2 * BORDER : xoff );
  339. }
  340.  
  341. /* Adjust xmin and xmax to even nubers and draw tiks with text */
  342.  
  343. void XAxis()
  344. {
  345.      LOGX ? logXAxis() : linXAxis();
  346. }
  347.  
  348. /* Adjust ymin and ymax to even nubers and draw tiks with text */
  349.  
  350. void YAxis()
  351. {
  352.      LOGY ? logYAxis() : linYAxis();
  353. }
  354.  
  355. void logXAxis()
  356. {
  357. LONG j, k, l;
  358. double q, r;
  359. struct TextExtent txex;
  360.  
  361.      /* Cant do negative log scale set lin */
  362.  
  363.      if( cv.xmin <= 0.0 )
  364.        {
  365.           SetWindowTitles( PlotWindowWnd, NULL, "Cant do LOG  X value <= zero" );
  366.           LOGX = FALSE;
  367.           linXAxis();
  368.           return;
  369.        }
  370.  
  371.      j = (LONG) log10( cv.xmin );
  372.      if( log10( cv.xmin ) <= 0.0 ) j-- ;
  373.      cv.xmin = pow( 10.0, (double)j );
  374.  
  375.      k = (LONG) log10( cv.xmax );
  376.