7b9a82f1c92599f60b2f98dcad7f7612198ea906
[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 <4 then
44   n1=3
45   n2=10
46 end
47 if  n1 == 0  &  n2 == 0  then
48    k1 = 1
49    k2 = 1
50 else
51    k1 = mini ( abs(n1) , abs(n2) )
52    k1 = maxi (    1    ,     k1  )
53    k2 = maxi ( abs(n1) , abs(n2) )
54 end
55 if xma == xmi then
56    if xma==0 then
57      xma=0.1;xmi=-0.1
58    else
59      xma=xma+xmi/10
60      xmi=xmi-xmi/10
61    end
62 end
63
64 xx0 = maxi ( xma , xmi )
65 xx1 = mini ( xma , xmi )
66 del=abs(xx1-xx0)
67 if abs(xx0-xx1)<=1d-6*maxi(xx0,xx1) then
68   xa = xma
69   xi = xmi
70   np=1
71   return
72 end
73
74 //
75 // boucle sur les pas possibles
76 // ----------------------------
77 //
78 for npi = k1:k2
79
80 //
81 // recherche de l'intervalle [ x1 , x0 ] tel que :
82 //           x1 < xmi < xma < x0
83 //           x0 - x1 / npi  =  k.10**n   k = 1,.,9   n  entier
84 //
85 //
86 // recherche du pas
87 // ----------------
88 // il est compris entre  10**ipa-1  et  10**ipa
89 //
90   if xx0*xx1<0 then
91     pas=maxi(abs([xx0 xx1])/npi)
92   else
93     pas = (xx0-xx1)/npi
94   end
95   ipa = int(log(pas)/log(10))
96   if pas<1 then ipa = ipa - 1,end
97
98   pa2 = 10**ipa
99 //
100   ik=find(pas<=kadm*pa2)
101   if ik==[] then
102     pa2 = 10.0d+00 * pa2
103     ipa = kadm(1)
104     pa1=ipa*pa2
105   else
106     ipa=kadm(ik(1))
107     pa1=ipa*pa2
108   end   
109   while %t
110 //
111 // recherche des extremites
112 // ------------------------
113 //
114     if xx1*xx0<0 then
115         x1 = xx1/pa1
116         np1=int(x1)
117         x1=np1*pa1
118         if x1>xx1 then x1=x1-pa1,end
119     else
120       x1 = xx1/pa2
121       np1=int(x1)
122       x1=np1*pa2
123       if x1>xx1 then x1=x1-pa1,end
124     end
125     x0 = x1+npi*pa1
126
127
128 //
129 // test
130 // ----
131 //
132     if x0<xx0 then
133       ik=find(kadm==ipa)
134       if ik<nadm then 
135         ipa = kadm(ik+1)
136         pa1 = ipa * pa2
137       else
138         ipa = kadm(1)
139         pa1 = 10.0d+00 * pa2
140         pa2 = pa1
141       end
142     else
143       break
144     end
145   end
146   if npi==k1 then 
147     xl=x0-x1
148     xa=x0
149     xi=x1
150     np=k1
151   else
152     if  (x0-x1)< xl then
153       np = npi
154       xl = x0 - x1
155       xa = x0
156       xi = x1
157     end
158   end
159 end
160 endfunction