RECHERCHE

Plan du site

BOURSE

 

RUBRIQUES

 
 TUTORIELS 
Ming: les fonctions de dessin
Présentation des méthodes de dessin Flash de Ming, permettant de tracer des droites et des courbes, et donc de réaliser des formes complexes.  (17 décembre 2002)
 

Suite à notre introduction à Ming, nous allons maintenant passer à une approche pas à pas des fonctions de cette bibliothèque. Dans cet article, nous aborderons les fonctions graphiques, et plus précisément les fonctions de dessin.
Bien que experimentale, Ming dispose d'un lot de fonctions graphiques assez conséquent, qui nous permet de créer des formes évoluées par combinaison de formes plus simples.

Figures de base
Nous avons dans notre précédents article comment créer un objet "droite" (ou un "segment de droite"):

$droite = new SWFShape();
$droite->setLine(1, 0, 0, 0);
$droite->drawLine(0, 220);

De même, nous avons vu comment créer un objet "carré", qui est une combinaison de quatres objets "droite" dans un cinquième objet conteneur, la figure fermée étant ensuite remplie:

$carre = new SWFShape();
$carre->setRightFill($carre->addFill(0, 0, 255));
$carre->movePenTo(-100, -100);
$carre->drawLineTo(100, -100);
$carre->drawLineTo(100, 100);
$carre->drawLineTo(-100, 100);
$carre->drawLineTo(-100, -100);

Nous avons donc à notre disposition les outils nécessaires à la construction de figures dérivées ou approchantes: triangles, quadrilatères (carré, rectange, losange, trapèze...), et toute autre figure composée de segments de droites et d'angles.

Le cercle
Nous allons maintenant aborder la création d'un arc de cercle, à partir duquel nous pourrons construire un cercle plein de la même manière que nous avons construit un carré plein. Nous utiliserons les méthodes drawCurve() et drawCurveTo() de l'objet SWFShape. Ces deux méthodes ne s'utilisent pas de la même manière que drawLine() et drawLineTo(): en effet, le dessin d'un trait ne nécessite que deux points, il en faut un troisième pour une courbe. La courbe a donc besoin d'un point de départ (le dernier endroit où la "plume" s'est posée, qu'on peut modifier avec movePen() ou movePenTo()), d'un point de contrôle défini relativement au point de départ, et d'un point d'encrage défini lui-aussi par rapport au point d'encrage. Ming tracera le trait de la courbe en partant du point de départ, en se dirigeant vers la point de contrôle et en déviant plus ou moins vite vers le point d'encrage, selon la position de ces deux derniers points.

Rappellons la différence entre drawCurve() et drawCurveTo() (et, plus généralement, entre les fonctions de dessins "avec ou sans To final", pour simplifier): les coordonnées de drawCurve() se font par rapport à la position initiale de la "plume" qui se "déplace" dans le repère. Utiliser drawCurveTo(), de son coté, fera que la plume se positionnera dans l'espace de la forme dessinée, et non plus par rapport au point d'origine. En clair, drawCurve() trace une courbe par rapport au point précédent (a pour le point b, et b pour le point c), et drawCurveTo() la trace à l'aide de coordonnées globales.

Ainsi, les deux codes suivants donnent des résultats équivalents:

$courbe1 = new SWFShape();
$courbe1->movePen(0,0);
$courbe1->setLine(1, 125, 175, 125); // 1 twip, vert sombre
$courbe1->drawCurveTo(200, 112, 225, 300);

$courbe2 = new SWFShape();
$courbe2->movePen(0,0);
$courbe2->setLine(1, 255, 125, 125); // 1 twip, rouge sombre
$courbe2->drawCurve(200, 112, 25, 188);

Notez que les coordonnées du point d'encrage (d'arrivée) dans drawCurveTo() sont la somme des coordonnées de drawCurve()...

Des lignes et des courbes, se sont là toutes les capacités de dessin de Ming.
Malgré tout, l'objet SWFShape présente encore quelques méthodes que nous n'avons pas encore abordé. Outre addFill(), movePen() et movePenTo(), nous disponsons des méthodes setLeftFill() et setRightFill(). Nous allons revenir sur chacune.

movePen(): déplace la plume par rapport à son emplacement précédent.
movePentTo(): déplace la plume avec des coordonnées globales.
addFill(): ajouter un remplisage à la liste des styles de remplissage de la figure. Elle renvoie un objet SWFFill, que l'on peut ensuite utiliser avec les fonctions set...Fill(). Le remplissage peut être plein (une couleur), en dégradé ou sous forme d'une image bitmap.
setLeftFill(): rempli la figure avec le style de remplissage défini précédemment avec addFill(), ou un remplissage plein. Le "Left" signifie que cette fonctions doit être utilisée pour les figures tracées dans les sens inverse des aiguilles d'une montre.
setRightFill(): idem que setLeftFill(), mais ne s'applique que pour les figures tracées dans le sens des aiguilles d'une montre.

Pour faciliter le dessin d'un cercle, l'auteur de la bibliothèque propose une fonction complète. Elle permet de tracer un cercle de rayon $r, centré sur les coordonnées ($x, $y) dans la forme $s.

$a = $r * 0.414213562; // la tangente d'un angle de 22.5°

$b = $r * 0.707106781; // le sinus d'un angle de 45°
                       // (ou la moitié de la racine de 2)

$s->movePenTo($x+$r, $y);

$s->drawCurveTo($x+$r, $y-$a, $x+$b, $y-$b);
$s->drawCurveTo($x+$a, $y-$r, $x, $y-$r);
$s->drawCurveTo($x-$a, $y-$r, $x-$b, $y-$b);
$s->drawCurveTo($x-$r, $y-$a, $x-$r, $y);
$s->drawCurveTo($x-$r, $y+$a, $x-$b, $y+$b);
$s->drawCurveTo($x-$a, $y+$r, $x, $y+$r);
$s->drawCurveTo($x+$a, $y+$r, $x+$b, $y+$b);
$s->drawCurveTo($x+$r, $y+$a, $x+$r, $y);

Ce qui nous permet d'écrire...

(fichier cercle.php)
<?php
  $cercle = new SWFShape();
  $cercle->setLine(1,0,0,0);

  $r = 42; // le rayon du cercle
  $x = 42; // l'abcisse du point central
  $y = 42; // l'ordonnée du point central

  $a = $r * 0.414213562;
  $b = $r * 0.707106781;

  $cercle->movePenTo($x+$r, $y);
  $cercle->drawCurveTo($x+$r, $y-$a, $x+$b, $y-$b);
  $cercle->drawCurveTo($x+$a, $y-$r, $x,    $y-$r);
  $cercle->drawCurveTo($x-$a, $y-$r, $x-$b, $y-$b);
  $cercle->drawCurveTo($x-$r, $y-$a, $x-$r, $y);
  $cercle->drawCurveTo($x-$r, $y+$a, $x-$b, $y+$b);
  $cercle->drawCurveTo($x-$a, $y+$r, $x,    $y+$r);
  $cercle->drawCurveTo($x+$a, $y+$r, $x+$b, $y+$b);
  $cercle->drawCurveTo($x+$r, $y+$a, $x+$r, $y);

  $swf=new SWFMovie();
  $swf->setDimension(640, 480);
  $swf->setBackground(255, 255, 255);

  $cercle1=$swf->add($cercle);
  $cercle1->moveTo(100, 100);

  header('Content-type: application/x-shockwave-flash');
  $swf->output();
?>

Voici pour les fonctions de dessin de figures. Nous aborderons les autres fonctions de Ming au fur et à mesure...

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page
 
 

 

 
 
[an error occurred while processing this directive]