3 Interactivité - Université d`Angers
Transcription
3 Interactivité - Université d`Angers
Université d’Angers. Licence de mathématiques 2012-2013 3 3.1 Lucas Vienne Interactivité Animations Revenons sur le problème de sautillement d’images rencontré à la fin du TP1, Variations en fonction du parametre s de la courbe parametrée x(t, s) = cos(t).(cos(t) + s)/(s + 1) et y(t, s) = sin(t).(cos(t) + s)/(s + 1) 1. Variables 2. Fonctions spas=0.02 deff(’y=xx(t,s)’,’y=cos(t).*(cos(t)+s)/(s+1)’) tpas=0.05 deff(’y=yy(t,s)’,’y=sin(t).*(cos(t)+s)/(s+1)’) Tmax=2*\%pi+0.2 spause=10^4 affichage=[-1,-1,1,1] 3. Programme vu précédemment (TP1) clf() t=0:tpas:Tmax; for s=[0:spas:1,1:2*spas:3] aa=xx(t,s); bb=yy(t,s) ; clf() plot2d(aa,bb,5,rect=affichage) xpause(spause) end Le sautillement de l’image vient du temps de calcul de la nouvelle image entre les deux instructions clf() et plot2d(aa,bb,5,rect=affichage). Pour y remédier on utilise une fonction pixmap qui calcule la nouvelle image et la dépose dans une fenêtre virtuelle invisible dite buffer graphique, sans effacer la fenêtre courante. Ce n’est qu’à l’appel de show pixmap que le contenu de la fenêtre courante est remplacé par celui du buffer graphique, supprimant ainsi le temps d’attente. On obtient la modification suivante du programme : clf() f=gcf() plot2d(0,0,5,rect=affichage) t=0:tpas:Tmax; f.pixmap=’on’ for s=[0:spas:1,1:2*spas:3] aa=xx(t,s); bb=yy(t,s) ; clf() plot2d(aa,bb,5,rect=affichage) show_pixmap() xpause(spause) end appelle les paramètres de la fenêtre graphique ouvre la fenêtre graphique active le mode pixmap efface le buffer graphique mais pas le dessin courant calcule le nouveau dessin dans le buffer graphique remplace le dessin courant par le buffer graphique ralentit le défilement des images 17 3.2 Fonctions interactives usuelles input("appel") input(’Quel age as tu ?’) attend un nombre ou une variable input("appel","string") input(’Comment t’appelles tu ?’,’string’) la réponse est interprétée comme un mot (string). xclick([flag]) récupère les informations du clic : [ibutton,xcoord,ycoord] xgetmouse() position de la souris : [xcoord,ycoord,ibutton] locate(n,s) liste de n points obtenus par n clics dans la fenêtre (si s=1, une croix est dessinée). [x,y]=edit_curv(x,y) modification interactive de courbes planes. locate(n,s) : une fenêtre graphique étant ouverte, n clics droits successifs dans cette fenêtre renvoient une matrice (2,n) donnant les coordonnées des n points cliqués. Si n < 0, le nombre de points n’est pas pré-déterminé, mais l’usage d’un clic gauche arrète le processus sans renvoyer le dernier point cliqué. Si s = 1 une croix est marquee pour chaque point. edit_curv s’appelle avec la syntaxe complète [x,y,ok, gc]=edit_curv(xx,yy,job,tit) Les arguments xx,yy appellent la ligne brisée xx,yy que l’on veut modifier, job permet de préciser le type de modifications attendues (’a’ pour ajout de point, ’x’ modification des abscisses, ’y’ modification des ordonnées), tit ajoute un titre. On modifie alors graphiquement (cliquer, glisser les points) la courbe puis on termine en cliquant ok dans le menu edit de la fenêtre graphique ce qui renvoie les coordonnées des points de la courbe modifiée dans la fenêtre de compilation. On peut aussi abandonner la modification en cliquant abort au lieu de ok dans ce menu. Exemple 1 : xy=locate(5,-1) : cliquer 5 points dans la fenêtre graphique [x,y,ok]=edit_curv(xy(1,:),xy(2,:),’axy’,’courbe’) : récupération, modification de la courbe Exemple 2 : sélection et modification d’un rectangle définit un cadre. ajoute un titre. définit un point par un clic. dessine un rectangle, nomme son handle. initialisation de rep (réponse). on bouge la souris ... ... ce qui change la valeur de rep. modification ... ... des paramètres ... ... du rectangle. change the rectangle origin, width an height a=gca();a.data_bounds=[0 0;100 100]; xtitle(" dessin d un rectangle ") [b,xc,yc]=xclick(); xrect(xc,yc,10,20) r=gce(); rep=[xc,yc,-1]; while rep(3)==-1 do rep=xgetmouse(); xc1=rep(1); yc1=rep(2); ox=min(xc,xc1); oy=max(yc,yc1); w=abs(xc-xc1);h=abs(yc-yc1); r.data=[ox,oy,w,h]; end Remarque : si certaines commandes du gce() (ou gca(), gcf()) ne sont pas claires il suffit de l’appeler pour voir son contenu : dans le dernier exemple on peut appeler r (=gce()) et constater que la variable data définit le rectangle. 18 D’autres fonctions : regarder les exemples ou consulter l’aide Scilab pour avoir des précisions sur la syntaxe (entrées et sorties de la commande) x_choose("choix1","choix2"...) r=dragrect([a,b,larg, haut]) xrect(r) xsetech([0,0,1,1],[-1,-1,1,1]) rotate(xy, [angle,centre]) move glue unglue ouvre une boite à choix multiples. Cliquer sur l’un d’eux. (a,b) sommet en haut a gauche. Déplace à la souris le rectangle [a,b,larg, haut] et le dépose (clic). dessine le rectangle r=[a,b,largeur, hauteur] permet de choisir une échelle graphique. tourne une liste de points xy d’un angle autour de centre. translate une entité et ses children. En 2D on peut la combiner avec xgetmouse pour deplacer ces entités à la souris. rassemble différents objets dans un unique handle. annule l’opération précédente Exemples utilisant rotate, glue, move xsetech([0,0,1,1],[-1,-1,1,1]) xy=[(0:0.1:10);sin(0:0.1:10)]/10; for i=2*%pi*(0:10)/10, [xy1]=rotate(xy,i); xpoly(xy1(1,:),xy1(2,:),"lines") end scf(1); plot2d(0,0,-1,"010"," ",[-2,-2,2,2]); xrect(-1,1,2,2); xarc(-0.5,0.5,2,2,0,360*64); a=gca(); r=a.children(1); c=a.children(2); rc=glue([r,c]); move(rc,[-1,-0.5]); 19 un nouvel objet de type compound which is then translated... 4 Exercices Pour les programmes interactifs on a souvent besoin de fonctions assez élémentaires qu’on ne re-crée pas à chaque fois. Beaucoup existent en Scilab mais certaines fonctionnent mal. Les exercices suivants proposent quelques fonctions : 1. Déformation d’une ou plusieurs courbes planes en leur appliquant une transformation affine AB : X → AX + B 2. Création de trames obtenues en faisant tourner des faisceaux de droites parallèles. 3. Poser un objet donné (point, cercle, carré ...) sur une figure en cliquant à la position voulue. 4. Saisir un objet avec la souris et le déplacer. 5. Créer une animation qui ne sautille pas (défilement fluide des images) Exercice 1 Déformer des courbes 1. La fonction plot2d(aa,oo) reçoit une courbe par la donnée d’une suite de points dont les abscisses sont regroupées dans la colonne aa (resp. oo). Écrire une fonction transf recevant (A,B,aa,oo) et renvoyant la matrice [aa1,oo1] donnant les abscises et les ordonnées des images des points [aa,oo] par la transformation AB :X→AX+B. 2. Généraliser le résultat (fonction Transfs) pour déformer simultanément p courbes données par deux matrices aa et oo de type (n, p), la i-ème courbe étant représentée par les i-èmes colonnes de aa et oo. Exercice 2 Trames et pavages 1. On demande d’écrire un programme créant une trame par rotations d’un faisceau de droites parallèles Les paramètres à entrer sont : * d : espacement entre les droites parallèles d un faisceau * n : le nombre c = 2n − 1 est le nombre de segments de chaque faisceau (sans compter les segment-points des extrémites) * p : le nombre alpha = π/p est l’angle entre deux faisceaux consécutifs * co : couleur de la trame 2. Exemples. Construire une trame dont le polygône de base est − un carré, − un triangle équilatéral, − un hexagone. 3. Pour ces exemples les sommets de la trame sont calculables car ce sont les intersections de deux faisceaux parallèles consécutifs (ce qui n’est pas toujours le cas). Les exercices 3.1 à 3.4 créent et modifient graphiquement des listes de points Exercice 3.1 Création graphique d’une liste de points : points(pts,symbole,etiquette) On peut choisir un rectangle d’affichage par defaut, ou définir préalablement le rectangle et éventuellement la trame sur laquelle on veut choisir les points, avant de lancer la procédure points. Ses arguments sont : * pts : c’ est le nombre de points de la liste. Si pts = 0 ce nombre n’est pas prédéfini. * sy est le symbole utilisé pour représenter les points * etiquette vaut 1 si l’on veut qu’un numéro apparaisse à coté de chaque point, et vaut 0 sinon. Exercice 3.2 Déplacemement de points : snap(pts) Lorsqu’on crée avec Scilab un programme interactif, on est amené à placer des points dans la fenêtre graphique dont on peut récupérer la position numérique (ses coordonnées), c’est ce que fait la fonction points de l’exercice 3. Mais de plus on veut pouvoir saisir ces points en approchant le pointeur de l’un d’eux. C’est la fonction snap ; elle recoit une liste de points en matrice (n, 2). Elle ouvre une fenêtre graphique ou insère la liste de points dans la fenêtre graphique courante et affiche le message : 20 disp(’Selectionnez un point (clic gauche simple),.. deplacez le puis deposez le (clic gauche simple’) disp(’clic gauche pour deplacer un autre point, clic droit pour terminer’) Exercice 3.3 Création et déplacemement de points : snapoints1(pts) On veut synthétiser les fonctions des exercices 3.1 et 3.2 en une seule fonction qui peut créer des points ou déplacer des points existants. Exercice 3.4 Création et déplacemement de points numérotés : snapoints2(pts) On reprend enfin l’exercice 3.3 pour lequel on demande que les points apparaissent numérotés, le numéro de chacun suivant bien sûr le point dans ses déplacements. Exercice 4 Enveloppe convexe : convexe(pts) On veut créer et afficher le polygône décrivant le bord de l’enveloppe convexe d’une liste finie L de points. Pour cela on procedera en deux étapes : 1. Créer une fonction recevant un polygône convexe C et un point M , qui renvoie l’enveloppe convexe de [C, M ] (déterminer quels sont les points de C supprimés et remplacés par M ). 2. Partant d’une liste de points L, on crée un premier convexe de la façon suivante : R est le rectangle minimal contenant C et BR est le convexe formé des points de C qui sont au bord du rectangle R. Partant de ce convexe et apliquant la première étape à tous les points de C qui ne sont pas dans BR on construit l’enveloppe convexe de L. Exercice 5 Les ε-points : epsilonpoints On part d’un faisceau F0 de droites parallèles équidistantes de d = 1, puis on construit les p faisceaux Fk obtenus en le faisant tourner d’un angle kπ/p (k = 0, . . . , p − 1). En dehors de l’origine p droites prises respectivement dans chaque faisceau ne sont que rarement concourantes (jamais si p = 5 par exemple). Toutefois elles déterminent en se coupant deux à deux p.(p − 1)/2 points d’intersections qui peuvent être très proches les uns des autres. Plus précisément on montre que pour tout nombre ε (1 > ε ≥ 0), il existe des disques de rayon ε qui sont traversés par une droite de chaque faisceau. Nous dirons qu’un tel disque est un ε-point. Avant de rechercher ces ε-points précisons leur l’intérêt : pour des très petites valeurs de ε (10−6 par exemple) l’allure de la trame autour d’un ε-point P est quasiment indiscernable de son allure autour de l’origine 0 (seul 0-point), ce qui fait apparaı̂tre une périodicité de la trame “fausse mais aussi précise que l’on veut (choix de ε)”. 21