34 printf(
"axis_tick_positions(%.10E, %.10E, ticks, %d, sf, td, %d)\n",
35 begin, end, *tick_nr, verbose);
38 if(ticks==NULL || *tick_nr<1)
return(1);
42 if(scale_factor!=NULL) *scale_factor=1.0;
43 if(tick_decimals!=NULL) *tick_decimals=0;
47 step=(end-begin)/(
double)(*tick_nr);
48 if(verbose>1) printf(
" tick_nr:=%d\n step:=%20.10E\n", *tick_nr, step);
52 while(step<=0.5) {step*=10.0; scale/=10.0;}
53 while(step>5.0) {step/=10.0; scale*=10.0;}
54 if(verbose>1) printf(
" scaled_step:=%.10E\n scale:=%E\n", step, scale);
55 if (step<1.0) {step=1.0;}
56 else if(step<2.0) {step=2.0;}
59 printf(
" feasible step:=%g\n", step);
61 ti=0; ticks[ti]=step*scale*ceil(begin/(step*scale));
62 while(ticks[ti]<=(end+(end-begin)*0.00001) && ti<*tick_nr) {
63 ti++; ticks[ti]=ticks[0]+step*scale*(double)ti;
68 printf(
" final tick_nr := %d\n", *tick_nr);
69 printf(
" ticks: %.10E", ticks[0]);
70 for(ti=1; ti<*tick_nr; ti++) printf(
", %.10E", ticks[ti]);
75 if(scale_factor==NULL && tick_decimals==NULL)
return(0);
78 double step_scale=log10(scale);
79 if(verbose>1) printf(
" step_scale=%g\n", step_scale);
83 int tick_scale, scale_dif;
84 if(fabs(ticks[0])>fabs(ticks[*tick_nr-1])) tick_high=ticks[0];
85 else tick_high=ticks[*tick_nr-1];
86 if(verbose>1) printf(
" tick_high := %.10E\n", tick_high);
88 while(fabs(tick_high)<1.0) {tick_high*=10.0; tick_scale--;}
89 while(fabs(tick_high)>=10.0) {tick_high/=10.0; tick_scale++;}
90 if(verbose>1) printf(
" scaled_tick_high := %g\n tick_scale := %d\n", tick_high, tick_scale);
93 scale_dif=tick_scale-step_scale;
94 if(verbose>1) printf(
" scale_dif := %d\n", scale_dif);
96 if(tick_decimals!=NULL) {
97 *tick_decimals=1+scale_dif;
98 if(verbose>1) printf(
" tick_decimals := %d\n", *tick_decimals);
102 if(scale_factor==NULL)
return(0);
103 *scale_factor=tick_scale;
104 if(verbose>1) printf(
" scale_factor := %g\n", *scale_factor);
126 if(verbose>0) printf(
"axis_check_range(%g, %g, %d)\n", *begin, *end, verbose);
130 }
else if(*begin>*end) {
131 temp=*end; *end=*begin; *begin=temp;
134 *begin=-1.0; *end=1.0;
135 }
else if(*begin<0.0) {
136 *begin*=2.0; *end=0.0;
138 *begin=0.0; *end*=2.0;
141 printf(
" new begin := %g\n", *begin);
142 printf(
" new end := %g\n", *end);
147 if((*end-*begin)<1.0e-98) {
148 if(*begin>=1.0e-98 || *begin<0.0) *begin-=1.0e-98;
149 else if(*begin>=0.0) *begin=0.0;
150 if(*end<=-1.0e-98 || *end>0.0) *end+=1.0e-98;
151 else if(*end<0.0) *end=0.0;
153 printf(
" new begin := %g\n", *begin);
154 printf(
" new end := %g\n", *end);
159 if(*begin>0.0 && *end>0.0) {
160 if((*end-*begin)>3.3*(*begin)) *begin=0.0;
161 }
else if(*begin<0.0 && *end<0.0) {
162 if((*end-*begin)>3.3*(-*end)) *end=0.0;
165 temp=(*end-*begin)*2.0/(fabs(*end)+fabs(*begin));
167 temp=0.5*(*end-*begin)*0.01/temp;
168 if(*begin<0.0 || *begin>temp) *begin-=temp;
else *begin=0.0;
169 if(*end>0.0 || *end<-temp) *end+=temp;
else *end=0.0;
int axis_tick_positions(const double begin, const double end, double *ticks, int *tick_nr, double *scale_factor, int *tick_decimals, int verbose)