TD No 1
from http://vernier.frederic.free.fr/Teaching/IntroGraphic

Pointeur de Souris image curseur de souris

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
  1. A quoi servent les "si...alors...sinon " du programme ?
  2. a eviter que le pointeur de la souris sorte de l'ecran
  3. Comment faire coulisser le pointeur "bien" contre le bord et pas à quelques pixels du bord ?
  4. 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 !!!
  5. Calculer la vitesse linéaire en mémoire (v en pixels/120ième de secondes)
  6. v ← sqrt(dx*dx+dy*dy);
  7. Pourquoi n'a t-on pas besoin de calculer la vitesse cartésienne (vx et vy) ?
  8. 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)
  9. Calculer l'accélération linéaire et cartésienne (a, ax et ay)
  10. 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 ;
  1. Les "si...alors...sinon" remplissent t-ils toujours leur utilité ?
  2. Oui car ils testent tx quelle que soit sa valeur
  3. Quels nouveaux comportements du pointeur de la souris cela change t-il ?
  4. 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
OU BIEN
Si (v>100 ET a>0) alors {a←a*a;} entre le calcul de a et la ligne 8
  1. A quoi servent ces calculs ?
  2. Ils servent à modifier le comportement de la souris lors des differentes phases d'accéleration, de décéleration, quand le pointeur va vite, etc.
  3. Ces calculs sont-ils compatibles avec la 3ieme ligne proposée avant la question 6 (Ligne de code 17) ?
  4. 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 !