9fe93a1d0448ec744ac697024847d4901f61d386
[scilab.git] / scilab / modules / graphics / demos / cmplxfunc / demo_custom.dem.sce
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008 - DIGITEO
3 // Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
4 //
5 // This file is released under the 3-clause BSD license. See COPYING-BSD.
6
7 prot = funcprot();
8 funcprot(0);
9
10 function demo_custom()
11
12     // Parameters
13     // =========================================================================
14
15     frame_w      = 300;     // Frame width
16     frame_h      = 765;     // Frame height
17
18     plot_w       = 500;     // Plot width
19     plot_h       = frame_h; // Plot height
20
21     margin_x     = 15;      // Horizontal margin between each elements
22     margin_y     = 15;      // Vertical margin between each elements
23
24     defaultfont  = "arial"; // Default Font
25
26     // Figure creation
27     // =========================================================================
28
29     axes_w       = 3*margin_x + frame_w + plot_w; // axes width
30     axes_h       = 2*margin_y + frame_h;          // axes height (100 => toolbar height)
31
32     fig_handle = figure( ...
33     "infobar_visible", "off", ...
34     "menubar", "none", ...
35     "toolbar", "none", ...
36     "default_axes", "on", ...
37     "layout", "gridbag", ...
38     "visible", "off", ...
39     "background", -2, ...
40     "figure_position", [0 0], ...
41     "axes_size", [axes_w axes_h], ...
42     "figure_name", _("Customize your complex function"));
43
44     // The plot will be in the right 2/3 of the figure
45     a = gca();
46     a.axes_bounds = [1/3 1 2/3 1];
47     a.tight_limits = "on";
48
49     c = createConstraints("gridbag", [2 1 2 1], [1 1], "vertical", "right");
50     // Create an empty panel on the right to occupy the 3/4 of the screen (figure plot)
51     empty_frame = uicontrol(fig_handle, "style", "frame","constraints", c);
52
53     c = createConstraints("gridbag", [1 1 1 5], [0.25 1], "both", "left", [0 0], [150 0]);
54     u = uicontrol(fig_handle, ...
55     "style", "frame", ...
56     "backgroundcolor", [1 1 1], ...
57     "layout", "border", ...
58     "constraints", c);
59
60     // Add top and bottom empty panels to pad the upcoming control panel
61     c = createConstraints("border", "top", [0 20]);
62     top = uicontrol(u, "style", "frame", "backgroundcolor", [1 1 1], "constraints", c);
63     c = createConstraints("border", "bottom", [0 20]);
64     bottom = uicontrol(u, "style", "frame", "backgroundcolor", [1 1 1], "constraints", c);
65
66     // Border for the control parameters frame
67     b_f_controlParams = createBorderFont("", 18);
68     b_l_controlParams = createBorder("line", "navy", 2);
69     b_controlParams   = createBorder("titled", b_l_controlParams, _("Control panel"), "center", "top", b_f_controlParams, "navy");
70
71     control_frame = uicontrol(u, ...
72     "style", "frame", ...
73     "backgroundcolor", [1 1 1], ...
74     "border", b_controlParams, ...
75     "layout", "gridbag", ...
76     "tag", "control_frame");
77
78     demo_viewCode("demo_custom.dem.sce");
79
80     fig_handle.color_map = jetcolormap(128);
81
82     // Frames creation [Control Panel]
83     // =========================================================================
84
85     // Explanatory text
86     // =========================================================================
87
88     my_exptext_string = "";
89
90     my_exptext_string = my_exptext_string + "<html>";
91
92     my_exptext_string = my_exptext_string + "<center>";
93     my_exptext_string = my_exptext_string + "<img src=""file:///"+SCI+"/modules/graphics/demos/cmplxfunc/warning.png"+""">";
94     my_exptext_string = my_exptext_string + "BE CAREFUL, NOTHING IS PROTECTED";
95     my_exptext_string = my_exptext_string + "</center>";
96
97     my_exptext_string = my_exptext_string + "<hr><br />";
98
99     my_exptext_string = my_exptext_string + " To draw your own complex  function :";
100
101     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
102
103     my_exptext_string = my_exptext_string + "1. define the  function by a correct ";
104     my_exptext_string = my_exptext_string + "string where the complex var must ";
105     my_exptext_string = my_exptext_string + "be z. Also, as the function will ";
106     my_exptext_string = my_exptext_string + "be evaluated on a matrix, don''t forget ";
107     my_exptext_string = my_exptext_string + "the . to operate elementwise. Examples: ";
108
109     my_exptext_string = my_exptext_string + "</div>";
110
111
112     my_exptext_string = my_exptext_string + "<pre>    z.^2       (z+1).*(z-1)     (1)./(z+2)</pre>";
113     my_exptext_string = my_exptext_string + "<pre>    sqrt(z)    (z+%i).*(z-%i)   1+2*z+z.^2</pre>";
114
115     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
116     my_exptext_string = my_exptext_string + "2. define the type of the domain: Square or Disk,";
117     my_exptext_string = my_exptext_string + "</div>";
118
119
120     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
121     my_exptext_string = my_exptext_string + "3. define the ""radius"" R of the domain,"+ "<br />";
122     my_exptext_string = my_exptext_string + "</div>";
123
124
125     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
126     my_exptext_string = my_exptext_string + "4. should your function have some kind of ";
127     my_exptext_string = my_exptext_string + "discontinuity on Ox or Oy => check ";
128     my_exptext_string = my_exptext_string + "Ox or Oy. Otherwise check No.";
129     my_exptext_string = my_exptext_string + "</div>";
130
131     my_exptext_string = my_exptext_string + "</html>";
132
133
134     // Explanatory text : frame
135
136     b_f_expTxt = createBorderFont("", 12);
137     b_l_expTxt = createBorder("line", "navy", 1);
138     b_expTxt   = createBorder("titled", b_l_expTxt, "", "center", "top", b_f_expTxt, "navy");
139
140     // Border for the explanatory text frame
141     c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
142     my_exptext_frame = uicontrol( ...
143     "parent"              , control_frame,...
144     "style"               , "frame",...
145     "layout"              , "gridbag", ...
146     "border"              , b_expTxt, ...
147     "units"               , "pixels",...
148     "background"          , [1 1 1], ...
149     "constraint"          , c, ...
150     "tag"                 , "my_exptext_frame" ...
151     );
152
153     // Explanatory text : actual text
154
155     c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
156     my_exptext_box = uicontrol( ...
157     "parent"              , my_exptext_frame,...
158     "style"               , "text",...
159     "units"               , "pixels",...
160     "string"              , my_exptext_string,...
161     "fontname"            , defaultfont,...
162     "fontunits"           , "points",...
163     "fontsize"            , 9,...
164     "background"          , [1 1 1], ...
165     "constraint"          , c, ...
166     "tag"                 , "my_exptext_box" ...
167     );
168
169
170     // Function definition
171     // =========================================================================
172
173     // Function definition : frame
174
175     // Border for the function definition frame
176     b_f_funDef = createBorderFont("", 12);
177     b_l_funDef = createBorder("line", "navy", 1);
178     b_funDef   = createBorder("titled", b_l_funDef, _("Function definition"), "center", "top", b_f_funDef, "navy");
179
180     c = createConstraints("gridbag", [1 2 1 1], [1 1], "both", "upper");
181     my_fundef_frame = uicontrol( ...
182     "parent"              , control_frame,...
183     "style"               , "frame",...
184     "layout"              , "gridbag", ...
185     "border"              , b_funDef, ...
186     "units"               , "pixels",...
187     "fontname"            , defaultfont,...
188     "fontunits"           , "points",...
189     "fontsize"            , 13,...
190     "fontweight"          , "bold", ...
191     "background"          , [1 1 1], ...
192     "constraints"         , c, ...
193     "tag"                 , "my_fundef_frame" ...
194     );
195
196     // Function definition : Text "f(z) = "
197
198     c = createConstraints("gridbag", [1 1 1 1], [1/12 1], "both", "upper");
199     my_fundef_editbox = uicontrol( ...
200     "parent"             , my_fundef_frame,...
201     "style"              , "text",...
202     "string"              , "f(z) = ", ...
203     "fontname"           , defaultfont,...
204     "fontunits"          , "points",...
205     "fontsize"           , 11,...
206     "background"         , [1 1 1], ...
207     "constraint"         , c, ...
208     "tag"                , "my_fundef_editbox");
209
210     // Function definition : Edit box
211
212     c = createConstraints("gridbag", [2 1 1 1], [12 1], "both", "upper");
213     my_fundef_editbox = uicontrol( ...
214     "parent"             , my_fundef_frame,...
215     "style"              , "edit",...
216     "fontname"           , defaultfont,...
217     "fontunits"          , "points",...
218     "fontsize"           , 11,...
219     "string"             , "(1)./((z+2).*(2-z))", ...
220     "callback"           , "update_fundef()",...
221     "constraint"         , c, ...
222     "tag"                , "my_fundef_editbox");
223
224     // Function definition : message bar
225
226     c = createConstraints("gridbag", [1 2 2 1], [1 1], "both", "upper");
227     my_exptext_bar = uicontrol( ...
228     "parent"              , my_fundef_frame,...
229     "style"               , "text",...
230     "string"              , " ", ...
231     "units"               , "pixels",...
232     "fontname"            , defaultfont,...
233     "fontunits"           , "points",...
234     "fontsize"            , 11,...
235     "background"          , [1 1 1], ...
236     "constraint"          , c, ...
237     "tag"                 , "my_funDef_bar" ...
238     );
239
240
241     // Domain type
242     // =========================================================================
243
244     // Domain type : frame
245
246     // Border for the domain type frame
247     b_f_domain = createBorderFont("", 12);
248     b_l_domain = createBorder("line", "navy", 1);
249     b_domain   = createBorder("titled", b_l_domain, _("Domain type"), "center", "top", b_f_domain, "navy");
250
251     c = createConstraints("gridbag", [1 3 1 1], [1 1], "both", "upper");
252     my_dt_frame = uicontrol( ...
253     "parent"              , control_frame,...
254     "style"               , "frame",...
255     "layout"              , "gridbag", ...
256     "border"              , b_domain, ...
257     "units"               , "pixels",...
258     "fontname"            , defaultfont,...
259     "fontunits"           , "points",...
260     "fontsize"            , 13,...
261     "fontweight"          , "bold", ...
262     "background"          , [1 1 1], ...
263     "constraint"          , c, ...
264     "tag"                 , "my_dt_frame" ...
265     );
266
267     // Domain type : square
268
269     c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
270     square_radio = uicontrol( ...
271     "parent"             , my_dt_frame,...
272     "style"              , "radiobutton",...
273     "string"             , "Square",...
274     "fontname"           , defaultfont,...
275     "fontunits"          , "points",...
276     "fontsize"           , 11,...
277     "value"              , 0, ...
278     "background"         , [1 1 1], ...
279     "callback"           , "update_domain_type();",...
280     "constraints"        , c, ...
281     "tag"                , "square_radio");
282
283     // Domain type : Disk
284
285     c = createConstraints("gridbag", [2 1 1 1], [1 1], "both", "upper");
286     disk_radio = uicontrol( ...
287     "parent"             , my_dt_frame,...
288     "style"              , "radiobutton",...
289     "string"             , "Disk",...
290     "fontname"           , defaultfont,...
291     "fontunits"          , "points",...
292     "fontsize"           , 11,...
293     "value"              , 1, ...
294     "background"          , [1 1 1], ...
295     "callback"           , "update_domain_type();",...
296     "constraints"        , c, ...
297     "tag"                , "disk_radio");
298
299
300     // Radius of the domain
301     // =========================================================================
302
303     // Radius of the domain : frame
304
305     // Border for the radius frame
306     b_f_radius = createBorderFont("", 12);
307     b_l_radius = createBorder("line", "navy", 1);
308     b_radius   = createBorder("titled", b_l_radius, _("Radius of the domain"), "center", "top", b_f_radius, "navy");
309
310     c = createConstraints("gridbag", [1 4 1 1], [1 1], "both", "upper");
311     my_radius_frame = uicontrol( ...
312     "parent"              , control_frame,...
313     "style"               , "frame",...
314     "layout"              , "gridbag", ...
315     "border"              , b_radius, ...
316     "units"               , "pixels",...
317     "fontname"            , defaultfont,...
318     "fontunits"           , "points",...
319     "fontsize"            , 13,...
320     "fontweight"          , "bold", ...
321     "background"          , [1 1 1], ...
322     "constraint"          , c, ...
323     "tag"                 , "my_radius_frame" ...
324     );
325
326     // Radius of the domain : Edit box
327
328     c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
329     my_radius_editbox = uicontrol( ...
330     "parent"             , my_radius_frame,...
331     "style"              , "edit",...
332     "fontname"           , defaultfont,...
333     "fontunits"          , "points",...
334     "fontsize"           , 11,...
335     "string"             , "1.9", ...
336     "callback"           , "update_radius()",...
337     "constraint"         , c, ...
338     "tag"                , "my_radius_editbox");
339
340     // Radius of the domain : message bar
341
342     c = createConstraints("gridbag", [1 2 1 1], [1 1], "both", "upper");
343     my_exptext_bar = uicontrol( ...
344     "parent"              , my_radius_frame,...
345     "style"               , "text",...
346     "string"              , " ", ...
347     "units"               , "pixels",...
348     "fontname"            , defaultfont,...
349     "fontunits"           , "points",...
350     "fontsize"            , 11,...
351     "background"          , [1 1 1], ...
352     "constraint"          , c, ...
353     "tag"                 , "my_radius_bar" ...
354     );
355
356
357     // Cut on axes
358     // =========================================================================
359
360     // Cut on axes : frame
361
362     // Border for the cut on axes frame
363     b_f_cut = createBorderFont("", 12);
364     b_l_cut = createBorder("line", "navy", 1);
365     b_cut   = createBorder("titled", b_l_cut, _("Cut on axes"), "center", "top", b_f_cut, "navy");
366
367     c = createConstraints("gridbag", [1 5 1 1], [1 1], "both", "upper");
368     my_coa_frame = uicontrol( ...
369     "parent"              , control_frame,...
370     "style"               , "frame",...
371     "layout"              , "gridbag", ...
372     "border"              , b_cut, ...
373     "units"               , "pixels",...
374     "fontname"            , defaultfont,...
375     "fontunits"           , "points",...
376     "fontsize"            , 13,...
377     "fontweight"          , "bold", ...
378     "background"          , [1 1 1], ...
379     "constraint"          , c, ...
380     "tag"                 , "my_coa_frame" ...
381     );
382
383     // Cut on axes : Ox
384
385     c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
386     ox_radio = uicontrol( ...
387     "parent"             , my_coa_frame,...
388     "style"              , "radiobutton",...
389     "string"             , "Ox",...
390     "fontname"           , defaultfont,...
391     "fontunits"          , "points",...
392     "fontsize"           , 11,...
393     "value"              , 0, ...
394     "background"         , [1 1 1], ...
395     "callback"           , "update_cao();",...
396     "constraint"         , c, ...
397     "tag"                , "ox_radio");
398
399     // Cut on axes : Oy
400
401     c = createConstraints("gridbag", [2 1 1 1], [1 1], "both", "upper");
402     oy_radio = uicontrol( ...
403     "parent"             , my_coa_frame,...
404     "style"              , "radiobutton",...
405     "string"             , "Oy",...
406     "fontname"           , defaultfont,...
407     "fontunits"          , "points",...
408     "fontsize"           , 11,...
409     "value"              , 0, ...
410     "background"         , [1 1 1], ...
411     "callback"           , "update_cao();",...
412     "constraint"          , c, ...
413     "tag"                , "oy_radio");
414
415     // Cut on axes : No
416
417     c = createConstraints("gridbag", [3 1 1 1], [1 1], "both", "upper");
418     no_radio = uicontrol( ...
419     "parent"             , my_coa_frame,...
420     "style"              , "radiobutton",...
421     "string"             , "No",...
422     "fontname"           , defaultfont,...
423     "fontunits"          , "points",...
424     "fontsize"           , 11,...
425     "value"              , 1, ...
426     "background"         , [1 1 1], ...
427     "callback"           , "update_cao();",...
428     "constraint"          , c, ...
429     "tag"                , "no_radio");
430
431     // Default Values
432     // =========================================================================
433
434     global my_fundef_val;
435     global my_dt_val;
436     global my_radius;
437     global my_typeCut;
438     global my_e;
439
440
441     my_fundef_val = "(1)./((z+2).*(2-z))";
442     my_dt_val     = "Disk";
443     my_radius     = 1.9;
444     my_typeCut    = "No";
445
446     my_e          = 0.001;
447     theta         = -110;
448     alpha         = 75;
449
450     deff("Z=f(z)","Z="+my_fundef_val);
451
452     PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
453     fig_handle.visible = "on";
454
455 endfunction
456
457 function update_fundef()
458
459     global my_fundef_val;
460     global my_dt_val;
461     global my_radius;
462     global my_typeCut;
463     global my_e;
464
465     my_fundef_val_tmp = get(gcbo,"string");
466
467     if strchr(my_fundef_val_tmp, "z") == "" then
468         updateStatusBar("my_funDef_bar", _("Function should contain ""z"""), [1 0 0]);
469         return
470     end
471
472     try // Try f(z) on a simple matrix
473         ieeeMode = ieee();
474         ieee(2);
475         execstr(strsubst(my_fundef_val_tmp, "z", "[1 2 3; 1 2 3]"));
476         ieee(ieeeMode);
477     catch
478         updateStatusBar("my_funDef_bar", _("Wrong definition of f(z)"), [1 0 0]);
479         return
480     end
481
482     my_fundef_val = my_fundef_val_tmp;
483
484     // Delete the old plots
485
486     demo_fig = gcf();
487     demo_fig.immediate_drawing = "off";
488
489     a = gca(); delete(a);
490     a = gca(); delete(a);
491     a = gca(); delete(a);
492
493     theta = -110;
494     alpha = 75;
495
496     deff("Z=f(z)","Z="+my_fundef_val);
497
498     if my_dt_val == "Square" then
499         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,41,"f",theta,alpha,[0;0]);
500     elseif my_dt_val == "Disk" then
501         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
502     end
503
504     demo_fig.immediate_drawing = "on";
505
506 endfunction
507
508 function update_domain_type()
509
510     global my_fundef_val;
511     global my_dt_val;
512     global my_radius;
513     global my_typeCut;
514     global my_e;
515
516     // Update the radio elements
517     set(findobj("tag", "square_radio") , "value", 0);
518     set(findobj("tag", "disk_radio")   , "value", 0);
519     set(gcbo, "value", 1);
520
521     // Delete the old plots
522
523     demo_fig = gcf();
524     demo_fig.immediate_drawing = "off";
525
526     a = gca(); delete(a);
527     a = gca(); delete(a);
528     a = gca(); delete(a);
529
530     theta = -110;
531     alpha = 75;
532
533     deff("Z=f(z)","Z="+my_fundef_val);
534
535     if get(gcbo, "tag") == "square_radio" then
536         my_dt_val = "Square";
537     elseif get(gcbo, "tag") == "disk_radio" then
538         my_dt_val = "Disk";
539     end
540
541     if my_dt_val == "Square" then
542         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,41,"f",theta,alpha,[0;0]);
543     elseif my_dt_val == "Disk" then
544         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
545     end
546
547     demo_fig.immediate_drawing = "on";
548
549 endfunction
550
551 function update_radius()
552
553     global my_fundef_val;
554     global my_dt_val;
555     global my_radius;
556     global my_typeCut;
557     global my_e;
558
559     try
560         my_radius_tmp = evstr(get(gcbo,"string"));
561     catch
562         updateStatusBar("my_radius_bar", _("Radius should be real and finite"), [1 0 0]);
563         return
564     end
565
566     if ~isscalar(my_radius_tmp) | and(type(my_radius_tmp) <> [1 8]) | ~isreal(my_radius_tmp) | isinf(my_radius_tmp) then
567         updateStatusBar(_("Radius should be real and finite"), [1 0 0]);
568         return
569     else
570         my_radius = my_radius_tmp;
571     end
572
573     // Delete the old plots
574
575     demo_fig = gcf();
576     demo_fig.immediate_drawing = "off";
577
578     a = gca(); delete(a);
579     a = gca(); delete(a);
580     a = gca(); delete(a);
581
582     theta = -110;
583     alpha = 75;
584
585     deff("Z=f(z)","Z="+my_fundef_val);
586
587     if my_dt_val == "Square" then
588         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,41,"f",theta,alpha,[0;0]);
589     elseif my_dt_val == "Disk" then
590         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
591     end
592
593     demo_fig.immediate_drawing = "on";
594
595 endfunction
596
597 function update_cao()
598
599     global my_fundef_val;
600     global my_dt_val;
601     global my_radius;
602     global my_typeCut;
603     global my_e;
604
605     // Update the radio elements
606     set(findobj("tag", "ox_radio") , "value", 0);
607     set(findobj("tag", "oy_radio") , "value", 0);
608     set(findobj("tag", "no_radio") , "value", 0);
609     set(gcbo, "value", 1);
610
611     // Delete the old plots
612
613     demo_fig = gcf();
614     demo_fig.immediate_drawing = "off";
615
616     a = gca(); delete(a);
617     a = gca(); delete(a);
618     a = gca(); delete(a);
619
620     theta = -110;
621     alpha = 75;
622
623     deff("Z=f(z)","Z="+my_fundef_val);
624
625     if get(gcbo, "tag")     == "ox_radio" then
626         my_typeCut = "Ox";
627     elseif get(gcbo, "tag") == "oy_radio" then
628         my_typeCut = "Oy";
629     elseif get(gcbo, "tag") == "no_radio" then
630         my_typeCut = "No";
631     end
632
633     if my_dt_val == "Square" then
634         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,41,"f",theta,alpha,[0;0]);
635     elseif my_dt_val == "Disk" then
636         PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
637     end
638
639     demo_fig.immediate_drawing = "on";
640
641 endfunction
642
643 function []=PlotCmplxFunc(R,e,TypeDomain,TypeCut,n,StrFunc,theta,alpha,DomReal)
644
645     //  A function to draw on a square or a disk a complex function
646     //  with branch(es) cut(s) on Ox or Oy
647     //
648     //  TypeDomain : "Square" or "Disk"
649     //     TypeCut : "Ox" or "Oy"
650     //           R : length of half a side of the square or radius of the disk
651     //           e : thin layer to avoid the branch(es) cut(s)
652     //           n : a scalar (for Square) or a 2-vector = [ntheta, nr]
653     //               (for Disk) for discretization
654     //     StrFunc : the string which names the complex function (this is
655     //               because primitive don't pass as function argument)
656     // theta,alpha : usual parameters for plot3d
657     //     DomReal : interval for which the real restriction is drawn
658
659     // computes the facets
660
661     [xr,yr,zr,xi,yi,zi] = CmplxFacets(R,e,TypeDomain,TypeCut,n,StrFunc);
662
663     // draw
664     // ============================================
665
666     // Title
667     // ============================================
668
669     my_title_axes             = newaxes();
670     my_title_axes.axes_bounds = [1/3,0,2/3,1];
671
672     // make axes transparent
673     my_title_axes.filled = "off";
674
675     Rs = string(R);
676
677     if TypeDomain == "Square" then
678         end_title = " function on [-"+Rs+","+Rs+"]x[-"+Rs+","+Rs+"]"
679     else
680         end_title = " function on D(0,R="+Rs+")"
681     end
682
683     if StrFunc == "f" then
684         the_title = "Your custom (named f) complex" + end_title;
685     else
686         the_title = "The complex " + StrFunc + end_title;
687     end
688
689     xtitle(the_title);
690
691     my_title_axes.title.text       = the_title;
692     my_title_axes.title.font_size  = 3;
693     my_title_axes.margins     = [ 0.15 0.08 0.08 0.08 ]
694
695     // plot Im(z)
696     // ============================================
697
698     subplot(211)
699     plot3d(xi,yi,zi,theta,alpha,"Re(z)@Im(z)@",[2 6 4]);
700
701     my_IM_axes = gca();
702     my_IM_axes.axes_bounds = [0.16, 0.05, 1, 0.5];
703     my_IM_plot             = my_IM_axes.children;
704     my_IM_plot.color_flag  = 1;
705
706     xtitle("Im("+StrFunc+"(z))");
707     my_IM_axes.margins      = [0.2, 0.2, 0.2, 0.2];
708     my_IM_axes.cube_scaling = "on";
709
710     // plot Re(z) + the real restriction
711     // ============================================
712
713     subplot(212)
714     plot3d(xr,yr,zr,theta,alpha,"Re(z)@Im(z)@",[2 6 4]);
715
716     my_RE_axes = gca();
717     my_RE_axes.axes_bounds = [0.16, 0.5, 1, 0.5];
718     my_RE_plot             = my_RE_axes.children;
719     my_RE_plot.color_flag  = 1;
720
721     xtitle("Re("+StrFunc+"(z))");
722     my_RE_axes.margins      = [0.2, 0.2, 0.2, 0.2];
723     my_RE_axes.cube_scaling = "on";
724
725     // real function in yellow
726     // ============================================
727
728     if DomReal(2) > DomReal(1) then
729         xstring(0.1,-0.15," In yellow : the real "+StrFunc+" function")
730     end
731
732     if DomReal(2) > DomReal(1) then
733         xx = linspace(DomReal(1),DomReal(2),40)';
734         yy = zeros(xx);
735         zz = evstr(StrFunc+"(xx)");
736         param3d1(xx,yy,list(zz,32),theta,alpha,flag=[0,0]);
737         yellow_line = get("hdl");
738         yellow_line.thickness = 3;
739     end
740
741 endfunction
742
743 function [xr,yr,zr,xi,yi,zi] = CmplxFacets(R,e,TypeDomain,TypeCut,n,StrFunc)
744
745     //  A function to compute the facets for drawing a complex function
746     //  on a square or a disk with branch(es) cut(s) on Ox or Oy
747     //
748     //  TypeDomain : "Square" or "Disk"
749     //     TypeCut : "Ox" or "Oy"
750     //           R : length of half a side of the square or radius of the disk
751     //           e : thin layer to avoid the branch(es) cut(s)
752     //           n : a scalar (for Square) or a 2-vector = [ntheta, nr]
753     //               (for Disk) for discretization
754     //     StrFunc : the string which names the complex function (this is
755     //               because primitive don't pass as function argument)
756
757     if TypeDomain == "Square" then
758         if TypeCut == "Ox" then
759             x1 = linspace(-R, R, n);
760             y1 = linspace( e, R, int(n/2));
761         else  // for TypeCut = "Oy" ...
762             x1 = linspace( e, R, int(n/2));
763             y1 = linspace(-R, R, n);
764         end
765         X1 = ones(y1')*x1 ; Y1 = y1'*ones(x1);
766
767     else // for TypeDomain = "Disk"
768         r = linspace(0,R, n(2));
769         if TypeCut == "Ox" then
770             theta = linspace(0,%pi,n(1))';
771             X1 = cos(theta)*r;
772             Y1 = e + sin(theta)*r;
773         else // for TypeCut = "Oy"
774             theta = linspace(-%pi/2,%pi/2,n(1))';
775             X1 = e + cos(theta)*r;
776             Y1 = sin(theta)*r;
777         end
778     end
779
780     X2 = -X1 ; Y2 = -Y1;
781     Z1 = evstr(StrFunc+"(X1 + %i*Y1)");
782     Z2 = evstr(StrFunc+"(X2 + %i*Y2)");
783     [xr1,yr1,zr1] = nf3d(X1,Y1,real(Z1));
784     [xr2,yr2,zr2] = nf3d(X2,Y2,real(Z2));
785     xr = [xr1 xr2]; yr = [yr1 yr2]; zr = [zr1 zr2];
786     [xi1,yi1,zi1] = nf3d(X1,Y1,imag(Z1));
787     [xi2,yi2,zi2] = nf3d(X2,Y2,imag(Z2));
788     xi = [xi1 xi2]; yi = [yi1 yi2]; zi = [zi1 zi2];
789
790 endfunction
791
792 // =============================================================================
793 // updateStatusBar
794 // + Update the string in the text frame
795 // =============================================================================
796 function updateStatusBar(tag,msg, msg_color)
797     time_active = 2; //Time the message is active in s
798
799     if argn(2) == 0 then
800         set(tag, "String", " ");
801         return
802     end
803
804     h = gcf();
805     set(tag, "Foregroundcolor", msg_color, "String", msg);
806
807     delta_time = 0;
808     timer()
809     while delta_time < time_active
810         delta_time = delta_time + timer();
811     end
812
813     if is_handle_valid(h)
814         updateStatusBar();
815     end
816 endfunction
817
818 funcprot(prot);
819
820 demo_custom();
821
822 clear demo_custom();