Accueil
Mes tutoriels sur la programmation

Tutoriel Canvas - sommaire


Vous pouvez me contacter via Facebook (questions, critiques constructives) : page facebook relative à mon site

Canvas : animation de courbes de Bézier quadratique et cubique

Animation d'un courbe quadratique

Exemple

Le code correspondant

Le canevas 'responsive' fait 300 par 200.
Le script (extrait):

function quadratique()
{                     
	var canevas = document.querySelector('canvas'); 
	var contexte = canevas.getContext('2d');
	var yh = 30; var yb = 170 ; 
	var X = canevas.width ; var Y = canevas.height; 
	var delta =1 ;
	function cercles()
	{
		contexte.beginPath(); // dessiner iris
		contexte.fillStyle = 'skyblue'; 
		contexte.arc(150, 100, 25, 0, Math.PI*2);
		contexte.fill(); 
		contexte.beginPath(); //dessiner pupille
		contexte.fillStyle ='black'; 
		contexte.arc(150, 100, 10, 0, Math.PI*2);
		contexte.fill(); 
	} 
	setInterval(cycle,50); 
	function cycle()
	{
		contexte.clearRect(0,0, X,Y) ; 
		cercles(); // appel fonction cercles
		contexte.beginPath() ; // nouveau bridage de l'oeil 
		contexte.moveTo(50,100);
		contexte.quadraticCurveTo(150, yh, 250,100); 
		contexte.quadraticCurveTo(150, yb, 50,100); 
		contexte.lineWidth = 3 ; 
		contexte.stroke(); 
		// nouvelles valeurs y_haut et y_bas pour la passe suivante
		if (yh == 10  ||  yb == 190) { delta = 1 ; } // oeil  ouvert il faut alors le fermer
		if (yh == 50  ||  yb == 150) { delta  = -1 ;} // oeil fermé il faut alors l'ouvrir
		yh = yh + delta  ; yb = yb - delta  ; 
	}
}
quadratique();

Dans la fonction cercles on dessine le centre de l'oeil.
La fonction animate est appelée toutes les 50 millisecondes soit 20 fois par seconde (1000/50 = 20). Vingt images par seconde c'est une bonne fréquence pour une animation.

Dans la fonction animate on efface le dessin précédent, on appelle la fonction cercles puis on dessine deux courbes quadratiques opposées. Mais à chaque fois les ordonnées des points d'inflexion changent (variables yh et yb).
Pour changer les ordonnées des points d'inflexion on utilise une variable delta qui tantôt vaut 1 et tantôt -1 .
Si l'oeil est ouvert delta devient positif et donc on augmente yh et diminue yb donc on commence à refermer l'oeil.
Si l'oeil est fermé (ou presque) delta devient négatif et donc on diminue yh et augmente yb donc on commence à réouvrir l'oeil.

Canvas : courbe de Bézier animée

Exemple

Le code correspondant

Le canevas 'responsive' fait 900 par 450.
Extrait du script :

function cubique()
{
	 var canevas = ...			// référence le deuxième canevas
	 var contexte = canevas.getContext('2d');
	 var X = canevas.width ; var Y = canevas.height; 
	 var i = 0; // variable fonction du temps
	 var sens = 1 ; 
	 setInterval(cycle,50); 
	 function cycle() 
	 {
		contexte.clearRect(0,0,X,Y); 
		var y = Math.abs(Y -i) ; // y : ordonnée du point de départ et d'arrivée 
		// avec la fonction abs : y est toujours positif 
		contexte.beginPath();
		contexte.moveTo(0, y); // ordonnée du point d'origine est y 
		contexte.bezierCurveTo(X/3, 0, 2*X/3, Y, X, y); 
		// les coordonnées des points aimants ne changent pas 
		contexte.lineWidth = '2' ; 		
		contexte.stroke();
		if (i==Y) sens = -1;
		if (i==0) sens = 1 ; 
		i = i +sens ; 
	} 
} // fin fonction cubique
cubique(); 

Les coordonnées des points d'inflexion ainsi que les abscisses des points de départ et d'arrivée ne changent pas !
Ce qui change ce sont les ordonnées du point de départ et du point d'arrivée qui sont désignées par la variable y.
La valeur de y est égal à la valeur absolue de (Y - i). Donc y est toujours positif !
La variable i est tantôt incrémentée et tantôt décrémentée via la variable sens qui tantôt vaut 1 et tantôt -1.

Remarque générale

Dans les deux scripts j'utilise les mêmes noms de variables : canevas, contexte, X, Y et pourtant ça ne pose pas de problème.
Tout simplement parce que ces variables sont définis au sein de fonctions.