| 1 | #include "gp_axis.h"
 | 
|---|
| 2 | #include <math.h>
 | 
|---|
| 3 | AXIS axis_array[AXIS_ARRAY_SIZE] = AXIS_ARRAY_INITIALIZER(DEFAULT_AXIS_STRUCT);
 | 
|---|
| 4 | 
 | 
|---|
| 5 | void dummy(){
 | 
|---|
| 6 | 
 | 
|---|
| 7 |   int k=4;
 | 
|---|
| 8 |   
 | 
|---|
| 9 | }
 | 
|---|
| 10 | /*{{{  dbl_raise() used by set_tics */
 | 
|---|
| 11 | /* FIXME HBB 20000426: is this really useful? */
 | 
|---|
| 12 | static double
 | 
|---|
| 13 | dbl_raise(x, y)
 | 
|---|
| 14 | double x;
 | 
|---|
| 15 | int y;
 | 
|---|
| 16 | {
 | 
|---|
| 17 |     register int i = abs(y);
 | 
|---|
| 18 |     double val = 1.0;
 | 
|---|
| 19 | 
 | 
|---|
| 20 |     while (--i >= 0)
 | 
|---|
| 21 |         val *= x;
 | 
|---|
| 22 | 
 | 
|---|
| 23 |     if (y < 0)
 | 
|---|
| 24 |         return (1.0 / val);
 | 
|---|
| 25 |     return (val);
 | 
|---|
| 26 | }
 | 
|---|
| 27 | 
 | 
|---|
| 28 | /*}}} */
 | 
|---|
| 29 | 
 | 
|---|
| 30 | /*{{{  set_tic() */
 | 
|---|
| 31 | /* the guide parameter was intended to allow the number of tics
 | 
|---|
| 32 |  * to depend on the relative sizes of the plot and the font.
 | 
|---|
| 33 |  * It is the approximate upper limit on number of tics allowed.
 | 
|---|
| 34 |  * But it did not go down well with the users.
 | 
|---|
| 35 |  * A value of 20 gives the same behaviour as 3.5, so that is
 | 
|---|
| 36 |  * hardwired into the calls to here. Maybe we will restore it
 | 
|---|
| 37 |  * to the automatic calculation one day
 | 
|---|
| 38 |  */
 | 
|---|
| 39 | 
 | 
|---|
| 40 | double
 | 
|---|
| 41 | set_tic(l10, guide)
 | 
|---|
| 42 |      double l10;
 | 
|---|
| 43 |      int guide;
 | 
|---|
| 44 | {
 | 
|---|
| 45 |     double xnorm, tics, posns;
 | 
|---|
| 46 | 
 | 
|---|
| 47 |     int fl = (int) floor(l10);
 | 
|---|
| 48 |     xnorm = pow(10.0, l10 - fl);        /* approx number of decades */
 | 
|---|
| 49 | 
 | 
|---|
| 50 |     posns = guide / xnorm;      /* approx number of tic posns per decade */
 | 
|---|
| 51 | 
 | 
|---|
| 52 |     if (posns > 40)
 | 
|---|
| 53 |         tics = 0.05;            /* eg 0, .05, .10, ... */
 | 
|---|
| 54 |     else if (posns > 20)
 | 
|---|
| 55 |         tics = 0.1;             /* eg 0, .1, .2, ... */
 | 
|---|
| 56 |     else if (posns > 10)
 | 
|---|
| 57 |         tics = 0.2;             /* eg 0,0.2,0.4,... */
 | 
|---|
| 58 |     else if (posns > 4)
 | 
|---|
| 59 |         tics = 0.5;             /* 0,0.5,1, */
 | 
|---|
| 60 |     else if (posns > 1)
 | 
|---|
| 61 |         tics = 1;               /* 0,1,2,.... */
 | 
|---|
| 62 |     else if (posns > 0.5)
 | 
|---|
| 63 |         tics = 2;               /* 0, 2, 4, 6 */
 | 
|---|
| 64 |     else
 | 
|---|
| 65 |         /* getting desperate... the ceil is to make sure we
 | 
|---|
| 66 |          * go over rather than under - eg plot [-10:10] x*x
 | 
|---|
| 67 |          * gives a range of about 99.999 - tics=xnorm gives
 | 
|---|
| 68 |          * tics at 0, 99.99 and 109.98  - BAD !
 | 
|---|
| 69 |          * This way, inaccuracy the other way will round
 | 
|---|
| 70 |          * up (eg 0->100.0001 => tics at 0 and 101
 | 
|---|
| 71 |          * I think latter is better than former
 | 
|---|
| 72 |          */
 | 
|---|
| 73 |         tics = ceil(xnorm);
 | 
|---|
| 74 | 
 | 
|---|
| 75 |     return (tics * dbl_raise(10.0, fl));
 | 
|---|
| 76 | }
 | 
|---|
| 77 | /* this is used in a few places all over the code: undo logscaling of
 | 
|---|
| 78 |  * a given range if necessary. If checkrange is TRUE, will int_error() if
 | 
|---|
| 79 |  * range is invalid */
 | 
|---|
| 80 | void
 | 
|---|
| 81 | axis_unlog_interval(axis, min, max, checkrange)
 | 
|---|
| 82 |     AXIS_INDEX axis;
 | 
|---|
| 83 |     double *min, *max;
 | 
|---|
| 84 |     TBOOLEAN checkrange;
 | 
|---|
| 85 | {
 | 
|---|
| 86 |     if (axis_array[axis].log) {
 | 
|---|
| 87 |       if (checkrange && (*min<= 0.0 || *max <= 0.0))printf(" axis_unlog_interval : range must be > 0 !! \n");
 | 
|---|
| 88 |           /*int_error(NO_CARET,
 | 
|---|
| 89 |                       "%s range must be greater than 0 for log scale",
 | 
|---|
| 90 |                       axis_defaults[axis].name);*/
 | 
|---|
| 91 |         *min = (*min<=0) ? -VERYLARGE : AXIS_DO_LOG(axis,*min);
 | 
|---|
| 92 |         *max = (*max<=0) ? -VERYLARGE : AXIS_DO_LOG(axis,*max);
 | 
|---|
| 93 |     }
 | 
|---|
| 94 | } 
 | 
|---|
| 95 | 
 | 
|---|
| 96 | /*}}} */
 | 
|---|
| 97 | 
 | 
|---|