Doc: Exemple du mailleur de delaunay
[svganimation.git] / doc / page.md
index 0fcf2c4..5fbb551 100644 (file)
@@ -1,4 +1,4 @@
-<!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>-->
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
 <script type="text/javascript" src="../SVGAnimation.js"></script>
 <script type="text/javascript" src="../SVGPlayerOne.js"></script>
 <script type="text/javascript">
@@ -8,6 +8,12 @@
     var player = new Controle(anim);
     player.connect();
   }
+  function charge_anim2() {
+    var a = new Animation('anim2','../ellipsographe/svg/ellipsographe-',1,91);
+    a.loopOnload();
+    var b = new Controle(a);
+    b.connect();
+  }
   $(window).load(function() {
     anim = new Animation('XXXX','../ellipsographe/svg/ellipsographe-',1,91);
     anim.loopOnload();
@@ -29,14 +35,15 @@ présentation de ces animations et des modes de construction des fichiers
 SVG.
 
 <div class="alert alert-warning">
-<p>Les différents exemples se charge en cliquant sur le bouton
+<p>Les différents exemples se chargent en cliquant sur le bouton
 dédié. Ceci **n'est pas** le comportement par défaut, c'est du code
 JavaScript qui permettra de choisir quand l'animation se charge. Il
 s'agit
 d'éviter de charger toutes les animations présentes sur cette page,
 cela serait bien trop lourd.</p>
-<p>Nous présentons, dans la section XX, le code qui permet de charger
-l'animation sur demande.</p>
+<p>Nous présentons, dans la section <a
+href="#chargement-différé">Chargement différé</a>, le code qui permet de
+charger l'animation sur demande.</p>
 </div>
 
 ## Installation
@@ -58,7 +65,7 @@ animation dans une page HTML grâce à JavaScript.
 ### La famille d'images
 
 Les différentes images composant l'animation doivent se nommer avec un
-*prefixe* puis d'un nombre (indice), celui-ci pouvant être
+*prefixe* suivi d'un nombre (indice), celui-ci pouvant être
 formater de différente façons :
 
     monfichier-1.svg  monfichier-2.svg monfichier-3.svg ...
@@ -85,14 +92,15 @@ La librairie `SVGAnimation` définit le *prototype* javascript
 `Animation`. Pour l'utiliser il faut déclarer une balise HTML `div`
 avec un identifiant (`id`) unique. Choisissons pour l'exemple `XXXX`.
 À l'intérieur de ces balises, il
-faut :
+faut&#8239;:
+
 * une balise `img` contenant un image `svg` qui servira de vignette à
   l'animation;
 * une balise `div` avec l'identifiant `id="XXXX_message"` où `XXXX` est
   l'identifiant de la balise englobante. Dans cette balise *message*,
   on y met, si on le souhaite, un message à afficher avant le
-  chargement de l'animation.
-* une balise `div` avec l'identifiant `id="XXXX_boutons"`
+  chargement de l'animation;
+* une balise `div` avec l'identifiant `id="XXXX_boutons"`.
 
 
 En supposant que les images SVG se trouvent dans un répertoire nommé
@@ -109,7 +117,7 @@ En supposant que les images SVG se trouvent dans un répertoire nommé
 ### Côté JavaScript
 
 Une fois qu'on a la structure HTML présentée ci-dessus, il est
-nécessaire d'ajouter un peu de code JavaScript permettre à l'animation
+nécessaire d'ajouter un peu de code JavaScript pour permettre à l'animation
 de se jouer.
 
 #### Construire l'objet `Animation`
@@ -130,7 +138,7 @@ dernière.
 
 `anim.loopOnload()` permet le chargement de l'animation.
 
-Une fois celle-ci chargé, il faut en permettre la lecture qui se fait
+Une fois celle-ci chargée, il faut en permettre la lecture qui se fait
 grâce à un nouvel objet nommé `Controle`. Ce contrôle s'utilise en
 fait comme ceci :
 
@@ -171,7 +179,6 @@ Tout ceci donne le code suivant
 ~~~~~~~ { .html }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
 <script type="text/javascript" src="../SVGAnimation.js"></script>
-<script type="text/javascript" src="../SVGPlayerOne.js"></script>
 <script type="text/javascript">
 $(window).load(function() {
     var anim = new Animation('XXXX','svg/ellipsographe-',1,91);
@@ -188,7 +195,7 @@ $(window).load(function() {
 </div>
 ~~~~~~~
 
-dont le résultat est :
+dont l'affichage est :
 
 <div id="XXXX">
   <img src="../ellipsographe/svg/ellipsographe-1.svg" alt="animation1"/>
@@ -197,20 +204,210 @@ dont le résultat est :
 </div>
 
 
+#### Chargement différé
+
+On peut laisser le chargement d'une animation à la demande en créant une
+fonction Javascript.
+
+~~~~~~~ { .javascript }
+function charge_anim2() {
+  var a = new Animation('anim2','svg/ellipsographe-',1,91);
+  a.loopOnload();
+  var b = new Controle(a);
+  b.connect();
+}
+~~~~~~~
 
-<div id="anim2"  style="margin:10px auto;padding:10px;width:350px;border:2px solid #AAA;border-radius:4px">
+Fonction qui sera liée à l'*événement* `onclick` d'un bouton proposant
+justement le chargement de l'animation...
+
+~~~~~~~ { .html }
+<div id="anim2" style="...">
+ <img src="../ellipsographe/svg/ellipsographe-1.svg" alt="animation1" style="..."/>
+ <div class="message" id="anim2_message">Ellipsographe</div>
+ <div id="anim2_boutons">
+   <button onclick="charge_anim2();">Charger l'animation</button>
+ </div>
+</div>
+~~~~~~~
+
+Dans le même temps, le *style* des éléments englobants a été adapté.
+
+<div id="anim2"  style="margin:10px auto;padding:10px;width:354px;border:2px solid #AAA;border-radius:4px">
   <img src="../ellipsographe/svg/ellipsographe-1.svg" alt="animation1" style="width:330px;height:240px"/>
   <div class="message" id="anim2_message">Ellipsographe</div>
-  <div id="anim2_boutons"><button onclick="charge('anim2','../ellipsographe/svg/ellipsographe-',1,91);">Charger l'animation</button></div>
+  <div id="anim2_boutons"><button onclick="charge_anim2()">Charger l'animation</button></div>
 </div>
 
 
+
 ### Les paramètres
 
+L'objet `Animation` ne possède que deux propriétés configurables, autres
+que celles (4) qui lui sont passées en argument.
+
+&bull; **delai** *(valeur par défaut : 50)* &mdash; C'est la durée, en millisecondes, entre deux images.
+
+~~~{.javascript}
+var a = new Animation('anim','svg/pre',1,100);
+a.delai = 200;
+a.loopOnload();
+~~~
+Ceci fixera le défilement à 5 images/s. Un *player* comme ceux que nous vous proposons ci-dessous peut
+modifier cette valeur.
+
+&bull; **pad** *(valeur par défaut : 0)* &mdash; Ce paramètre n'a d'effet
+que s'il est supérieur ou égal à 2, il permet de fixer la longueur des
+index des images en complétant avec des 0.
+
+~~~{.javascript}
+var a = new Animation('anim','svg/pre',1,100);
+a.pad = 3;
+a.loopOnload();
+~~~
+Les images chargées seront, successivement, `svg/pre001.svg`, `svg/pre002.svg`, ..., `svg/pre100.svg`.
+
 ## Les *players*
 
+Le fichier `SVGAnimation.js` contient le constructeur `Controle` qui est
+la base des *players*. S'il est invoqué directement, il fournit un
+contrôle *simpliste* de l'animation, comme cela a été vu
+[ci-dessus](#côté-javascript).
+
 ### `SVGPlayerOne.js`
 
-### `SVGPlayerButtons.js`
+Pour utiliser un *player* plus *sophistiqué*, il faut surcharger la
+méthode `Initialisation` de l'objet `Controle`. Pour plus de détails
+sur les *players*, nous vous invitons à consulter la page dédiée.
+
+L'idée que nous présentons ici est de construire un objet JavaScript
+qui mettra des boutons de contrôle (lecture, stop, etc.).
+
+Ceci peut se faire de la façon suivante :
+
+~~~~~~~ { .javascript }
+function SVGPlayerOne(a) { // déclaration de l'objet
+  Controle.call(this,a); // construit à partir de l'objet Controle
+  SVGPlayerOne.prototype.connect = Controle.prototype.connect // et de
+  // la méthode connect du Controle
+}
+~~~~~~~
+
+Une fois déclaré un tel objet, il suffit de surcharger la méthode
+`Initialisation` de l'objet `Controle` fourni dans `SVGAnimation.js`.
+Dans l'exemple ci-dessous, on « vide » la `div` `XXXX_message`, et on
+ajoute des boutons à la `div` `XXXX_boutons` qui réagissent aux
+`onclick` pour lancer les fonctions JavaScript adéquates définies dans
+le fichier `SVGAnimation.js`.
+
+~~~~~~~ { .javascript }
+// Surcharge de la méthode [Initialisation]
+SVGPlayerOne.prototype.Initialisation = function() {
+  var a = this.a; // l'animation courante
+  var self = this.me; // le player
+  a.image.style.display = 'inline';
+  a.message.parentNode.removeChild(a.message); // on supprime la
+      //balise d'id=XXXX_message
+  var play = document.createElement('button'); // on crée un bouton
+  play.className = "SVGplay playBtn"; // ajout de classe pour le style
+  play.innerHTML = "Play"; // on y met du texte
+  play.onclick = function(){a.action = true; a.rotate(self.a)}; // on
+      // associe une fonction JS
+  // on recommence
+  var stop = document.createElement('button');
+  stop.className = "SVGplay stopBtn";
+  stop.innerHTML = "Stop";
+  stop.onclick = function(){a.action = false;};
+  var debut = document.createElement('button');
+  debut.className = "SVGplay debutBtn";
+  debut.innerHTML = "Début";
+  debut.onclick = function(){a.action = false; a.first(self.a)};
+  var fin = document.createElement('button');
+  fin.className = "SVGplay finBtn";
+  fin.innerHTML = "Fin";
+  fin.onclick = function(){a.action = false; a.last(self.a)};
+  var moins = document.createElement('button');
+  moins.className = "SVGplay moinsBtn";
+  moins.innerHTML = "-";
+  moins.onclick = function(){a.delai = a.delai > 2000 ? 2000 : a.delai * 1.414};
+  var plus = document.createElement('button');
+  plus.className = "SVGplay plusBtn";
+  plus.innerHTML = "+";
+  plus.onclick = function(){a.delai = a.delai < 30 ? 30 : a.delai / 1.414};
+  // placement des boutons
+  a.boutons.appendChild(play);
+  a.boutons.appendChild(stop);
+  a.boutons.appendChild(debut);
+  a.boutons.appendChild(fin);
+  a.boutons.appendChild(moins);
+  a.boutons.appendChild(plus);
+}
+~~~~~~~
+
+Un fois déclaré tout ceci (le mieux étant dans un fichier externe), on
+associe le *player* `SVGPlayerOne` à l'animation de la même façon que
+le *player* `Controle` :
+
+~~~~~~~ { .javascript }
+var anim = new Animation('anim2','svg/ellipsographe-',1,91);
+anim.loopOnload();
+var player = new SVGPlayerOne(anim);
+player.connect();
+~~~~~~~
+
+<script type="text/javascript">
+  function charge_anim3() {
+    var anim = new Animation('anim3','../ellipsographe/svg/ellipsographe-',1,91);
+    anim.loopOnload();
+    var player = new SVGPlayerOne(anim);
+    player.connect();
+  }
+</script>
+
+<div id="anim3" style="margin:10px auto;padding:10px;width:354px;border:2px solid #AAA;border-radius:4px">
+  <img src="../ellipsographe/svg/ellipsographe-1.svg" alt="animation1" style="width:330px;height:240px"/>
+  <div class="message" id="anim3_message">Ellipsographe</div>
+  <div id="anim3_boutons"><button onclick="charge_anim3()">Charger l'animation</button></div>
+</div>
+
+Le fichier `SVGPlayerOne.js` est fourni à la racine du projet SVGAnimation.
+
+
 
 ## Exemples d'utilisation
+
+<div class="row">
+<div class="col-md-4">
+<a href="//melusine.eu.org/syracuse/G/svganimation-exemples/mvtretrograde/"
+alt="lien vers l'exemple"><img src="img/mvtretrograde.png"
+alt="Image de l'exemple" style="width: 100%;"/></a>
+</div>
+<div class="col-md-8">
+Animation  avec le *player* `SVGPlayerButtons` et une factorisation
+avec MetaPost du matériel qui se répète sur chaque image. Le fond
+est mis en *background* de la balise englobante, permettant ainsi
+d'alléger l'animation.
+</div>
+</div>
+
+<div class="row">
+<div class="col-md-4">
+<a href="//melusine.eu.org/syracuse/G/svganimation-exemples/delaunay/"
+alt="lien vers l'exemple"><img src="img/delaunay.png"
+alt="Image de l'exemple" style="width: 100%;"/></a>
+</div>
+<div class="col-md-8">
+Fabrication de l'animation à partir d'un fichier PDF transformé en
+fichiers SVG grâce au programme `pdf2svg`.
+
+Animation avec le *player* `SVGPlayerButtons`. L'animation est une
+animation de construction d'un maillage, le contrôle se fait donc
+image par image.
+
+Le player est donc paramétré pour n'afficher que les boutons de
+*début* et *fin* d'animation, ainsi que l'avance et le recule *image
+par image*.
+
+L'affichage des boutons est personnalisé grâce à du code CSS.
+</div>
+</div>

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.