{"id":2716,"date":"2008-12-01T16:00:35","date_gmt":"2008-12-01T15:00:35","guid":{"rendered":"http:\/\/www.hyperbate.com\/dernier\/?p=2716"},"modified":"2008-12-01T16:00:35","modified_gmt":"2008-12-01T15:00:35","slug":"processing-onzieme-cours","status":"publish","type":"post","link":"https:\/\/hyperbate.fr\/dernier\/?p=2716","title":{"rendered":"Processing, onzi\u00e8me cours"},"content":{"rendered":"<p>Nous avons d\u00e9j\u00e0 rencontr\u00e9 des variables au fil des scripts, il est temps de faire le point \u00e0 leur sujet. Il s&rsquo;agit d&rsquo;un des concepts cl\u00e9 de la programmation.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2739\" src=\"\/dernier\/files\/2008\/12\/cases_donnees.png\" alt=\"\" width=\"530\" height=\"150\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/cases_donnees.png 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/cases_donnees-300x84.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Une variable est un mot qui est associ\u00e9 \u00e0 une valeur. Je peux par exemple d\u00e9cr\u00e9ter que j&rsquo;utilise une variable nomm\u00e9e <strong>compteur <\/strong>(c&rsquo;est moi qui ai choisi le nom) et qui est associ\u00e9e \u00e0 la valeur 0 (z\u00e9ro). Puis, au cours de mon animation je peux imaginer d&rsquo;incr\u00e9menter ce compteur en fonction d&rsquo;un \u00e9v\u00e8nement, par exemple \u00e0 chaque fois qu&rsquo;un clic de souris est effectu\u00e9. Au premier clic, la variable compteur sera alors incr\u00e9ment\u00e9e de 1 et verra sa valeur passer de z\u00e9ro \u00e0 un, puis au second clic elle sera \u00e0 nouveau incr\u00e9ment\u00e9e et prendra donc la valeur de deux, et ainsi de suite.<br \/>\nLes applications pratiques des variables sont infinies, puisqu&rsquo;elles permettent de faire \u00e9voluer une valeur dans le temps. Par exemple si je souhaite faire bouger un objet sur l&rsquo;\u00e9cran, il faudra que ses coordonn\u00e9es soient stock\u00e9es dans des variables afin que je puisse changer la position de l&rsquo;objet en tenant compte de son \u00e9tat ant\u00e9rieur. Nous alons voir un cas pratique plus loin.<\/p>\n<p>Le principe de fonctionnement des variables n&rsquo;est pas tr\u00e8s difficile \u00e0 comprendre mais le d\u00e9butant peut \u00eatre d\u00e9rout\u00e9 par un certain nombre de pr\u00e9-requis que je vais \u00e9num\u00e9rer ici :<\/p>\n<ul>\n<li>Les variables s&rsquo;\u00e9crivent en un seul mot et ne contiennent donc aucune espace. Elles ne peuvent contenir que des lettres et des chiffres (mais ne peuvent pas commencer par un chiffre) et le caract\u00e8re underscore (<strong>_<\/strong>). Les variables suivantes sont valides : <em>compteur<\/em>, <em>a<\/em>, <em>_test<\/em>. Les variables suivantes ne sont pas valides : <em>mon compteur<\/em>, 2test, <em>bidule&gt;truc<\/em>.<\/li>\n<li>Les noms des variables sont sensibles \u00e0 la casse des caract\u00e8res. Ainsi <em>monCompteur<\/em>, <em>Moncompteur <\/em>et <em>moncompteur <\/em>sont trois variables diff\u00e9rentes.<\/li>\n<li>Sous Processing, les variables sont soumises \u00e0 ce que l&rsquo;on nomme un \u00ab typage fort \u00bb, ce qui signifie que le programme a besoin de savoir quelle type de donn\u00e9es contient la variable (nombre entier, nombre d\u00e9cimal, caract\u00e8re, valeur bool\u00e9enne,&#8230;), et qu&rsquo;il refuse de modifier ce type en cours d&rsquo;ex\u00e9cution du programme.<\/li>\n<li>Une variable cr\u00e9\u00e9e par le programmeur ne doit pas avoir le m\u00eame nom qu&rsquo;une variable syst\u00e8me existante. Par exemple <em>mouseY<\/em> (l&rsquo;ordonn\u00e9e de la souris) est une variable syst\u00e8me qui ne peut pas \u00eatre modifi\u00e9e.<\/li>\n<li>Avant de se voir attribuer une valeur, les variables doivent \u00eatre d\u00e9clar\u00e9es (nous y reviendrons).<\/li>\n<li>Sous Processing, l&rsquo;acc\u00e8s \u00e0 une variable d\u00e9pend du niveau auquel elle a \u00e9t\u00e9 d\u00e9clar\u00e9e (nous y reviendrons en pratique).<\/li>\n<\/ul>\n<p>Voici un exemple tr\u00e8s basique de manipulation d&rsquo;une variable :<\/p>\n<div class=\"code\">\n<pre>float couleur;\n\nvoid setup(){\n  couleur=0;\n  background(couleur);\n}\n\nvoid draw(){\n  if(mousePressed){\n    couleur=couleur+0.5;\n    couleur=couleur*1.05;\n  } else {\n    couleur=couleur*0.9;\n  }\n  background(couleur);\n}<\/pre>\n<\/div>\n<p>Ici la variable se nomme <em>couleur<\/em>. On remarque que sur la premi\u00e8re ligne de mon programme, en marge (c&rsquo;est \u00e0 dire \u00e0 un niveau sup\u00e9rieur) des gestionnaires d&rsquo;\u00e9v\u00e8nement <strong>setup()<\/strong> et <strong>draw()<\/strong>, je d\u00e9clare ma variable en commen\u00e7ant par indiquer son type, suivi de son nom. Ainsi en \u00e9crivant <strong>float couleur;<\/strong>, j&rsquo;avertis Processing que je vais manipuler une variable de type nombre d\u00e9cimal (<em>float<\/em>) nomm\u00e9e <em>couleur<\/em> et que cette variable pourra potentiellement \u00eatre manipul\u00e9e par n&rsquo;importe quelle fonction du programme (c&rsquo;est le fait d&rsquo;\u00eatre d\u00e9clar\u00e9e en dehors des fonctions qui lui donne cette propri\u00e9t\u00e9). Sans cette d\u00e9claration, Processing refuserait d&rsquo;utiliser la variable couleur.<br \/>\nDans notre setup() (fonction lanc\u00e9e une unique fois au d\u00e9but de l&rsquo;ex\u00e9cution du programme), nous associons une valeur (z\u00e9ro) \u00e0 notre variable en \u00e9crivant ceci :\u00a0<em>couleur=0<\/em>. L&rsquo;op\u00e9rateur \u00ab\u00a0=\u00a0\u00bb (\u00e9gal) sert donc \u00e0 affecter une valeur \u00e0 une variable.<br \/>\nA=1 signifie donc : A prend la valeur de 1.<br \/>\n<img decoding=\"async\" class=\"imageadroite\" src=\"\/dernier\/files\/2008\/12\/progression_variable.png\" alt=\"\" width=\"120\" height=\"120\" align=\"right\" \/>Dans notre fonction <em>draw()<\/em> (qui est lanc\u00e9e de mani\u00e8re r\u00e9guli\u00e8re), nous faisons un test (<em>if (mousePressed)<\/em>) qui, on l&rsquo;a vu pr\u00e9c\u00e9demment, permet de v\u00e9rifier si le bouton de la souris est enfonc\u00e9. Dans le cas o\u00f9 le bouton de la souris est effectivement enfonc\u00e9, la variable <em>couleur <\/em>se voit appliquer deux traitements. Tout d&rsquo;abord elle est incr\u00e9ment\u00e9e de 0.5 (z\u00e9ro virgule cinq). Si par exemple elle vaut 100, apr\u00e8s ce premier traitement sa valeur sera de 100.5. Ensuite nous multiplions <em>couleur <\/em>par 1.05. Multiplier par 1.05 (un virgule z\u00e9ro-cinq) \u00e9quivaut \u00e0 ajouter 5% \u00e0 une valeur. Ainsi, 100*1.05 = 105 ; 200*1.05 = 210; etc. Cette multiplication permet \u00e0 ma variable couleur de conna\u00eetre une acc\u00e9l\u00e9ration. Elle conna\u00eetra ces \u00e9tats successifs (que j&rsquo;arrondis \u00e0 trois d\u00e9cimales pour ne pas rendre l&rsquo;\u00e9num\u00e9ration de ces \u00e9tats successifs trop indigeste ou trop illisible) :\u00a00.0 ;\u00a00.525 ; 1.076 ; 1.655 ; 2.262 ; 2.900 ; 3.571 ; 4.274 ; 5.013 ; 5.788 ; 6.603 ; 7.458 ; 8.356 ; 9.299 ; 10.289 ; 11.328 ; 12.420 ; 13.566 ; 14.769 ; 16.032 ; 17.359 ; 18.752 ; 20.215 ; 21.750 ; 23.363 ; 25.056 ; 26.834 ; 28.701 ; 30.661 ; 32.719 ; 34.880 ; 37.149 ; 39.531 ; 42.033 ; 44.660 ; 47.418 ; 50.314 ; 53.354 ; 56.547 ; 59.899 ; 63.419 ; 67.115 ; 70.996 ; 75.071 ; 79.349 ; 83.842 ; 88.559 ; 93.512 ; 98.713 ; 104.173 ; 109.907 ; etc. On peut voir sur l&rsquo;image reproduite au dessus que notre chiffre augmente avec une acc\u00e9l\u00e9ration et non de mani\u00e8re rectiligne.<br \/>\nLa condition <strong>if<\/strong> (si&#8230;) est ici suivie d&rsquo;une alternative <strong>else<\/strong> (sinon &#8211; c&rsquo;est \u00e0 dire, dans ce cas, <em>si le bouton de la souris n&rsquo;est pas enfonc\u00e9<\/em>). Dans cette alternative, je multiplie ma variable couleur par 0.9, c&rsquo;est \u00e0 dire que je lui \u00f4te 10% (multiplier par 0.9 revient \u00e0 enlever dix pour cent).<br \/>\nEnfin, apr\u00e8s avoir proc\u00e9d\u00e9 \u00e0 tous ces calculs, je \u00ab\u00a0repeins\u00a0\u00bb la fen\u00eatre avec la couleur qui correspond au chiffre contenu dans ma variable <em>couleur<\/em>. Si couleur a la valeur de 10, \u00e9crire <em>background(couleur) <\/em>revient \u00e0 \u00e9crire <em>background(10)<\/em>.<\/p>\n<p>Au passage, revoyons la structure des conditions<strong><em> <span style=\"font-weight: normal\">if<\/span><\/em><\/strong> :<br \/>\n<strong>if <\/strong><strong>( <\/strong>condition<strong> ) { <\/strong>actions \u00e0 r\u00e9aliser si la condition est remplie <strong>} else { <\/strong>actions \u00e0 r\u00e9aliser si la condition n&rsquo;est pas remplie <strong>}<\/strong><br \/>\nOn peut imbriquer des conditions dans les conditions, comme ceci : if (a&lt;10){ if (a&lt;5){ &#8230; }}. Il est \u00e0 noter que dans Processing, toute accolade, tout crochet, toute parenth\u00e8se ou toute guillemet ouvertes ( <strong>{[(\u00ab\u00a0<\/strong> ) doivent finir par \u00eatre ferm\u00e9s ( <strong>}])\u00a0\u00bb<\/strong> ).<\/p>\n<div class=\"code\">\n<pre>void draw(){\n  float x = random(100);float y = random(100);\n  float rouge = 0; float vert = 0; float bleu = 0;\n  if(x&lt;33)\n    {rouge=255;}\n  else {\n    if(x&lt;66)\n      {vert=255;}\n    else {\n      {bleu=255;}\n    }\n  }\n fill(rouge, vert, bleu);\n ellipse(x,y,10,10);\n}<\/pre>\n<\/div>\n<p><img decoding=\"async\" class=\"imageadroite\" src=\"\/dernier\/files\/2008\/12\/rvb_hasard.png\" alt=\"\" width=\"100\" height=\"100\" align=\"right\" \/>Dans l&rsquo;exemple ci-dessus, les variables, toutes de type nombre d\u00e9cimal (float) et nomm\u00e9es <em>x<\/em>, <em>y<\/em>, <em>rouge<\/em>, <em>vert <\/em>et <em>bleu<\/em>, sont d\u00e9clar\u00e9es \u00e0 l&rsquo;int\u00e9rieur de la fonction <strong>draw()<\/strong>, ce qui signifie qu&rsquo;elles seront oubli\u00e9es sit\u00f4t que la fonction aura \u00e9t\u00e9 ex\u00e9cut\u00e9e et ne seront pas lisibles par d&rsquo;autres fonctions. Les variables <em>x<\/em> et <em>y<\/em> se voient chacune attribuer une valeur au hasard entre 0 et 100 (<em>random(100)<\/em>), et les autres (<em>rouge<\/em>, <em>vert<\/em>, <em>bleu<\/em>) se voient attribuer la valeur 0 (z\u00e9ro).<br \/>\nNous effectuons ensuite une batterie de tests disant que si <em>x<\/em> est inf\u00e9rieur \u00e0 33 alors <em>rouge <\/em>prend la valeur de 255. Sinon, si <em>x<\/em> est inf\u00e9rieur \u00e0 66 alors <em>vert <\/em>prend la valeur de 255. Dans tous les autres cas, <em>bleu <\/em>prend la valeur de 255. Afin de ne pas faire un script trop long, je n&rsquo;ai pas fait d&rsquo;op\u00e9rations de ce genre se rapportant \u00e0 la valeur de la variable <em>y<\/em>, mais on pourrait tout \u00e0 fait imaginer une telle chose.<br \/>\nPour finir, nous d\u00e9cr\u00e9tons que la couleur de remplissage des formes sera <em>fill(rouge,vert,bleu)<\/em>, c&rsquo;est \u00e0 dire que le \u00ab\u00a0canal\u00a0\u00bb RGB des rouges sera \u00e9gal \u00e0 la valeur de la variable nomm\u00e9e <em>rouge<\/em>, que le \u00ab\u00a0canal\u00a0\u00bb des verts sera \u00e9gal \u00e0 la valeur de <em>vert <\/em>et que le canal bleu sera \u00e9gal \u00e0 la valeur de la variable <em>bleu<\/em>. Dans la pratique, la couleur sera donc (255,0,0), (0,255,0) ou (0,0,255).<br \/>\nPour finir, je dessine une ellipse de 10 pixels de diam\u00e8tre vertical et autant de diam\u00e8tre horizontal \u00e0 la position (x, y) que nous avons obtenue au hasard hasard. Le r\u00e9sultat est l&rsquo;affichage apparemment anarchique de cercles dont la couleur d\u00e9pend cependant de la position horizontale.<br \/>\nCette page est consacr\u00e9e aux variables et il m&rsquo;a sembl\u00e9 logique d&rsquo;en utiliser beaucoup, mais j&rsquo;aurais pu \u00e9crire le script ci-dessus en me passant des variables <em>rouge<\/em>, <em>vert<\/em>, <em>bleu<\/em>, comme ceci :<\/p>\n<div class=\"code\">\n<pre>void draw(){\n  float x = random(100);float y = random(100);\n  if(x&lt;33)\n    {fill(255,0,0);}\n  else {\n    if(x&lt;66)\n      {fill(0,255,0);}\n    else {\n      {fill(0,0,255);}\n    }\n  }\n ellipse(x,y,10,10);\n}<\/pre>\n<\/div>\n<p>Finissons avec ce sujet extr\u00eamement abstrait en \u00e9voquant les types les plus courants de variables que Processing traite :<\/p>\n<ul>\n<li><strong>int <\/strong>: les nombres entiers 32 bits compris entre -2147483647 et +2147483647\u00a0(0, 10, 121, -15,&#8230;).<sup><a href=\"#footnote_1_2716\" id=\"identifier_1_2716\" class=\"footnote-link footnote-identifier-link\" title=\"Ceux qui savent quel parti en tirer seront heureux d&rsquo;apprendre qu&rsquo;il existe aussi des entiers de type byte, cod&eacute;s sur 8 bits (2 puissance 8, donc entre -127 et 127) et des entiers de type long (64 bits, soit 2 puissance 64 nombres diff&eacute;rents)\">1<\/a><\/sup><\/li>\n<li><strong>float <\/strong>: les nombres d\u00e9cimaux (0.129432, 12.1, 145.9999, -0.1,&#8230;)<sup><a href=\"#footnote_2_2716\" id=\"identifier_2_2716\" class=\"footnote-link footnote-identifier-link\" title=\"Il existe aussi des nombres d&eacute;cimaux de type double, cod&eacute;s sur 64 bits\">2<\/a><\/sup>\u00a0.<\/li>\n<li><strong>boolean <\/strong>: valeur binaire qui a la valeur <em>true <\/em>ou la valeur <em>false<\/em>.<\/li>\n<li><strong>char <\/strong>: caract\u00e8re (&lsquo;a&rsquo;, &lsquo;b&rsquo;, &lsquo;z&rsquo;, &lsquo;3&rsquo;). Les caract\u00e8res s&rsquo;\u00e9crivent entre des apostrophes droites (<strong>&lsquo;<\/strong>)<\/li>\n<li><strong>String <\/strong>: cha\u00eene de caract\u00e8res (\u00ab\u00a0bonjour\u00a0\u00bb). Les cha\u00eenes de caract\u00e8res s&rsquo;\u00e9crivent entre des doubles-guillemets (<strong>\u00ab\u00a0<\/strong>)<\/li>\n<li><strong>color <\/strong>: cet objet assez sp\u00e9cifique \u00e0 processing (tous les langages de programmation n&rsquo;ont pas une variable de ce type) permet, comme son nom l&rsquo;indique, de stocker des couleurs pour y acc\u00e9der ensuite avec diverses fonctions. Je peux par exemple \u00e9crire <em>color c = color (255,0,0) <\/em>au d\u00e9but d&rsquo;un programme puis, plus tard d\u00e9cider de peindre la sc\u00e8ne avec cette couleur c, comme ceci : <em>background(c)<\/em>.<\/li>\n<li>enfin, tout objet cr\u00e9\u00e9 par le programmeur (nous aborderons la programmation \u00ab\u00a0orient\u00e9e objet\u00a0\u00bb un peu plus tard) peut \u00eatre utilis\u00e9 par Processing.<\/li>\n<\/ul>\n<div><em>Note : ainsi qu&rsquo;on me le fait remarquer en commentaires \u00e0 cet article, mes indications concernant les guillemets \u00ab\u00a0droits\u00a0\u00bb et apostrophes \u00ab\u00a0droites\u00a0\u00bb ne sont pas tr\u00e8s claires car mon gestionnaire de blog convertit autoritairement ces caract\u00e8res dont il se sert d&rsquo;une autre mani\u00e8re. Je cherche une solution \u00e0 ce probl\u00e8me d&rsquo;affichage.<\/em><\/div>\n<p>Nous allons voir dans le prochain article comment on peut stocker des variables sous forme de listes (ou tableaux).<\/p>\n<ol class=\"footnotes\"><li id=\"footnote_1_2716\" class=\"footnote\"> Ceux qui savent quel parti en tirer seront heureux d&rsquo;apprendre qu&rsquo;il existe aussi des entiers de type <strong>byte<\/strong>, cod\u00e9s sur 8 bits<strong> <\/strong>(2 puissance 8, donc entre -127 et 127) et des entiers de type <strong>long <\/strong>(64 bits, soit 2 puissance 64 nombres diff\u00e9rents) <span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_1_2716\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><li id=\"footnote_2_2716\" class=\"footnote\"> Il existe aussi des nombres d\u00e9cimaux de type <strong>double<\/strong>, cod\u00e9s sur 64 bits <span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_2_2716\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Nous avons d\u00e9j\u00e0 rencontr\u00e9 des variables au fil des scripts, il est temps de faire le point \u00e0 leur sujet. Il s&rsquo;agit d&rsquo;un des concepts cl\u00e9 de la programmation. Une variable est un mot qui est associ\u00e9 \u00e0 une valeur. Je peux par exemple d\u00e9cr\u00e9ter que j&rsquo;utilise une variable nomm\u00e9e compteur (c&rsquo;est moi qui ai [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40],"tags":[],"class_list":["post-2716","post","type-post","status-publish","format-standard","hentry","category-processing"],"_links":{"self":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2716"}],"version-history":[{"count":0,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2716\/revisions"}],"wp:attachment":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}