Fix test win64b: test_run('graphics', 'contour2d')
[scilab.git] / scilab / modules / graphics / macros / contour.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2011 - DIGITEO - Michael Baudin
4 // Copyright (C) 2012 - DIGITEO - Allan CORNET
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10
11 function contour(x, y, z, nz, theta, alpha, leg, flag, ebox, zlev)
12
13   function contour_demo()
14     function z = Surf1(x, y)
15       z = x.^2 + y.^3;
16     endfunction
17
18     function z = Surf2(x, y)
19       z = x.^2 + y.^2;
20     endfunction
21
22     x = -1:0.1:1;
23     y = x;
24     z = eval3d(Surf2, x, y)
25
26     //scf();
27     subplot(211);
28     contour(x, y, Surf1, 10);
29     subplot(212);
30     plot3d(x, y, z);
31     contour(x, y, z + 0.1, 10, flag = [0 2 4]);
32   endfunction
33
34   rhs = argn(2);
35
36   // demo
37   if rhs == 0 then
38     contour_demo();
39     return
40   end
41
42   if rhs < 4 then
43     error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "contour", 4));
44   end
45
46   if type(x) <> 1 then
47     error(999, msprintf(gettext("%s: Wrong type for input argument #%d: Real vector expected.\n"), "contour", 1));
48   end
49
50   if type(y) <> 1 then
51     error(999, msprintf(gettext("%s: Wrong type for input argument #%d: Real vector expected.\n"), "contour", 2));
52   end
53
54   if type(z) <> 1 & type(z) <> 13 then
55     error(999, msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix or Scilab function expected.\n"), "contour", 3));
56   end
57
58   if type(nz) <> 1 then
59     error(999, msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix expected.\n"), "contour", 4));
60   end
61
62   if ~isvector(x) then
63     error(999, msprintf(gettext("%s: Wrong size for input argument #%d: Real vector expected.\n"), "contour", 1));
64   end
65
66   if ~isvector(y) then
67     error(999, msprintf(gettext("%s: Wrong size for input argument #%d: Real vector expected.\n"), "contour", 2));
68   end
69
70   levels = [];
71
72   opts = [];
73   if exists('theta', 'local') == 1 then
74     opts = [opts, 'theta=theta'];
75   end
76   if exists('alpha', 'local') == 1 then
77     opts = [opts, 'alpha=alpha'];
78   end
79   if exists('leg'  , 'local') == 1 then
80     opts = [opts, 'leg=leg'];
81   end
82   if exists('ebox' , 'local') == 1 then
83     opts = [opts, 'ebox=ebox'];
84   end
85   if exists('flag' , 'local') == 0 then
86     flag = [2 2 3];
87   end
88   if exists('zlev' , 'local') == 0 then
89     zlev = 0;
90   end
91
92   if or(type(z) == [11 13]) then
93     fun = z;
94     clear z //to avoid redfinition warning
95     if type(fun) == 11 then
96       comp(fun);
97     end
98     z = feval(x, y, fun);
99   end
100
101   job = flag(1);
102   if rhs == 4 | job == 2 then
103     contour2d(x, y, z, nz);
104     return;
105   end
106
107   if size(nz, '*') == 1 then
108     style = 1:nz;
109   else
110     style = 1:size(nz, '*');
111   end
112
113   opts = strcat([opts, 'flag=flag(2:3)'], ',');
114
115   [xc, yc] = contour2di(x, y, z, nz);
116
117   fig = gcf();
118   a = gca();
119   fg = a.foreground;
120   v = fig.immediate_drawing;
121   fig.immediate_drawing = "off";
122   cnt = 0;
123
124   fpf = xget("fpf");
125   if fpf == '' then
126    fpf = '%.2g';
127   end
128   k = 1;
129   n = yc(k);
130   c = 0;
131   level = %inf;
132   while k < length(xc)
133     n = yc(k)
134     if xc(k) ~= level then
135       c = c+1;
136       level = xc(k);
137       levels = [level levels];
138       a.foreground = c;
139       if cnt > 0 then
140         glue(a.children(1:cnt));
141         cnt = 0;
142       end
143     end
144
145     if job == 1 then
146       zz = zlev;
147     else
148       zz = level;
149     end
150     execstr('param3d(xc(k + (1:n)), yc(k + (1:n)), zz * ones(1, n), ' + opts + ')');
151
152     cnt = cnt + 1;
153     if stripblanks(fpf) <> '' then
154       // don't clip as in contour2d since we are in 3D here
155       // and stringbox gives data in 2D
156       xstring(xc(k + 1 + n / 2), yc(k + 1 + n/2), " " + msprintf(fpf, level));
157       e = gce();
158       e.data(3) = zz;
159       e.clip_state = "off";
160       cnt = cnt + 1;
161     end
162     k = k + n + 1;
163   end
164   if cnt > 0 then
165     glue(a.children(1:cnt));
166     cnt = 0;
167   end
168   set('current_entity', a);
169   a.foreground = fg;
170   if flag(3) == 0 then
171     a.axes_visible = 'off';
172     a.box = 'off';
173   elseif flag(3) == 1 then
174     a.axes_visible = 'off';
175     a.box = 'off';
176   elseif flag(3) == 2 then
177     a.axes_visible = 'off';
178     a.box = 'back_half';
179   elseif flag(3) == 3 then
180     a.axes_visible = 'off';
181     a.box = 'on';
182   elseif flag(3) >= 4 then
183     a.axes_visible = 'on';
184     a.box = 'on';
185   end
186   fig.immediate_drawing = v;
187 endfunction
188