bug 7566 fix: The cacsd module graphic functions (bode, black, nyquist,...)
[scilab.git] / scilab / modules / cacsd / macros / hallchart.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2010 - 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 function hallchart(modules,args,colors)
10   defaultmodules=[-20 -10 -6 -4 -2 2 4 6 10 20];//in dB
11   defaultargs=[-90 -60 -45 -30 -15 15 30 45 60 90]; //in degree
12   defaultbounds=[-3.5 -2;3 2];
13   if exists("modules","local")==0 then
14     modules=defaultmodules
15   else
16     if type(modules)|~isreal(modules)<>1 then
17       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","modules");
18     end
19     modules=matrix(modules,1,-1)
20   end
21   if exists("args","local")==0 then
22     args=defaultargs
23   else
24     if type(args)<>1|~isreal(args) then
25       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","args");
26     end
27     args=matrix(args,1,-1)
28   end
29
30   if exists("colors","local")==0 then
31     colors=[4 12];
32   else
33     if type(colors)<>1|~isreal(colors) then
34       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","colors");
35     end
36     if size(colors,"*")==1 then
37       colors=colors*ones(1,2)
38     end
39   end
40
41   fig=gcf();
42   immediate_drawing=fig.immediate_drawing;
43   fig.immediate_drawing="off";
44
45   ax=gca();
46   nc=size(ax.children,"*")
47   if nc==0 then
48     ax.data_bounds=defaultbounds;
49     ax.axes_visible="on";
50     ax.x_label.text=_("Real axis");
51     ax.y_label.text=_("Imaginary axis");
52     ax.title.text=_("Hall chart")
53     ax.box="on";
54   end
55
56   //iso modules circles. Circles whose center are (-M^2/(M^2-1),0) and
57   //radius M/(M^2-1) with M=|H(jw)| and H=G/(1+G)
58
59   M=exp(log(10)*modules/20)
60   radius=M./(M.*M-ones(M))
61   xc=-M.*radius
62   yc=0
63   radius=abs(radius)
64   //arcs replaced by polylines to be able to use datatips
65   //  xarcs([xc-radius;yc+radius;2*radius;2*radius;0*M;360*64*ones(M)])
66   //  A=gce()
67   //  E=unglue(A);
68   w=linspace(0,2*%pi,200)
69   c=cos(w);s=sin(w)
70   chart_handles=[]
71   for i=1:size(M,"*")
72     xpoly(xc(i)+radius(i)*c,yc+radius(i)*s)
73     ec=gce();
74     ec.foreground=colors(1);
75     ec.line_style=7;
76     ec.clip_state="clipgrf";
77     datatipInitStruct(ec,"formatfunction","formatHallModuleTip","module",modules(i))
78     if 2*int(i/2)==i then
79       xs=xc(i)+radius(i)*cos(%pi/6)
80       ys=yc+radius(i)*sin(%pi/6)
81     else
82       xs=xc(i)+radius(i)*cos(-%pi/6)
83       ys=yc+radius(i)*sin(-%pi/6)
84
85     end
86
87     xstring(xs,ys,string(modules(i))+_("dB"));
88     el=gce();
89
90     el.font_foreground=colors(1);
91     el.clip_state="clipgrf";
92     chart_handles=[glue([el ec]) chart_handles];
93   end
94
95   //iso phase circles. Circles whose center are (-1/2, 1/(2*N)) and
96   //radius sqrt(1+N^2)/(2*N) with N=tan(arg(H(-jw)))
97
98   N=tan(args*%pi/180);
99   radius=sqrt(1+N^2)./(2*N);
100   xc=-1/2;
101   yc=1 ./(2*N);
102
103   //  xarcs([xc-radius;yc+radius;2*radius;2*radius;0*N;360*64*ones(N)])
104   //  E=unglue(gce());
105   for i=1:size(N,"*")
106     xpoly(xc+radius(i)*c,yc(i)+radius(i)*s);ec=gce();
107     ec.foreground=colors(2);
108     ec.line_style=7;
109     ec.clip_state="clipgrf";
110     datatipInitStruct(ec,"formatfunction","formatHallPhaseTip","phase",args(i))
111     xstring(xc,yc(i)+radius(i),msprintf("%g°",args(i)));
112     el=gce();
113     el.font_foreground=colors(2);
114     el.clip_state="clipgrf";
115     chart_handles=[glue([el ec]) chart_handles];
116   end
117   chart_handles=glue(chart_handles)
118   //reorder axes children to make chart drawn before the previously
119   // drawn curves if any
120   for k=1:nc
121     swap_handles(ax.children(k),ax.children(k+1))
122   end
123   fig.immediate_drawing=immediate_drawing;
124 endfunction
125
126 function str=formatHallModuleTip(curve,pt,index)
127 //this function is called by the datatip mechanism to format the tip
128 //string for the Hall charts iso module curves
129   ud=datatipGetStruct(curve);
130   str=msprintf("%.2g"+_("dB"), ud.module);
131 endfunction
132
133 function str=formatHallPhaseTip(curve,pt,index)
134 //This function is called by the datatip mechanism to format the tip
135 //string for the Hall charts iso phase curves
136   ud=datatipGetStruct(curve);
137   str=msprintf("%.2g°", ud.phase);
138 endfunction
139