Accueil

Traduction

Tutoriel Canvas - sommaire

Tutoriel Canvas - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Canvas : les transformations

Il s'agit des translations, des changements d'échelle et des rotations.

Translation et transparence de formes

Exemple

Huit carrés de couleurs différentes mais avec la même transparence. Chaque carré décalé par rapport au précédent de quelques pixels sauf le dernier.

Affichez la console du navigateur !

Le code de la page

Le code HTML :

<canvas style ="width : 60% ; height :auto;" > </canvas >

Les attributs width & height sont absents de l'instruction HTML. Donc quelles sont les dimensions de ce canevas ?

Le script :

Cette page comprendra plusieurs canevas. Pour remplir chaque canevas : une fonction JS. Ainsi dans chaque fonction on peut employer les mêmes termes pour désigner les variables (canevas, contexte,X,Y) puisque ces dernières sont locales.

Examinons maintenant plus en détail certains instructions du script !

var rouge = 255; var vert = 0; var bleu = 0; : le code RGB initial est rouge.

Changement d'échelle

Exemple

Le code correspondant

Le canevas 'responsive' fait 400 par 400.
Le script :

Je dessine un premier carré rouge de 100 par 100 dans le coin haut gauche du canevas.

Je sauvegarde cet état du canevas : canevas.save()

K'applique au canevas un changement d'échelle pour les deux axes : contexte.scale(2,2)

Je dessine un carré vert (fillRect(100,100,100,100) mais comme l'échelle a été doublée pour les deux axes ce carré a son arête supérieure gauche au point 200,200 (et non pas 100,100) et des côtés de 200 (et non pas 100).

contexte.restore() : restauration de l'état initial sauvegardé donc annulation du changement d'échelle.
fillRect(100,100,50,50) : le carré jaune fait bien 50 par 50 et est bien positionné par rapport au point 100,100.

Via cette exemple nous avons vu trois nouvelles méthodes : scale(),save() & restore().

Rotation de formes

Nous avons vu que nous pouvons changer le point d'origine, changer l'échelle du contexte.
On peut aussi changer l'orientation du contexte ou en d'autres termes effectuer une rotation des axes.

Principes

La méthode rotate() est argumentée par un angle exprimé en radians !
Cette méthode fait pivoter les axes X et Y du repère dans le sens des aiguilles d'une montre autour du point d'origine.
Observez le schéma ci-dessous qui est plus explicatif qu'un long discours.

Ainsi si vous dessinez un carré après une rotation de 45° des axes il apparaitra en fait tel un losange !

Exemple

Trois formes dans le canevas ci-dessus : un carré rouge puis un losange jaune et enfin un carré vert !

Le code correspondant

Le canevas 'responsive' fait 400 par 400.
Le script :

On retrouve l'instruction contexte.save() pour sauvegarder l'état initial (avant rotation de l'axe). Cette instruction est indispensable si une restauration est envisagée. En effet seul un état sauvegardé peut être restauré.
contexte.rotate(Math.PI/180 *45): orientation du canevas de 45°.
On dessine ensuite un carré (rectangle avec largeur = hauteur) qui compte tenu de la rotation apparait tel un losange.
contexte.restore() : on restaure l'état précédent donc on annule la rotation du contexte.
La troisième forme (remplie de vert) apparaît bien comme un carré puisque la rotation des axes a été annulée.

La méthode transform()

La Librairie Canvas ne propose pas de méthode skew()(à la différence de CSS3 et de SVG) pour appliquer un inclinaison (torsion) à une forme.
On ne peut que regretter cette lacune. Mais vous pouvez parvenir au même résultat avec la méthode transform().

Exemple de script basé sur cette méthode

La première forme a une inclinaison verticale, la deuxième une torsion horizontale, la troisième une inclinaison verticale et horizontale.

Le script

Le canevas est identifié "canevas" et fait 500 par 500.

Je définis un modèle de carré (100 par 100) que je duplique trois fois avec à chaque fois torsion et translation.
Avant de dupliquer la forme, j'annule les transformations.

Synthèse

En combinant le constructeur Path2D et les transformations, il est possible de réaliser en quelques lignes de code un superbe graphique.
Ci-dessous un document HTML affiché dans un Iframe.

Etes vous capable de reconstituer le script qui remplit le canevas de cette page ?
Je définis un modèle de cercle puis je le duplique 12 fois avec à chaque fois une opacité plus grande et un changement d'échelle qui donne l'effet 3D.
Donc il y a une boucle pour dupliquer 12 fois le modèle, incrémenter l'opacité, changer d'échelle (1.1 à chaque fois pour chaque axe).
Le script est donc très court.