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