home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 344b.lha / plplot_v2.6 / src / plzbx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-27  |  4.3 KB  |  150 lines

  1. /* This draws a vertical line from (wx,wy1) to (wx,wy2)           */
  2. /*  which represents the vertical axis of a 3-d graph with data   */
  3. /*  values from "vmin" to "vmax". Depending on "opt", ticks and/or*/
  4. /*  subticks are placed on the line at major tick interval "tick" */
  5. /*  with "nsub" subticks between major ticks. If "tick" and/or    */
  6. /*  "nsub" is zero, automatic tick positions are computed         */
  7.  
  8. /* B: Draws left-hand axis*/
  9. /* C: Draws right-hand axis*/
  10. /* I: Inverts tick marks (i.e. drawn to the left)  */
  11. /* L: Logarithmic axes, major ticks at decades, minor ticks at units*/
  12. /* M: Write numeric label on right axis*/
  13. /* N: Write numeric label on left axis*/
  14. /* S: Draw minor tick marks  */
  15. /* T: Draw major tick marks  */
  16. /* U: Writes left-hand label*/
  17. /* V: Writes right-hand label*/
  18.  
  19. #include "plplot.h"
  20. #include <stdio.h>
  21. #include <math.h>
  22.  
  23. #define betw(c,a,b) ((a <= c && c <= b) || (b <= c && c <= a))
  24.  
  25. static PLFLT xlog[8] =
  26.   {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,
  27.    0.903090,0.954243};
  28.  
  29. void plzbx(opt,label,right,dx,dy,wx,wy1,wy2,vmin,vmax,tick,nsub)
  30. char *opt, *label;
  31. PLFLT dx, dy, wx, wy1, wy2, vmin, vmax, tick;
  32. PLINT nsub, right;
  33. {
  34.       static char string[40];
  35.       PLINT lb,lc,li,ll,lm,ln,ls,lt,lu,lv;
  36.       PLINT i, mode, prec;
  37.       PLINT nsub1;
  38.       PLFLT xpmm, ypmm, defmaj, defmin, tick1;
  39.       PLFLT pos, tn, tp, temp;
  40.       PLFLT dwy, lambda, diag, major, minor, xmajor, xminor;
  41.       PLFLT ymajor, yminor, dxm, dym, xscl, xoff, yscl, yoff;
  42.  
  43.       dwy = wy2 - wy1;
  44.  
  45.       /* Tick and subtick sizes in device coords */
  46.  
  47.       gpixmm(&xpmm,&ypmm);
  48.       gmaj(&defmaj,&major);
  49.       gmin(&defmin,&minor);
  50.  
  51.       tick1=tick;
  52.       nsub1=nsub;
  53.  
  54.       lb=stsearch(opt,'b');
  55.       lc=stsearch(opt,'c');
  56.       li=stsearch(opt,'i');
  57.       ll=stsearch(opt,'l');
  58.       lm=stsearch(opt,'m');
  59.       ln=stsearch(opt,'n');
  60.       ls=stsearch(opt,'s');
  61.       lt=stsearch(opt,'t');
  62.       lu=stsearch(opt,'u');
  63.       lv=stsearch(opt,'v');
  64.  
  65.       if (lu && !right)
  66.          plztx("h",dx,dy,wx,wy1,wy2,(PLFLT)5.0,(PLFLT)0.5,(PLFLT)0.5,label);
  67.       if (lv && right)
  68.          plztx("h",dx,dy,wx,wy1,wy2,(PLFLT)-5.0,(PLFLT)0.5,(PLFLT)0.5,label);
  69.  
  70.       if (right && !lc)
  71.          return;
  72.       if (!right && !lb)
  73.          return;
  74.  
  75.       if (ll)
  76.          tick1 = (PLFLT)1.0;
  77.       if (lt)
  78.          pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec);
  79.  
  80.       if ( (li && !right) || (!li && right) ) {
  81.         minor = -minor;
  82.         major = -major;
  83.       }
  84.  
  85.       gwm(&xscl,&xoff,&yscl,&yoff);
  86.       dxm = dx * xscl;
  87.       dym = dy * yscl;
  88.       diag = sqrt(dxm*dxm + dym*dym);
  89.  
  90.       xminor = minor * dxm/diag;
  91.       xmajor = major * dxm/diag;
  92.       yminor = minor * dym/diag;
  93.       ymajor = major * dym/diag;
  94.  
  95.      /* Draw the line */
  96.  
  97.       movwor(wx,wy1);
  98.       if (lt) {
  99.         tp=tick1*floor(vmin/tick1);
  100.         for(;;) {
  101.            tn=tp+tick1;
  102.            if (ls) {
  103.              if (ll) {
  104.                for (i=0; i <= 7; i++) {
  105.                  temp=tp+xlog[i];
  106.                  if (betw(temp,vmin,vmax)) {
  107.                    lambda = (temp-vmin)/(vmax-vmin);
  108.                    plstik(wcmmx(wx),wcmmy((PLFLT)(wy1+lambda*dwy)),xminor,yminor);
  109.                  }
  110.                }
  111.              }
  112.              else  {
  113.                for (i=1; i<= nsub1-1; i++)  {
  114.                  temp=tp+i*tick1/nsub1;
  115.                  if (betw(temp,vmin,vmax)) {
  116.                    lambda = (temp-vmin)/(vmax-vmin);
  117.                    plstik(wcmmx(wx),wcmmy((PLFLT)(wy1+lambda*dwy)),xminor,yminor);
  118.                  }
  119.                }
  120.              }
  121.            }
  122.            temp=tn;
  123.            if (!betw(temp,vmin,vmax))
  124.               break;
  125.            lambda = (temp-vmin)/(vmax-vmin);
  126.            plstik(wcmmx(wx),wcmmy((PLFLT)(wy1+lambda*dwy)),xmajor,ymajor);
  127.            tp=tn;
  128.         }
  129.       }
  130.  
  131.       drawor(wx,wy2);
  132.  
  133.       /* Label the line */
  134.  
  135.       if (ln && lt) {
  136.         tp=tick1*floor(vmin/tick1);
  137.         for(tn=tp+tick1; betw(tn,vmin,vmax); tn+=tick1) {
  138.           if (!ll)
  139.             plform(tn,mode,prec,string);
  140.           else
  141.             sprintf(string,"10#u%d",round(tn));
  142.           pos=(tn-vmin)/(vmax-vmin);
  143.           if (ln && !right)
  144.              plztx("v",dx,dy,wx,wy1,wy2,(PLFLT)0.5,pos,(PLFLT)1.0,string);
  145.           if (lm && right)
  146.              plztx("v",dx,dy,wx,wy1,wy2,(PLFLT)-0.5,pos,(PLFLT)0.0,string);
  147.         }
  148.       }
  149. }
  150.