ftp.nice.ch/pub/next/unix/developer/plplot.3.0.s.tar.gz#/plplot/src/plxybx.c

This is plxybx.c in view mode; [Download] [Up]

/* This draws a sloping line from (wx1,wy1) to (wx2,wy2)             */
/*  which represents an axis of a 3-d graph with data values from    */
/*  "vmin" to "vmax". Depending on "opt", vertical ticks and/or      */
/*  subticks are placed on the line at major tick interval "tick"    */
/*  with "nsub" subticks between major ticks. If "tick" and/or       */
/*  "nsub" is zero, automatic tick positions are computed            */

/* B: Draw box boundary                                              */
/* I: Inverts tick marks (i.e. drawn downwards)                      */
/* L: Logarithmic axes, major ticks at decades, minor ticks at units */
/* N: Write numeric label                                            */
/* T: Draw major tick marks                                          */
/* S: Draw minor tick marks                                          */
/* U: Write label on line                                            */

#include "plplot.h"
#include <stdio.h>
#include <math.h>

#define  BETW(c,a,b)  ((a <= c && c <= b) || (b <= c && c <= a))

static double xlog[8] =
  {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,0.903090,0.954243};

void plxybx(opt,label,wx1,wy1,wx2,wy2,vmin,vmax,tick,nsub,nolast)
char *opt, *label;
double wx1, wy1, wx2, wy2, vmin, vmax, tick;
int nsub, nolast;
{
      static char string[40];
      int lb,li,ll,ln,ls,lt,lu;
      int major, minor, mode, prec, scal;
      int i, i1, i2, i3, i4;
      int nsub1;
      double xpmm, ypmm, defmaj, defmin, htmaj, htmin, tick1;
      double pos, tn, tp, temp;
      double dwx, dwy, lambda;

      dwx = wx2 - wx1;
      dwy = wy2 - wy1;

/* Tick and subtick sizes in device coords */

      gpixmm(&xpmm,&ypmm);
      gmaj(&defmaj,&htmaj);
      gmin(&defmin,&htmin);

      major=MAX(round(htmaj*ypmm),1);
      minor=MAX(round(htmin*ypmm),1);

      tick1=tick;
      nsub1=nsub;

      lb=stsearch(opt,'b');
      li=stsearch(opt,'i');
      ll=stsearch(opt,'l');
      ln=stsearch(opt,'n');
      ls=stsearch(opt,'s');
      lt=stsearch(opt,'t');
      lu=stsearch(opt,'u');

      if (lu) plxytx(wx1,wy1,wx2,wy2,3.2,0.5,0.5,label);
      if (!lb) return;

      if (ll) tick1 = 1.0;
      if (lt) pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec,&scal);

      if (li) {
        i1 = minor;
        i2 = 0;
        i3 = major;
        i4 = 0;
      }
      else  {
        i1 = 0;
        i2 = minor;
        i3 = 0;
        i4 = major;
      }

/* Draw the line */

      movwor(wx1,wy1);
      if (lt) {
        tp=tick1*floor(vmin/tick1);
lab2:
        tn=tp+tick1;
        if (ls) {
          if (ll) {
            for (i=0; i<=7; i++)  {
              temp=tp+xlog[i];
              if (BETW(temp,vmin,vmax)) {
                lambda = (temp-vmin)/(vmax-vmin);
                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
              }
            }
          }
          else  {
            for(i=1; i <= nsub1-1; i++)  {
              temp=tp+i*(tn-tp)/nsub1;
              if (BETW(temp,vmin,vmax)) {
                lambda = (temp-vmin)/(vmax-vmin);
                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
              }
            }
          }
        }
        temp=tn;
        if (BETW(temp,vmin,vmax)) {
          lambda = (temp-vmin)/(vmax-vmin);
          plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i3,i4);
          tp=tn;
          goto lab2;
        }
      }

      drawor(wx2,wy2);

/* Label the line */

      if (ln && lt) {
        tp=tick1*floor(vmin/tick1);
lab82:
        tn=tp+tick1;
        if (nolast && !BETW(tn+tick1,vmin,vmax)) return;
        if (BETW(tn,vmin,vmax)) {
          if (!ll)
            plform(tn,scal,prec,string);
          else
            sprintf(string,"10#u%-d",round(tn));
          pos=(tn-vmin)/(vmax-vmin);
          plxytx(wx1,wy1,wx2,wy2,1.5,pos,0.5,string);
          tp=tn;
          goto lab82;
        }
        if(!ll && mode) {
          sprintf(string,"E%+d",scal);
          plxytx(wx1,wy1,wx2,wy2,1.5,1.0,0.5,string);
        }
      }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.