from http://vernier.frederic.free.fr/Teaching/IntroGraphic
Soit un programme AfficheSouris en mémoire qui reçoit deux entrées dx
et
dy
, des entiers désignant le mouvement de la souris en x et en y par
rapport au dernier appel du programme, il y a 1/120ième de seconde.
Le Programme se déroule comme ceci toutes les 8.3ms.
Soit sx
et sy
des variables globales à l'ordinateur
pour désigner la position du pointeur de la souris en pixels à l'écran et
ex
, ey
la taille de l'écran (par exemple 640x480).
Enfin soit l'opération affichePointeurEn(x, y :entier)
qui affiche l'image du pointeur de la souris à l'écran.
01 Algorithme AfficheSouris
02 Lexique :
03 Entrée dx, dy : entier
04 Globale sx, sy, ex, ey : entier
05 Actions : + , >=, <=, AfficherPointeurEn(x, y)
06 Auxiliaire : tx, ty : entier
07 Début
08 tx←sx+dx ; ty←sy+dy ;
09 Si tx<ex ET tx>=0
10 alors sx ← tx;
11 Si ty<ey ET ty>=0
12 alors sy ← ty;
13 AfficherPointeurEn(sx, sy) ;
14 Fin
"si...alors...sinon "
du programme ?
a eviter que le pointeur de la souris sorte de l'ecran
Il faut faire 3 si..alors..sinon et tester les 3 cas separement
Si tx>ex alors sx ← ex;
Si tx<0 alors sx ← 0;
Si tx>=0 ET tx<=ex alors sx ← tx;
... et refaire exactement la meme chose avec y !!!
v ← sqrt(dx*dx+dy*dy);
L'informatique n'a pas d'infini ni d'infiniment petit pour faire le calcul infinitésimal, les notions de derivé et d'intégrale deviennent
des soustractions et des additions dans ce monde fini. La vitesse (notée v ou vx,vy) c'est donc pareil que le déplacement (noté d ou dx,dy)
pour l'acceleration il suffit de sauver la valeur de v avant de la recalculer et de faire le differentiel ensuite
vold ← v;
v ← sqrt(dx*dx+dy*dy);
a ← v-vold;
pour ax,ay, c'est plus complique car on ne peux pas sauver dx, dy qui sont des variables d'entree.Il est toutefois possible
de sauver les valeurs de dx et dy A LA FIN du programme afin de les reutiliser PLUS TARD quand le programme sera rappele.
ax ← dx-dxold;
ay ← dy-dyold;
...
...
dxold ← dx;
dyold ← dx;
AfficherPointeurEn(sx, sy);
Fin
Soit les formules suivantes pour remplacer tx ← sx+dx ; ty ← sy+dy
15 tx ← sx+dx*2; ty ← sy+dy*2 ;
16 tx ← sx+dx*dx*sign(dx)/2; ty ← sy+dy*dy*sign(dy)/2;
17 tx ← sx+dx+ax; ty ←sy+dy+ay ;
"si...alors...sinon"
remplissent t-ils toujours leur utilité ?Oui car ils testent tx quelle que soit sa valeur
Le premier double la vitesse
Le deuxiemme accélère le pointeur de la souris de façon quadratique (fonction au carré)
Le troisieme fait un peu n'importe quoi en ajoutant l'acceleration, le pointeur peut meme retourner en arriere a la fin de la phase de decceleration
Soit les nouveaux calculs suivants :
Si (a>0) alors {dx←dx*2;}
entre le calcul de a et la ligne 8
Si (v>100 ET a>0) alors {a←a*a;}
entre le calcul de a et la ligne 8Ils servent à modifier le comportement de la souris lors des differentes phases d'accéleration, de décéleration, quand le pointeur va vite, etc.
Oui pour la premiere ligne puisque elle modifie dx ... si et seulement si cette ligne est mise avant le calcul de tx !
Non pour la deuxieme puisque elle modifie a est que c'est ax qui est utilisé par la ligne 17 !