Remove useless show_pixmap() calls + fix translation
[scilab.git] / scilab / modules / cacsd / demos / pendulum / graphics.sci
1 //
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) ????-2008 - INRIA
4 //
5 // This file is distributed under the same license as the Scilab package.
6 //
7
8  function P=initialize_display(xg,teta)
9    clf();a=gca();a.isoview='on';
10    drawlater();//f=gcf();f.pixmap='on'
11    a.data_bounds=[-0.4 -0.2;0.4 0.3];
12    a.margins=zeros(1,4);
13    y1=0;lb=l;hc=0.05;lc=0.1;teta=.25;r=0.013
14    P=build_pendulum([xg,y1],[lc,hc,lb,teta,r])
15    xsegs([-0.4 0.4],[y1-2*r y1-2*r]);
16    drawnow();
17  endfunction
18
19
20 function [P]=dpnd()
21 //dpnd() scheme of experiment
22 //!
23   clf();
24   drawlater()
25   a=gca();
26   a.isoview='on';
27   f = gcf() ;
28   f.axes_size = [640,480];
29   a.data_bounds=[0 0;100 100];
30   a.margins(3:4)=[0 0.2];
31   xg=40;
32   y1=25;
33   lb=40;
34   hc=10;
35   lc=20;
36   teta=.25;
37   r=2.5;
38   P=build_pendulum([xg,y1],[lc,hc,lb,teta,r])
39
40   //the floor
41   xarrows([10 90],[y1-5 y1-5],0);
42   xstring(90,y1,'x')
43
44   // the force
45   yg=y1+hc/2,
46   x2=xg+lc/2;
47   xarrows([x2 x2+10],[yg yg],2);
48   xstring(x2+20,yg,'u (force)',0,0);
49
50   // the vertical
51   y2=y1+hc;
52   xsegs([xg xg],[y2 y2+lb]);e=gce();e.line_style=2;e.segs_color=-1;
53
54   // the angle teta
55   xstring(xg+lb*sin(teta)/2,y2+lb*cos(teta),'a',0,0);
56   e=gce();e.font_size=3;
57
58   //the differential equations
59   xstring(5,-9,['a'''' = (-sin(a)*cos(a)*(m/(m+M))*a''^2 + 2/(mb*l)*(sin(a)*m*g - qm*cos(a)*u))/d'
60         'x'''' =  (u+m*(l/2)*(sin(a)a''^2-cos(a)*a''''))/(m+M);'
61         'm: weight of the pendulum'
62         'M: weight of the cart'
63         'l: length of the pendulum'])
64   drawnow()
65 endfunction
66
67 function P=build_pendulum(o,params)
68   xg=o(1)
69   y1=o(2)
70   lc=params(1) //width of the cart
71   hc=params(2) //height of the cart
72   lb=params(3) //length of the pendulum
73   teta=params(4) //angle  of the pendulum
74   r=params(5) //radius of wires
75   y2=y1+hc;
76   x2=xg+lc/2;
77   x1=xg-lc/2;
78
79   //cart
80   xrect([xg-lc/2,y1+hc,lc,hc]);e1=gce();
81   xfarcs([x1+lc/10-r;y1;2*r;2*r;0;360*64],1);e2=gce();
82   xfarcs([x2-2*r+lc/10-r;y1;2*r;2*r;0;360*64],1);e3=gce();
83
84   //pendulum
85   xsegs([xg,xg+lb*sin(teta)],[y2,y2+lb*cos(teta)]),
86   e4=gce();e4.thickness=2;e4.segs_color=-1;
87   P=glue([e4 e3 e2 e1])
88   P.user_data=[xg,lb]
89 endfunction
90
91 function P=set_pendulum(P,x,theta)
92   p=P.user_data
93   xg=p(1);lb=p(2);
94   //translation
95   drawlater();
96   e=P.children(1);e.data(1)=e.data(1)+x-xg;
97   e=P.children(2).children;e.data(1)=e.data(1)+x-xg;
98   e=P.children(3).children;e.data(1)=e.data(1)+x-xg;
99   e=P.children(4);e.data(:,1)=e.data(:,1)+x-xg;
100
101    //change the pendulum angle
102   e.data(2,:)=e.data(1,:)+[lb*sin(theta) lb*cos(theta)];
103   P.user_data(1)=x
104   drawnow();
105 endfunction
106
107
108 function draw1()
109   f=gcf();f.figure_position=[10 10];show_window()
110   clf();
111   drawlater();//f.pixmap='on';
112   f.background=color('gray');
113   f.figure_size=[850,650];
114   y=y(:,1:70);  n=size(y,2);
115   a1=gca();sca(a1);
116   a1.axes_bounds=[0 0 0.5 0.5];
117   a1.data_bounds=[1,min(y(1,:));n max(y(1,:))];
118   a1.margins(1)=0.2;
119   a1.axes_visible='on';
120   a1.x_label.text='time';
121   a1.y_label.text='position';
122   a1.box = "on";
123   p1=xpoly(1,y(1,1));p1=gce();
124
125   a2=newaxes();sca(a2);
126   a2.axes_bounds=[0.5,0,0.5,0.5];
127   a2.data_bounds=[1,min(y(2,:));n max(y(2,:))];
128   a2.margins(1)=0.2;
129   a2.axes_visible='on';
130   a2.x_label.text='time';
131   a2.y_label.text='theta';
132   a2.box = "on";
133   xpoly(1,y(2,1));;p2=gce();
134
135   a3=newaxes();
136   a3.axes_bounds= [0,0.5,1,0.5];
137   a3.isoview='on';
138   a3.data_bounds=[-0.4 -0.1;0.4 0.4];
139   a3.box = "on";
140   y1=0;lb=l;hc=0.05;lc=0.1;teta=100*y(2,1);r=0.013;xg=100*y(1,1);
141   sca(a3);
142   P=build_pendulum([xg,y1],[lc,hc,lb,teta,r])
143   xsegs([-0.4 0.4],[y1-2*r y1-2*r]);
144
145   drawnow()
146
147   for k=1:size(y,2)
148     drawlater();
149     xx=100*y(1,k);tt=100*y(2,k);
150     p1.data=[p1.data;k,y(1,k)];
151     p2.data=[p2.data;k,y(2,k)];
152     // contains draw now
153     P=set_pendulum(P,xx,tt);
154   end
155   //f.pixmap='off'
156 endfunction
157
158 function draw2()
159   f=gcf();f.figure_position=[10 10];show_window()
160   clf();
161   //f.pixmap='on';
162   drawlater()
163   f.figure_size=[850,650];
164   f.background=color('gray');
165   yd=yd(:,1:100);  n=size(yd,2);
166   c = kr*yd(5:8,:) //control
167   theta = yd(3,:) //angle
168   thetaE= yd(7,:) // estimated angle
169   x = yd(1,:)
170
171   a1=gca();sca(a1);
172   a1.axes_bounds=[0 0 0.5 0.5];
173   a1.data_bounds=[min(t1),min(c);t1(n) max(c)];
174   a1.margins(1)=0.2;
175   a1.axes_visible='on';
176   a1.x_label.text='time';
177   a1.y_label.text='Control (u)';
178   a1.box = "on";
179   p1=xpoly(t1(1),c(1));p1=gce();
180
181   a2=newaxes();sca(a2);
182   a2.axes_bounds=[0.5,0,0.5,0.5];
183   a2.data_bounds=[t1(1),min([theta thetaE]);t1(n) max([theta thetaE])];
184   a2.margins(1)=0.2;
185   a2.axes_visible='on';
186   a2.x_label.text='time';
187   a2.y_label.text='theta';
188   a2.box = "on";
189   xpoly(t1(1),theta(1));p2=gce();
190   xpoly(t1(1),thetaE(1));p3=gce();p3.line_style=2;
191
192   a3=newaxes();
193   a3.axes_bounds= [0,0.5,1,0.5];
194   a3.isoview='on';
195   a3.data_bounds=[-0.4 -0.1;0.4 0.4];
196   a3.box = "on";
197   y1=0;lb=l;hc=0.05;lc=0.1;;r=0.013;
198   sca(a3);
199   P=build_pendulum([100*x(1),y1],[lc,hc,lb,100*theta(1),r])
200   xsegs([-0.4 0.4],[y1-2*r y1-2*r]);
201   drawnow()
202
203   for k=1:n
204     drawlater();
205     xx=x(k);tt=theta(k);
206     p1.data=[p1.data;t1(k),c(k)];
207     p2.data=[p2.data;t1(k),theta(k)];
208     p3.data=[p3.data;t1(k),thetaE(k)];
209     // contains draw now
210     P=set_pendulum(P,xx,tt);
211   end
212   //f.pixmap='off'
213
214 endfunction