Fix bug 4658 for xinfo,xsave,sd2sci,graduate,graypolarplot,legend,legends,nf3d ...
[scilab.git] / scilab / modules / graphics / macros / graduate.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 1992 - INRIA - Serge Steer
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at    
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9
10 function [xi,xa,np]=graduate( xmi, xma,n1,n2)
11 // graduate - axis pretty graduations
12 //%Syntax
13 // [xa,xi,np]=graduate( xma, xmi,n1,n2) 
14 // [xa,xi,np]=graduate( xma, xmi)       
15 //%Parameters
16 // xmi, xma : real scalars
17 // n1 , n2  : integer scalars default values 3,10
18 // xi , xa  : real scalars
19 // np       :integer scalar
20 //%Description
21 // graduate looks for the mimimum interval [xi,xa] and a number of tics np
22 // such that:
23 //           xi <= xmi <= xma <= xa
24 //           xa - xi / np  =  k(10**n)  k in [1 3 5]   for an integer n
25 //           n1 <= np <= n2
26 //%Exemple
27 //  y=0:0.33:145.78
28 //  clf();plot2d1('enn',0,y)
29 //  [ymn,ymx,np]=graduate(mini(y),maxi(y))
30 //  rect=[1,ymn,prod(size(y)),ymx];
31 //  clf();plot2d1('enn',0,y,-1,'011',' ',rect,[10,3,10,np])
32
33 // Copyright INRIA
34 //!
35
36
37 kadm=[1,2,5];nadm=prod(size(kadm))
38
39 // test
40 // ----
41 //
42 [lhs,rhs]=argn(0)
43 if rhs <2 then
44   error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "graduate", 2));
45 end
46 if rhs <4 then
47   n1=3
48   n2=10
49 end
50 if  n1 == 0  &  n2 == 0  then
51    k1 = 1
52    k2 = 1
53 else
54    k1 = mini ( abs(n1) , abs(n2) )
55    k1 = maxi (    1    ,     k1  )
56    k2 = maxi ( abs(n1) , abs(n2) )
57 end
58 if xma == xmi then
59    if xma==0 then
60      xma=0.1;xmi=-0.1
61    else
62      xma=xma+xmi/10
63      xmi=xmi-xmi/10
64    end
65 end
66
67 xx0 = maxi ( xma , xmi )
68 xx1 = mini ( xma , xmi )
69 del=abs(xx1-xx0)
70 if abs(xx0-xx1)<=1d-6*maxi(xx0,xx1) then
71   xa = xma
72   xi = xmi
73   np=1
74   return
75 end
76
77 //
78 // boucle sur les pas possibles
79 // ----------------------------
80 //
81 for npi = k1:k2
82
83 //
84 // recherche de l'intervalle [ x1 , x0 ] tel que :
85 //           x1 < xmi < xma < x0
86 //           x0 - x1 / npi  =  k.10**n   k = 1,.,9   n  entier
87 //
88 //
89 // recherche du pas
90 // ----------------
91 // il est compris entre  10**ipa-1  et  10**ipa
92 //
93   if xx0*xx1<0 then
94     pas=maxi(abs([xx0 xx1])/npi)
95   else
96     pas = (xx0-xx1)/npi
97   end
98   ipa = int(log(pas)/log(10))
99   if pas<1 then ipa = ipa - 1,end
100
101   pa2 = 10**ipa
102 //
103   ik=find(pas<=kadm*pa2)
104   if ik==[] then
105     pa2 = 10.0d+00 * pa2
106     ipa = kadm(1)
107     pa1=ipa*pa2
108   else
109     ipa=kadm(ik(1))
110     pa1=ipa*pa2
111   end   
112   while %t
113 //
114 // recherche des extremites
115 // ------------------------
116 //
117     if xx1*xx0<0 then
118         x1 = xx1/pa1
119         np1=int(x1)
120         x1=np1*pa1
121         if x1>xx1 then x1=x1-pa1,end
122     else
123       x1 = xx1/pa2
124       np1=int(x1)
125       x1=np1*pa2
126       if x1>xx1 then x1=x1-pa1,end
127     end
128     x0 = x1+npi*pa1
129
130
131 //
132 // test
133 // ----
134 //
135     if x0<xx0 then
136       ik=find(kadm==ipa)
137       if ik<nadm then 
138         ipa = kadm(ik+1)
139         pa1 = ipa * pa2
140       else
141         ipa = kadm(1)
142         pa1 = 10.0d+00 * pa2
143         pa2 = pa1
144       end
145     else
146       break
147     end
148   end
149   if npi==k1 then 
150     xl=x0-x1
151     xa=x0
152     xi=x1
153     np=k1
154   else
155     if  (x0-x1)< xl then
156       np = npi
157       xl = x0 - x1
158       xa = x0
159       xi = x1
160     end
161   end
162 end
163 endfunction