4ea9bbd586c8c0ff4cd802ca86363b7f208b3c45
[scilab.git] / scilab / modules / graphics / demos / anim / anim8 / anim8.sci
1 //
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) INRIA
4 // Copyright (C) DIGITEO - 2010 - Allan CORNET
5 //
6 // This file is distributed under the same license as the Scilab package.
7 //
8
9 funcprot(0);
10
11 function demo_riemann()
12
13     global quit_var;
14     global pause_var;
15
16     quit_var  = 0;
17     pause_var = 0;
18
19     // Figure creation
20     // =========================================================================
21     my_handle = scf(100001);
22     clf(my_handle, "reset");
23
24     // Add "see code" menu item
25     // =========================================================================
26     demo_viewCode(SCI+"/modules/graphics/demos/anim/anim8/anim8.sci");
27
28     // Drawlater
29     // =========================================================================
30     my_handle.immediate_drawing = "off";
31
32     // Colormap
33     // =========================================================================
34     my_handle.color_map = rainbowcolormap(128);
35
36     // Compute
37     // =========================================================================
38     [z,s]               = cplxroot(4,35);
39
40     // Draw
41     // =========================================================================
42     cplxmap(z,s,163,69);  //draw
43
44     // Adjust some graphical parameters
45     // =========================================================================
46     my_axe               = gca();
47     my_fac3d             = gce();
48
49     my_handle.axes_size  = [ 600 650 ];
50
51     my_handle.background = -2;                 // white
52     my_axe.background    = -1;                 // gray
53     my_axe.foreground    = 14;                 // white
54     my_fac3d.color_mode  =  1;                 // no lines
55
56     // Drawnow
57     // =========================================================================
58     my_handle.immediate_drawing = "on";
59
60     // Stop => Pushbutton
61     // =========================================================================
62
63     my_quit_button = uicontrol( ..
64     "parent"              , my_handle, ..
65     "style"               , "pushbutton", ..
66     "string"              , "QUIT", ..
67     "units"               , "pixels", ..
68     "position"            , [ 350 15 100 40 ], ..
69     "background"          , [1 1 1], ..
70     "callback"            , "quit_riemann", ..
71     "tag"                 , "pushbutton_bac" ..
72     );
73
74     my_pause_button = uicontrol( ..
75     "parent"              , my_handle, ..
76     "style"               , "pushbutton", ..
77     "string"              , "PAUSE", ..
78     "units"               , "pixels", ..
79     "position"            , [ 150 15 100 40 ], ..
80     "background"          , [1 1 1], ..
81     "callback"            , "pause_riemann", ..
82     "tag"                 , "my_pause_button" ..
83     );
84
85     my_play_button = uicontrol( ..
86     "parent"              , my_handle, ..
87     "style"               , "pushbutton", ..
88     "string"              , "PLAY", ..
89     "units"               , "pixels", ..
90     "position"            , [ 150 15 100 40 ], ..
91     "background"          , [1 1 1], ..
92     "callback"            , "play_riemann", ..
93     "visible"             , "off", ..
94     "tag"                 , "my_play_button" ..
95     );
96
97     realtimeinit(0.01);
98
99     my_rotation_dir = [0 1];
100     my_counter      = 0;
101
102     for k = 1:1000
103
104         if quit_var == 1 then
105             if isHandleExistAndValid("my_handle") then
106                 delete(my_handle);
107             end
108             return;
109         end
110
111         if pause_var == 1 & ~isHandleExistAndValid("my_handle") then
112             return;
113         end
114
115         realtime(k);
116
117         if isHandleExistAndValid("my_pause_button") & ..
118             isHandleExistAndValid("my_pause_button") & ..
119             isHandleExistAndValid("my_quit_button") & ..
120             isHandleExistAndValid("my_handle") then
121
122             if pause_var == 1 then
123                 my_play_button.visible = "on";
124                 my_pause_button.visible = "off";
125             end
126
127             if pause_var == 0 then
128                 if my_pause_button.visible == "off" then
129                     my_play_button.visible   = "off";
130                     my_pause_button.visible  = "on";
131                 end
132
133                 my_axe.rotation_angles = my_axe.rotation_angles + my_rotation_dir;
134                 my_counter = my_counter + 1;
135             end
136
137             if modulo(my_counter,720) == 0 then
138                 my_rotation_dir = [0 1];
139             elseif modulo(my_counter,360) == 0 then
140                 my_rotation_dir = [1 0];
141             end
142         else
143             quit_var = 1;
144         end
145     end
146
147
148 endfunction
149
150
151 function cplxmap(z, w, varargin)
152
153     //cplxmap(z,w,T,A,leg,flags,ebox)
154     //cplxmap Plot a function of a complex variable.
155     //       cplxmap(z,f(z))
156
157     x            = real(z);
158     y            = imag(z);
159     u            = real(w);
160     v            = imag(w);
161
162     my_handle    = gcf();
163     my_color_map = my_handle.color_map;
164     ncols        = size(my_color_map, "r");
165
166     [X, Y, U]    = nf3d(x, y, u);
167     [X, Y, V]    = nf3d(x, y, v);
168     Colors       = sum(V, "r");
169     Colors       = Colors - min(Colors);
170     Colors       = int((ncols-1) * Colors / max(Colors) + 1);
171
172     plot3d(X, Y, list(U, Colors), varargin(:));
173
174 endfunction
175
176 function [z, s] = cplxroot(n, m)
177
178     //cplxroot(n,m,T,A,leg,flags,ebox)
179     //CPLXROOT Riemann surface for the n-th root.
180     //       CPLXROOT(n) renders the Riemann surface for the n-th root.
181     //       CPLXROOT, by itself, renders the Riemann surface for the cube root.
182     //       CPLXROOT(n,m) uses an m-by-m grid.  Default m = 20.
183     // Use polar coordinates, (r,theta).
184     // Cover the unit disc n times.
185     // Copyright INRIA
186
187     [lhs, rhs] = argn(0);
188
189     if rhs  < 1, n = 3; end
190     if rhs  < 2, m = 20; end
191
192     r = (0:m)'/m;
193     theta = - %pi*(-n*m:n*m)/m;
194     z = r * exp(%i*theta);
195     s = r.^(1/n) * exp(%i * theta/n);
196
197 endfunction
198
199 function quit_riemann
200     global quit_var;
201     quit_var = 1;
202 endfunction
203
204 function pause_riemann
205     global pause_var;
206     pause_var = 1;
207 endfunction
208
209 function play_riemann
210     global pause_var;
211     pause_var = 0;
212 endfunction
213
214 function bOK = isHandleExistAndValid(handleName)
215     bOK = is_handle_valid(evstr(handleName)) & (type(evstr(handleName)) == 9) & exists(handleName);
216 endfunction
217
218 funcprot(1);