TransformationsGeometriques
Un article de Toulouse Sans Fil, un réseau wifi libre sur Toulouse.
Accueil | Technique | Transformations Géométriques
| Sommaire |
Objectifs et introduction
L'objectif de ce document est de vous montrer de quelle facon il est possible de gérer une vue sur un repère orthonormé et de gérer simplement : les déplacements horizontaux et verticaux, un niveau de zoom
Ces principes sont directement applicables à :
- la visualisation de cartes,
- la génération de graph de fonctions,
De même, la procédure inverse de la transformation que nous appellerons transformation inverse permettra de désigner des objets sur une image.
Cette transformation s'appuie uniquement sur le principe mathématique de la règle de 3. C'est donc un simple rapport qui nous conduira à nos objectifs. Il n'y a par conséquant aucune difficulté mathématique si ce n'est de savoir s'orgiser un peu.
L'objectif étant une implémentation objet en php, nous allons dès à présent nous organiser et construire les objets suivants, enfin si on peut parler d'objet plutot que de vocabulaire !
Il existe des mécanisme plus élaborés de transformation 2D et 3D basés sur les matrices. Ce n'est pas le propos de ce document. On trouvera facilement sur Internet des pages dédiées à ce sujet.
Rappel un repère orthonormé est un ... (un matheux please, mais en toute simplicité ...)
Définitions
Pour visualiser une image représentative issue d'un rpère orthonormé nous aurons besoin :
- d'une image dont les dimensions sont exprimées en pixel, ce sera l'objet screen (écran)
- d'une vue sur l'espace orthonormé représentant l'espace que l'on souhaite visualiser. Ce sera l'objet view,
Nous aurons aussi besoin de manipuler des points. Les points seront soit représentés en coordonnées logiques (vue), soit en coordonnées écran. Un mécanisme de transformation nous permettra de passer de l'un à l'autre.
Les objets
Les objets view et screen sont 2 espaces rectangulaires, ils pourront être matérialisés par un objet de type window,les objets qui en découlent sont (classe est le terme approprié en programmation objet) : point (x,y) windows (x, y, w, h) : une fenêtre dont on connait la position (x,y) et les dimensions. la notation pointée
l'acces aux attributs de chaque objet se fait par l'usage de la notation pointée ; ex : p.x : acces a l'attribut x (ordonnée) de point p p1.x, : petite variante p2.y window.w : objet de type window, on accede a l'attribut w (width alias largeur de la fenetre) w.h : objet de type window les calculs
globalement, la transformation sera celle-ci
p1(x,y) / view(x,y,w,h) :-> p2(x,y) / screen(x,y,w,y)
avec : p1 est un point dans le repère orthonormé que l'on à l'habitude d'utiliser p2 est un point (pixel) sur une image défini par ses coordonnées x et y, view est la vue spécifiée
screen est l'image que l'on veut visualiser, avec : x et y = 0, w, h la taille de l'image en pixel, l'axe des abscisses (y) est généralement inversé. le point (0,0) est en haut a gauche de l'image.
les formules à proprement parlé, on ne peut plus simple : p2.x = (p1.x - view.x) * screen.w/view.w p2.y = screen.h - (p1.y - view.h) * screen.w/view.h la transformation inverse
la transformation inverse est aussi basée sur les mêmes principes ; nous irons directement à l'algorithme de transformation : p2.x = (p1.x * view.w/screen.w) + view.x p2.y = ((screen.h - p1.y) * view.h/screen.h) + view.y mise à l'échelle d'un image en fond de carte
Le principe consiste à fabriquer un fond de carte au format image (php, gif) et à l'afficher sur la carte de facon dynamique et en tenant compte du facteur de zoom ainsi que des déplacements éventuels.
D'autre sites attaquent directement un site externe capable de generer des images via le passsage de paramatres par url. C'est une forme de squat et limite en terme de légalité. Mais ce mécanisme offre les meilleurs rendus;
L'idéal serait de disposer d'un fond de carte au format vectoriel assez dense mais pas trop non plus afin de le faire fonctionner en php.
Les principaux outils de carto wifi que j'ai vue font comme cela :
- 2 points référencés sur l'image permettent de déduire la nombre de pixels par km ou centaine de metres,
- les 2 points peuvent etre choisis au hasard, mais il est préférable de choisir 2 points les plus éloignés possible afin de lisser l'erreur,
Pour ma part je pensais qualibrer l'image d'une maniere ou d'une autre et obtenir :
- un point de référence en bas à gauche exprimé en coordonnées géographiques,
une dimension de l'image en km ou degres.
- effectuer une mise a l'échelle par une regle de trois,
- lorsque l'algorithme est mis en place, installer un outil de calibrage de carte.
voici quelques optimisations possibles :
- gérer différents fonds de cartes en fonction du niveau de zoom,
- plutot que d'avoir un fond de carte dans un seul fichier, creer une mosaique de petites images plus legere et rapides a traiter, il faut dans ce cas savoir les juxtaposer.
je n'ai pas encore réussi (11/2004) à mettre au point cet affichage de fond de carte.
Conclusions
Nous espérons que cette page vous sera très utile et vous permettra de réaliser des prouesses graphiques. Une implémentation php est accessible dans la section liens ci-dessous ; en voici l'API
bon codage à tous !
Liens
Classes php contenant l'implémentation
Crédits
- Marc Quinton pour la création et l'idée originale !