Fonction
de zoom
L'usage, dans le monde des SIG, a fait émerger une
technique simple : le dessin du rectangle de zoom sur la carte à
la souris. Comment met-on cela en œuvre dans Géoclip
?
Tout d'abord un petit dessin
:

lc et hc sont la largeur et la hauteur du cadre de la carte, lz
et hz sont la largeur et la hauteur de la zone de zoom. Le facteur
de zoom se déduit de la valeur minimale entre hc/hz et
lc/lz. C'est le facteur d'agrandissement qu'on appliquera globalement
à la carte.
Mais après cette mise
à l'échelle, rien n'oblige a priori le centre du
zoom à coïncider avec le centre de la fenêtre
carte. Il faut donc déplacer la carte (opérer une
translation), de telle sorte que le centre du rectangle de zoom
soit situé au centre de la fenêtre carte. Or on a
affaire à deux systèmes de coordonnées différents
: celui de l'écran, au sein duquel la fenêtre carte
et son centre ont toujours les même coordonnées,
et celui de la carte elle-même, qui subit homothéties
et translations.
On veut donc faire coïncider deux points : le centre de la
fenêtre carte dont les coordonnées écran sont
(CX,CY) et le centre du zoom dont les coordonnées dans
le système de la carte sont (zcx,zcy). La correction à
opérer se déduit de la distance des deux points
dans l'un ou l'autre des systèmes de coordonnées,
l'essentiel étant qu'elle soit mesurée dans le même
système pour les deux points. Choisissons par exemple de
tout ramener au système écran. Il s'agit donc de
calculer les coordonnées du centre du zoom dans ce système,
donc de passer de (zcx,zcy) à (ZCX,ZCY) et d'opérer
la translation (CX-ZCX,CY-ZCY). Pour plus d'explication sur les
calculs de changement de coordonnées, voir Conversion
de coordonnées. Mais comme Flash intègre des
fonctions de changement de système de coordonnées,
autant les utiliser. On se servira de la fonction LocalToGlobal(),
qui permet de passer du système de coordonnées d'un
objet quelconque (ici un objet dénommé "carte"
contenant la carte) au système écran :
centre_zoom = [ { x :
zcx , y : zcy } ] ;
carte.localToGlobal(centre_zoom);
ZCX=centre_zoom.x; ZCY=centre_zoom.y;
la translation correctrice (CX-ZCX,CY-ZCY) devra se faire dans
le système de coordonnées de l'écran.
|