myfuncprot=funcprot(); funcprot(0); // définition des variables globales global fin global u // Initialisation de l'affichage function init_screen(x) set figure_style new; xbasc(); // efface le contenu de la fenêtre graphique active xselect(); // raise the current graphics window f=gcf(); // Return handle of current graphic window. a=gca(); // Return handle of current axes. a.isoview="on"; // validation de l'iso view voir ce que c'est // pixmap est un registre dans lequel on met l'image // show_pixmap — send the pixmap buffer to the screen // clear_pixmap — erase the pixmap buffer f.pixmap='on'; // pixmap voir la signification // définitions des dimensions de la fenêtre sur une même ligne xmin=-50, xmax=50, ymin=-50,ymax=50; a.data_bounds=[xmin xmax ymin ymax]; endfunction // fin de la fonction init_screen //Cette fonction permet de construire la voiture //Elle retourne un vecteur d'objet : [la voiture, la roue 1 la roue 2] function R=build_voiture() // dimensions de la carosserie M =[-1 4 5 5 4 -1 -1 -1 0 0 -1 1 0 0 -1 1 0 0 3 3 3 ; -2 -2 -1 1 2 2 -2 -2 -2 -3 -3 -3 -3 3 3 3 3 2 2 3 -3 ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]; xpoly(M(1,:),M(2,:),"lines",0); car = gce(); // Get current entity handle. Ravd=[2 4 ;-3 -3]; xpoly(Ravd(1,:),Ravd(2,:),"lines",0); wheel1 = gce(); Ravg=[2 4 ;3 3]; xpoly(Ravg(1,:),Ravg(2,:),"lines",0); wheel2 = gce(); R=glue([car,wheel1,wheel2]);// LE TOUT est le résultat de la fonction! endfunction //Dessine la voiture fonction du vecteur d'état x //Le vecteur C = [C.children(1) = wheel2, C.children(2) = wheel2, C.children(3)] // C.children(1).data = Ravg // C.children(2).data = Ravd // C.children(3).data = M // construction dynamique de la voiture function draw_car(C,x) global u drawlater(); M = [-1 4 5 5 4 -1 -1 -1 0 0 -1 1 0 0 -1 1 0 0 3 3 3 ; -2 -2 -1 1 2 2 -2 -2 -2 -3 -3 -3 -3 3 3 3 3 2 2 3 -3 ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]; Rc =[cos(x(3)),-sin(x(3)),x(1);sin(x(3)),cos(x(3)),x(2);0 0 1]; //Rotation de la voiture Rotcar = Rc*M; C.children(3).data = Rotcar'; Rav=[-1 1;0 0;1 1]; //Rotation roue avant droite Rotwheel2 = Rc*[cos(x(5)),-sin(x(5)),3;sin(x(5)),cos(x(5)), 3;0 0 1]*Rav; C.children(2).data = Rotwheel2'; //Rotation roue avant gauche Rotwheel1 = Rc*[cos(x(5)),-sin(x(5)),3;sin(x(5)),cos(x(5)),-3;0 0 1]*Rav; C.children(1).data = Rotwheel1'; drawnow(); show_pixmap(); // écriture des valeurs des composantes du vecteur d'état a=gca(); a.title.text="vitesse=" + string(x(4)) + " Angle roues="+ string(x(5)) + " u1="+ string(u(1)) + " u2=" + string(u(2)); a.title.font_size=3; endfunction //Equation d'évolution du système function dx=f(x,u) dx=[x(4)*cos(x(5))*cos(x(3)); // le vecteur d'état a 5 composantes x(4)*cos(x(5))*sin(x(3)); x(4)*sin(x(5)); u(1); u(2)]; endfunction //Initialise les variables d'état du système function x=initialisation(x) x(1)=0 ;// coordonnée x du centre de l'essieu arriere x(2)=0 ;// coordonnée y du centre de l'essieu arriere x(3)=0 ;// orientation de la voiture x(4)=0 ;// vitesse de la voiture x(5)=0 ;// orientation des roues endfunction // La fonction suivante teste en temps réel masqué le clavier à condition d'avoir // fait pointer le curseur sur la fenêtre graphique function my_eventhandler(win,x,y,ibut) global u global fin if ibut==-1000 then return,end xinfo('Volant:w,x; Acceleration:p,l ; Fin:f') [x y]=xchange(x,y,'i2f'); if ibut==ascii('l') then, u=[-500,0]; end //freinage if ibut==ascii('p') then, u=[ 500,0]; end //acceleration if ibut==ascii('w') then, u=[0, 10]; end //a gauche if ibut==ascii('x') then, u=[0, -10]; end //a droite if ibut==ascii('f') then, fin=0; end endfunction //Programme principal u=[0,0]; // initialisation du vecteur u fin=1; // positionnement de la variable booléenne de fin x=[0;0;0;0;0]; // vecteur d'état valeur initiale x=initialisation(x); init_screen(); fig = gcf(); fig.event_handler = 'my_eventhandler'; fig.event_handler_enable = "on" ; C = build_voiture(); draw_car(C,x); dt=0.01;// pas temporel de calcul de l'évolution realtimeinit(0.1); i = 1; while fin // boucle d'attente de la sortie après appui sur touche f realtime(i); i = i + 1; draw_car(C,x); x = x + f(x,u)*dt;// calcul de la nouvelle valeur de l'état u=[0;0]; end fig.event_handler_enable = "off"; xbasc()