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

Documents pareils