1 | #include "myaxis.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 |
|
---|