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 : dessiner cercles, ellipses et arcs (de cercle ou d'ellipse)

Vous devrez afficher pour cette page la console du navigateur car les scripts contiennent des instructions provisoires de type "console.log(...)"

Bien organiser le code

Cette page comprend quatre éléments CANVAS.
Ils sont identifiés (attribut ID) : canevas1, canevas2, ..., canevas4.
Pour remplir chaque zone de dessin Canvas il y a une fonction. Les fonctions se nomment : fcanevas1, fcanevas2, ..., fcanevas4
Dans chaque fonction j'utilise les mêmes termes pour désigner les variables locales : canevas, contexte, X, Y.
Cette page comprend aussi des Iframes pour intégrer d'autres documents HTML.

Dessiner des cercles et arcs de cercle

Premier canevas de la page : deux cercles

Le code correspondant

HTML : le canevas fait 200 par 200.

Rappel : ne pas oublier la balise NOSCRIPT dans la partie HEAD !

le script :

function fcanevas1()
{                       
	var canevas = document.querySelector('#canevas1'); 
	var contexte = canevas.getContext('2d');
	// dimensions du canevas
	var X = canevas.width ;
	var Y = canevas.height ; 
	console.log(X + " " +typeof(X));
	console.log(Y + " " +typeof(Y));
	// premier cercle
	contexte.arc(X/4, Y/4, X/4, 0, Math.PI*2); 
	contexte.fillStyle	 ='yellow'; 
	contexte.fill(); 
	// deuxième cercle 
	contexte.arc(X/2, Y/2, X/4, 0, Math.PI*2); 
	contexte.lineWidth= 5; 
	contexte.strokeStyle = 'orange'; 
	contexte.stroke(); 
}
fcanevas1(); 

La console retourne deux fois "200 number". Donc nous pouvons utiliser directement ces valeurs pour positionner et dessiner les formes !

Dans l'exemple les coordonnées du centre et le rayon des cercles sont exprimées en fonction de X et Y (dimensions du Canvas). Donc si vous changez les dimensions de la zone de dessin (attributs width & height de la balise canvas) vous n'aurez rien à changer dans le code JavaScript. Pratique, n'est-ce pas !

Il y a cependant un gros bug dans notre code : un segment disgracieux entre les deux cercles !
La raison est simple : nous avons oublié de "lever le crayon" entre les deux cercles !

Pour avoir un code correct il suffit d'insérer une instruction juste avant "contexte.arc()" du deuxième cercle :
contexte.beginPath() ; // début d'un nouveau chemin

Ci-dessous le dessin correct :

La méthode arc()

Pour dessiner un cercle (ou un arc de cercle) il faut utiliser la méthode arc().

Sixième argument facultatif : un Booléen qui, si il vaut true, indique que l'arc sera dessiné dans le sens inverse des aiguilles d'une montre entre les deux angles. Par défaut, la valeur est le sens des aiguilles d'une montre.

Les deux derniers paramètres doivent être exprimés en radians.
Les autres paramètres sont exprimés en pixels (toujours sans préciser l'unité) sous forme d'une constante OU d'une variable retournant un "number".

Pour Canvas un cercle c'est un arc de cercle de 360% (ou 2 π radians) : point de départ = 0 et point d'arrivée = 2 π radians.
Pour désigner la constante π dans le script on utilise : Math.PI) (propriété PI de l'objet Math).

Pour convertir des degrés en radians, vous pouvez utiliser l'expression suivante : radians = Math.PI/180 * degres.

Dessiner des arcs de cercle

Rappels mathématiques : un arc de cercle est une portion de cercle limitée par deux points A et B situés sur la circonférence.

Ci-dessous le deuxième canevas comprenant deux demi-cercles remplis par une couleur orange.

Le code

Le canevas fait 300 par 200.

Le script :

function fcanevas2()
{
	var canevas = document.querySelector('#canevas2');
	var contexte = canevas.getContext('2d');
	var X = canevas.width ; 		
	var Y = canevas.height ; 
	console.log(X + " " +typeof(X));
	console.log(Y + " " +typeof(Y));
	contexte.fillStyle ='orange'; 
	contexte.beginPath(); 
	contexte.arc(X/3, Y/2, X/6, 0, Math.PI); 
	//premier demi cercle
	contexte.fill(); 
	contexte.arc(X/3*2, Y/2, X/6, Math.PI, Math.PI*2); 
	//deuxième demi-cercle
	contexte.fill(); 
}
fcanevas2(); 

Les arcs de cercle sont dessinés par défaut, dans le sens des aiguilles d'une montre en partant de l'est. Voir schéma ci-dessous.

Comment préciser les point de départ et d'arrivée de l'angle ?

Le schéma ci-dessous vous indique que le point 0 est aussi le point 2π (radians).

Exercice

La méthode fill() appliquée à un arc de cercle produit des "segments de cercle".
Pour réaliser des "secteurs de cercle" c'est un peu plus compliqué ...

Ci-dessous un document HTML avec deux "segments de cercle" (arcs remplis jusqu'à la corde) :

Les deux segments de cercle sont inscrits dans le même angle (1,5 π radians) mais avec des points de départ et d'arrivée différents.
En utilisant le schéma ci-dessus vous devez être capable de reconstituer le script.
Extrait du script :

...
contexte.arc(X/4, Y/4, X/4, 0, Math.PI*1.5); 
...
contexte.beginPath() ; 
contexte.arc(X/4*3, Y/4*3, X/4, Math.PI *.5, Math.PI*2);
..

Ellipses et arcs d'ellipse

La méthode ellipse() est récente et n'est pas encore implémentée sur tous les navigateurs. Je présente plus loin dans le chapitre une solution alernative.

Paramétrer la méthode ellipse

Pour produire des ellipses ou arcs d'ellipse il faut utiliser la méthode ellipse avec 7 paramètres !

Huitième argument facultatif : Un Boolean optionnel qui s'il vaut true dessine l'ellipse dans le sens antihoraire, sinon dans le sens horaire.

Dessiner des ellipses

Ci-dessous le troisième canevas de la page avec deux ellipses complètes.
Le canevas identifié "canevas3" fait 400 par 400.
Le script :

function fcanevas3()
{		
	var canevas = document.querySelector('#canevas3'); 
	var contexte = canevas.getContext('2d');
	contexte.ellipse(100, 100, 50, 100, 0, 0, 2 * Math.PI);
	contexte.stroke();
	contexte.beginPath();
	contexte.ellipse(300, 300, 100, 50,0, 0, 2 * Math.PI);
	contexte.stroke();
}
fcanevas3();

Tous les paramètres sont identiques sauf rx & ry.
Comme il s'agit d'ellipses complètes le point A vaut zéro et le point B vaut 2 π radians.

Arcs d'ellipse

Rappels mathématiques : un arc d'ellipse est une portion d'ellipse limitée par deux points A et B situés sur le périmètre.

Ci-dessous un document HTML affichant deux arcs d'ellipse dans un canevas.
Les arcs d'ellipse sont deux demi-ellipses mais les points A et B sont différents.

Comme pour les arcs de cercle, les arcs d'ellipse sont dessinés dans le sens des aiguilles d'une montre en partant de la gauche.
Premier arc d'ellipse : point A : Math.PI ; point B : 2*Math.PI
Deuxième arc d'ellispse : point A : 0 ; point B : Math.PI

Dessiner une ellipse - solution ancienne

Je rappelle qu'il se peut que la nouvelle méthode ellipse() ne soit pas implémentée par votre navigateur.
Et bien il faut alors combiner les méthodes arc() & scale(x,y).
La méthode scale(x,y) crée un changement d'échelle ; voir le chapitre "transformations".

Ci- dessous une belle ellipse réalisée selon l'ancienne méthode (quatrième canevas de la page) :

Le code correspondant

Le canevas fait 400 par 300 et est identifié "canevas4".

La fonction JS :

function fcanevas4()
{
	var canevas = document.getElementById("canevas4"); 
	var contexte = canevas.getContext("2d");
	contexte.lineWidth=3;
	contexte.strokeStyle="olive";
	contexte.scale(1, 0.5);
	contexte.beginPath();
	contexte.arc(200, 200, 180, 0, 2 * Math.PI);
	contexte.stroke();
}
fcanevas4(); 

Notez l'instruction contexte.scale(1, 0.5) afin que l'ellipse soit deux fois plus large que haute : changement d'échelle pour l'axe Y donc les rayons de l'ellipse sont 180 et 90.

Des canevas non responsives

Sur un écran d'ordinateur ces canevas apparaissent petits car ils sont conçus pour l'affichage sur un smartphone. Mais rassurez vous, je vous indiquerai bientôt comment rendre les zones de dessin "responsives" (s'affichant correctement sur tous les terminaux).