[1844] | 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 |
|
---|