<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://arts-numeriques.codedrops.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Arts num&#233;riques</title>
	<link>https://arts-numeriques.codedrops.net/</link>
	<description>artsnumeriques est le support des cours de St&#233;phane Noel, professeur &#224; l'&#233;cole de recherche graphique.</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://arts-numeriques.codedrops.net/spip.php?id_mot=37&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Le design g&#195;&#169;n&#195;&#169;ratif, une introduction</title>
		<link>https://arts-numeriques.codedrops.net/Le-design-generatif-une-introduction</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Le-design-generatif-une-introduction</guid>
		<dc:date>2013-05-05T21:27:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Le design g&#195;&#169;n&#195;&#169;ratif est un concept &#195; la mode. Une tentative de d&#195;&#169;finition ici. &lt;br class='autobr' /&gt; Le processus de cr&#195;&#169;ation standard consiste &#195; d&#195;&#169;marrer sur une intention (ou concept, ou id&#195;&#169;e, ou envie, peu importe le terme) et sur cette base produire une cr&#195;&#169;ation &#195; l'aide de la main et d'un outil, qui peut &#195;&#170;tre un crayon aussi bien qu'un outil logiciel comme Photoshop ou Illustrator, d'ailleurs. &lt;br class='autobr' /&gt;
On peut compl&#195;&#169;ter ce sch&#195;&#169;ma par une boucle de r&#195;&#169;troaction. En effet, lorsqu'on est &#195; l'int&#195;&#169;rieur (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Art-generatif-Design-generatif-" rel="directory"&gt;Art g&#233;n&#233;ratif / Design g&#233;n&#233;ratif&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH113/arton371-95720.jpg?1726857209' class='spip_logo spip_logo_right' width='150' height='113' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Le design g&#195;&#169;n&#195;&#169;ratif est un concept &#195; la mode. Une tentative de d&#195;&#169;finition ici.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Le processus de cr&#195;&#169;ation standard consiste &#195; d&#195;&#169;marrer sur une intention (ou concept, ou id&#195;&#169;e, ou envie, peu importe le terme) et sur cette base produire une cr&#195;&#169;ation &#195; l'aide de la main et d'un outil, qui peut &#195;&#170;tre un crayon aussi bien qu'un outil logiciel comme Photoshop ou Illustrator, d'ailleurs.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_904 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH92/schema0-6e171.jpg?1758483405' width='500' height='92' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On peut compl&#195;&#169;ter ce sch&#195;&#169;ma par une boucle de r&#195;&#169;troaction. En effet, lorsqu'on est &#195; l'int&#195;&#169;rieur d'un processus cr&#195;&#169;atif, on &#195;&#169;value le r&#195;&#169;sultat obtenu et selon qu'il corresponde ou pas aux attentes, ou donne de nouvelles id&#195;&#169;es, on revient &#195; la main pour am&#195;&#169;liorer le processus de cr&#195;&#169;ation, pour obtenir d'autres r&#195;&#169;sultats.&lt;br class='autobr' /&gt;
On obtient ce sch&#195;&#169;ma :&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_903 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH186/schema1-2a1ad.jpg?1758483405' width='500' height='186' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Avec le design g&#195;&#169;n&#195;&#169;ratif, le but est de fabriquer une machine (g&#195;&#169;n&#195;&#169;ralement un logiciel) destin&#195;&#169;e &#195; g&#195;&#169;n&#195;&#169;rer des formes et dont on d&#195;&#169;termine le comportement, plut&#195;&#180;t que de dessiner directement. Le d&#195;&#169;veloppement passe par une phase plut&#195;&#180;t abstraite dans laquelle on d&#195;&#169;termine un ensemble de proc&#195;&#169;dures, qu'on appelle algorithme, puis le codage de cet algorithme dans un environnement sp&#195;&#169;cifique (javascript, java, python, c++, etc.). Le r&#195;&#169;sultat obtenu peut &#195;&#170;tre &#195;&#169;valu&#195;&#169; par l'auteur avant de modifier soit les algorithmes, soit le code et les param&#195;&#168;tres. C'est la machinerie, g&#195;&#169;n&#195;&#169;ralement du code, qui produit le r&#195;&#169;sultat, et pas la main dans ce cas.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_905 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH234/schema2-7f04d.jpg?1758483405' width='500' height='234' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Pourquoi tant de complexit&#195;&#169; ?&lt;/h2&gt;
&lt;p&gt;On pourrait se demander quel est l&#226;&#8364;&#8482;int&#195;&#169;r&#195;&#170;t de passer par un media aussi complexe que le code pour obtenir au final quelque chose que l'on peut obtenir par des moyens plus directs comme la main associ&#195;&#169;e au crayon ou &#195; un instrument de musique, etc.&lt;/p&gt;
&lt;p&gt;M&#195;&#169;thodologiquement, le design g&#195;&#169;n&#195;&#169;ratif correspond au d&#195;&#169;sir toujours plus grande de maitrise du processus cr&#195;&#169;atif. Produire un m&#195;&#170;me dessin ou objet avec des variantes de taille, d'outil, de couleur, de support est une demande de longue date de l'industrie, mais aussi des artistes. L'informatique a r&#195;&#169;pondu &#195; cette attente en modifiant le travail des artistes, en d&#195;&#169;portant une partie de leur travail d'ex&#195;&#169;cution vers l'algorithmie, c'est &#195; dire la capacit&#195;&#169; &#195; d&#195;&#169;couper un processus en une s&#195;&#169;rie d'action dites &#034;non ambigu&#195;&#171; s&#034;, et par l&#195; -m&#195;&#170;me r&#195;&#169;p&#195;&#169;tables. Ce n'est donc pas une pr&#195;&#169;occupation isol&#195;&#169;e ni sp&#195;&#169;cifique au champ artistique.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_906 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH313/warhol_dollars-db665.jpg?1758483405' width='500' height='313' title=&#034;Dollars signs, Andy Warhol, 1981&#034; alt=&#034;Dollars signs, Andy Warhol, 1981&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Cette m&#195;&#169;diation donne potentiellement plusieurs gains :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;La profusion&lt;/strong&gt; : en g&#195;&#169;n&#195;&#169;rant 100 graphiques sur base d'un m&#195;&#170;me proc&#195;&#169;d&#195;&#169;, on peut ensuite choisir le ou les meilleurs r&#195;&#169;sultats. Le &#034;Ad generator&#034; de Alexis Lloyd (2006) produisait une multitude d'association texte/image. Une partie est sans int&#195;&#169;r&#195;&#170;t, mais d'autres sont exploitables.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_793 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH375/ad-generator-9dca9.png?1758483405' width='500' height='375' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;L'exhaustivit&#195;&#169;&lt;/strong&gt; : un proc&#195;&#169;d&#195;&#169;, exploit&#195;&#169; par un ordinateur travaillant sans rel&#195;&#162;che, peut passer en revue, syst&#195;&#169;matiquement, toutes les possibilit&#195;&#169;s combinatoires qui s'offre &#195; lui. Sol Lewitt, avec son &#034;Variations Of Incomplete Open Cubes&#034; dessine ainsi toutes les combinatoires possibles et diff&#195;&#169;rentes de 3 &#195; 8 ar&#195;&#170;tes.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_659 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH507/lewitt-opencubes-7dadd.jpg?1758483405' width='500' height='507' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;La complexit&#195;&#169;&lt;/strong&gt; : parce qu'ils sont produits par des machines qui ignorent le sommeil, les dessins g&#195;&#169;n&#195;&#169;ratifs peuvent &#195;&#170;tre vertigineux de complexit&#195;&#169; : milliers de lignes sinueuses, espaces tridimensionnels aux fins d&#195;&#169;grad&#195;&#169;s color&#195;&#169;s, espaces infinis. Une map de Minecraft est sans fin, cr&#195;&#169;&#195;&#169;e &#195; la demande, alternant d&#195;&#169;serts, for&#195;&#170;ts tropicales et campagnes verdoyantes toujours diff&#195;&#169;rentes.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_771 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH384/green-cloud-w2-18f32.jpg?1758483405' width='500' height='384' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;br class='autobr' /&gt;
&lt;i&gt;Roman Verostko, Green cloud, 2011&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;La pr&#195;&#169;cision&lt;/strong&gt; : l&#195; o&#195;&#185; la main tremble, le m&#195;&#169;lange de couleur peut manquer d'uniformit&#195;&#169;, l'ordinateur, l'imprimante, la d&#195;&#169;coupeuse, peuvent lisser la production et permettre de jour des formes combin&#195;&#169;es avec la rigueur du scientifique. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;La rapidit&#195;&#169;&lt;/strong&gt; : sur base de code, on peut tester un proc&#195;&#169;d&#195;&#169; avec une vitesse qui d&#195;&#169;passe ce que la main peut r&#195;&#169;aliser. L'ordinateur devient extension non seulement dans l'espace, mais aussi dans le temps.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;Le temps r&#195;&#169;el&lt;/strong&gt; : la capacit&#195;&#169; d'un code &#195; r&#195;&#169;agit &#195; des interactions en temps r&#195;&#169;el permet d'int&#195;&#169;grer une dimension de performance dans l'action du dessin. Jackson Pollock a utilis&#195;&#169; des r&#195;&#168;gles simple qui lui permettait de s'immerger totalement dans le geste de peindre, dans sa temporalit&#195;&#169; m&#195;&#170;me.&lt;/p&gt;
&lt;p&gt;Il s'agit donc de cr&#195;&#169;er un outil, de la param&#195;&#169;trer, de la regarder produire et de la corriger au besoin. Une fois l'outil produit, il peut &#195;&#170;tre param&#195;&#169;tr&#195;&#169; pour produire des r&#195;&#169;sultats l&#195;&#169;g&#195;&#168;rement ou compl&#195;&#168;tement diff&#195;&#169;rents.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un peu plus d'info&lt;/h2&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://www.generative-gestaltung.de/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Le site &#034;generative design&#034;&lt;/a&gt; qui contient un grand nombre d'exp&#195;&#169;rimentation en Processing t&#195;&#169;l&#195;&#169;chargeable. Le site est traduit en fran&#195;&#167;ais.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Une s&#195;&#169;rie de r&#195;&#169;f&#195;&#169;rence sur &lt;a href=&#034;http://www.olivierevrard.be/master/design_generatif.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le site de Olivier Evrard&lt;/a&gt;, professeur &#195; Li&#195;&#168;ge
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le &lt;a href=&#034;http://openprocessing.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;site Openprocessing&lt;/a&gt;, contenant des milliers de codes pour Processing utilisables&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Translate, rotate et pushMatrix() en 2 dimensions</title>
		<link>https://arts-numeriques.codedrops.net/Translate-rotate-et-pushMatrix-en</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Translate-rotate-et-pushMatrix-en</guid>
		<dc:date>2013-03-10T22:02:23Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Les commandes translate() et rotate() permettent de d&#195;&#169;placer le point d'origine d'une animation. Ces commandes affectent tous les dessins qui vont suivre. pushMatrix() va nous permettre d'isoler ces op&#195;&#169;rations, comme on le verra. &lt;br class='autobr' /&gt; Translate Pour notre test, nous allons charger un fichier SVG, plut&#195;&#180;t qu'une image. Le SVG est un format vectoriel &#195; la norme ouverte, un concurrent open source au format illustrator, lisible nativement. &lt;br class='autobr' /&gt; PShape m16 ; &lt;br class='autobr' /&gt;
void setup() size(600, 600) ; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Formation-" rel="directory"&gt;Formation&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Les commandes translate() et rotate() permettent de d&#195;&#169;placer le point d'origine d'une animation. Ces commandes affectent tous les dessins qui vont suivre. pushMatrix() va nous permettre d'isoler ces op&#195;&#169;rations, comme on le verra.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Translate&lt;/h2&gt;
&lt;p&gt;Pour notre test, nous allons charger un fichier SVG, plut&#195;&#180;t qu'une image. Le SVG est un format vectoriel &#195; la norme ouverte, un concurrent open source au format illustrator, lisible nativement.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PShape m16; void setup() { size(600, 600); m16=loadShape(&#034;m16.svg&#034;); } void draw() { background(255); shape(m16, 0, 0); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_550 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L496xH502/step1-a18ac.jpg?1726862610' width='496' height='502' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;L'image s'affiche dans le coin sup&#195;&#169;rieur gauche, sans surprise.&lt;br class='manualbr' /&gt;Pour notre exemple, nous voulons faire tourner ce flingue comme l'aiguille d'une horloge. Pour cela, nous allons d&#195;&#169;placer le point 0,0 de notre animation au centre de l'animation. Pour &#195;&#167;a, utilisons la commande translate().&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PShape m16; void setup() { size(600, 600); m16=loadShape(&#034;m16.svg&#034;); } void draw() { background(255); translate(width/2, height/2); shape(m16, 0, 0); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_551 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L474xH498/step2-2-cc6da.jpg?1726862610' width='474' height='498' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Magnifique. Voil&#195; notre m16 au centre de l'image. Tout ce qui sera dessin&#195;&#169; apr&#195;&#168;s la fonction translate() le sera &#195; partir de ces nouvelles coordonn&#195;&#169;es.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Rotate&lt;/h2&gt;
&lt;p&gt;Maintenant que le flingue est au centre, nous allons le faire tourner sur base de la fonction rotate(), coupl&#195;&#169;e &#195; la fonction second(), qui donne un chiffre de 0 &#195; 59.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PShape m16; void setup() { size(400, 400); m16=loadShape(&#034;m16.svg&#034;); } void draw() { background(255); translate(width/2, height/2); float angle=map(second(),0,59,0,TWO_PI); rotate(angle); shape(m16, 0, 0); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rotate() fait tourner la surface de l'animation exactement comme si on tournait une feuille de papier pour dessiner une ligne plus confortablement avec un crayon. L'argument dans les parenth&#195;&#168;ses est exprim&#195;&#169;e en radiants, un chiffre entre 0 et deux fois la valeur de PI (environ 6,28).&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_552 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L489xH487/step3-5ea40.jpg?1726862610' width='489' height='487' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Le probl&#195;&#168;me, c'est que tout ce qui sera dessin&#195;&#169; ensuite gardera les m&#195;&#170;mes coordonn&#195;&#169;es 0,0...&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PShape m16; void setup() { size(400, 400); m16=loadShape(&#034;m16.svg&#034;); } void draw() { background(255); translate(width/2, height/2); float angle=map(second(),0,59,0,TWO_PI); rotate(angle); shape(m16, 0, 0); line(0,30,200,30); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_553 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L479xH491/step4-b2183.jpg?1726862610' width='479' height='491' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&#195;&#8225;a peut &#195;&#170;tre compliqu&#195;&#169;, du coup, de dessiner une autre forme au point 0,0 d'origine. Heureusement, les fonctions pushMatrix() et popMatrix() sont l&#195; pour aider.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;pushMatrix() et popMatrix()&lt;/h2&gt;
&lt;p&gt;pushMatrix() cr&#195;&#169;e une parenth&#195;&#168;se, retenant l'endroit ou se trouve le point d'origine avant qu'on l'appelle. On peut ensuite op&#195;&#169;rer toutes les fonctions translate() et rotate() n&#195;&#169;cessaire.&lt;br class='manualbr' /&gt;popMatrix() ferme cette parenth&#195;&#168;se, et revient au point d'origine avant l'appel de pushMatrix().&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PShape m16; void setup() { size(400, 400); m16=loadShape(&#034;m16.svg&#034;); } void draw() { background(255); pushMatrix(); translate(width/2, height/2); float angle=map(second(),0,59,0,TWO_PI); rotate(angle); shape(m16, 0, 0); popMatrix(); line(0,30,200,30); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_554 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L485xH488/step5-44a67.jpg?1726862610' width='485' height='488' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Voil&#195; . Ces m&#195;&#169;thodes sont tr&#195;&#168;s utiles pour dessiner diff&#195;&#169;rents objets, &#195; diff&#195;&#169;rents endroits d'une animation, sans se soucier des coordonn&#195;&#169;es. Translate() se charge de d&#195;&#169;placer le point d'&#195;&#169;criture, dessiner, puis revenir &#195; z&#195;&#169;ro.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Fichiers : lister les fichiers contenus dans un dossier</title>
		<link>https://arts-numeriques.codedrops.net/Fichiers-lister-les-fichiers</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Fichiers-lister-les-fichiers</guid>
		<dc:date>2012-12-11T15:16:57Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Pour charger 10 images, 10 sons, ou dix fichiers quelconques, on peut passer par une liste que l'on &#195;&#169;crit en t&#195;&#170;te de fichier. Mais &#195;&#167;a peut &#195;&#170;tre fastidieux. Voici une classe permettant de lister les fichiers (en choisissant le type de fichier) contenu dans un dossier provenant du dossier du sketch. &lt;br class='autobr' /&gt; Le code de la classe &lt;br class='autobr' /&gt; // list_directory(nom du dossier, extension a filtrer separ&#195;&#169;s par des |) ; // renvoie un array de string class list_directory String extension ; String[] (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Outils-" rel="directory"&gt;Outils&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Pour charger 10 images, 10 sons, ou dix fichiers quelconques, on peut passer par une liste que l'on &#195;&#169;crit en t&#195;&#170;te de fichier. Mais &#195;&#167;a peut &#195;&#170;tre fastidieux. Voici une classe permettant de lister les fichiers (en choisissant le type de fichier) contenu dans un dossier provenant du dossier du sketch.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Le code de la classe&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// list_directory(nom du dossier, extension a filtrer separ&#195;&#169;s par des |); // renvoie un array de string class list_directory { String extension; String[] fichiers; String dossier; int nb_items; //constructeur list_directory(String dossier, String extension){ this.dossier=dossier; this.extension=extension; fichiers = listFileNames(sketchPath + &#034;/&#034; + dossier, extension); nb_items=fichiers.length; println(fichiers.length + &#034;elements&#034;); } // listage le contenu d'un dossier en ne prenant que les extensions fournies ------------------------- String[] listFileNames(String dir, String extension) { File file = new File(dir); if (file.isDirectory()) { String names[] = file.list(); // procedure d'elimination des fichiers non concern&#195;&#169;s String[] names_ok= {}; for(int i=0; i&lt;names.length;i++) { String[] m1 = match(names[i], extension); if (m1 != null) { names_ok=append(names_ok,dossier+&#034;/&#034;+names[i]); } } return names_ok; } else { // If it's not a directory println(&#034;le nom fourni n'est pas celui d'un dossier&#034;); return null; } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Utiliser la classe&lt;/h2&gt;
&lt;p&gt;La classe s'utilise de mani&#195;&#168;re traditionnelle : on cr&#195;&#169;e un objet et on appelle le constructeur. On doit sp&#195;&#169;cifier le nom du dossier (&#195; partir de la racine du dossier du sketch) et les extensions d&#195;&#169;sir&#195;&#169;es, s&#195;&#169;par&#195;&#169;es par des pipes ( | ). On obtient une liste directement utilisable dans une boucle.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import java.io.File; // necessaire seulement depuis la version 2b07 ! String dossier_source=&#034;database&#034;; // nom du dossier list_directory liste; void setup(){ size(600,600); liste = new list_directory(dossier_source, &#034;jpg|png|gif&#034;); } void draw(){ background(0); for (int i=0;i&lt;liste.nb_items;i++) { text(liste.fichiers[i],10,20+(i*20)); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Lire un fichier xml</title>
		<link>https://arts-numeriques.codedrops.net/Plus-lire-un-fichier-xml</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Plus-lire-un-fichier-xml</guid>
		<dc:date>2012-03-28T13:44:39Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Ce code de lecture permet de lire un fichier xml &#195;&#169;crit par le code contenu dans l'article &#034;Cr&#195;&#169;er un fichier xml&#034;. &lt;br class='autobr' /&gt; Voir l'article &#034;cr&#195;&#169;er un xml&#034; &lt;br class='autobr' /&gt;
Ce code g&#195;&#169;n&#195;&#168;re une structure comme ceci &lt; ?xml version=&#034;1.0&#034; encoding=&#034;utf-8&#034; ?&gt; 73 71 69 70 71 71 &lt;br class='autobr' /&gt;
Des images stock&#195;&#169;es pixel par pixel dans un tag appel&#195;&#169; &#034;Bytes&#034; lui-m&#195;&#170;me &#195; l'int&#195;&#169;rieur d'un tag appel&#195;&#169; &#034;EcranMatrix&#034;. On acc&#195;&#168;de aux donn&#195;&#169;es comme suit. &lt;br class='autobr' /&gt; // Lecteur de fichier xml (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Outils-" rel="directory"&gt;Outils&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Ce code de lecture permet de lire un fichier xml &#195;&#169;crit par le code contenu dans l'article &#034;Cr&#195;&#169;er un fichier xml&#034;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Voir l'article &lt;a href=&#034;http://arts-numeriques.codedrops.net/Plus-creer-un-xml&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#034;cr&#195;&#169;er un xml&#034;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce code g&#195;&#169;n&#195;&#168;re une structure comme ceci&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?xml version=&#034;1.0&#034; encoding=&#034;utf-8&#034;?&gt; &lt;EcranMatrix&gt; &lt;Bytes&gt; &lt;int&gt;73&lt;/int&gt; &lt;int&gt;71&lt;/int&gt; &lt;int&gt;69&lt;/int&gt; &lt;int&gt;70&lt;/int&gt; &lt;int&gt;71&lt;/int&gt; &lt;int&gt;71&lt;/int&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Des images stock&#195;&#169;es pixel par pixel dans un tag appel&#195;&#169; &#034;Bytes&#034; lui-m&#195;&#170;me &#195; l'int&#195;&#169;rieur d'un tag appel&#195;&#169; &#034;EcranMatrix&#034;. On acc&#195;&#168;de aux donn&#195;&#169;es comme suit.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// Lecteur de fichier xml XMLElement xml; int numframes; int compteur=0; float ratiox; float ratioy; boolean play=true; void setup() { size(640, 400); // calcul de la taille des pixels ratiox=width/44.0; ratioy=height/28.0; // vitesse de lecture : 15 fames par secondes frameRate(15); xml = new XMLElement(this, &#034;test.xml&#034;); numframes=xml.getChildCount(); noStroke(); } void draw() { // recuperer le contenu du tag &#034;EcranMatrix&#034; XMLElement kid=xml.getChild(compteur); // recuperer le contenu du tag &#034;Bytes&#034; XMLElement bytes=kid.getChild(0); // maintenant, recuperer les pixels dans les tags &#034;int&#034; // et afficher la grille de 44 * 28 for (int y=0;y&lt;28;y++) { for (int x =0; x&lt;44;x++) { XMLElement lepixel = bytes.getChild((y*44)+x); String contenu = lepixel.getContent(); fill(int(contenu)); rect(x*ratiox, y*ratioy, ratiox, ratioy); } } // en boucle compteur++; if (compteur &gt;= numframes) { compteur=0; } } // arreter ou relancer avec la barre d'espacement void keyPressed() { if (key==' ') { if (play==false) { play=true; loop(); } else { play=false; noLoop(); } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Parcourir la surface de l'animation en grille</title>
		<link>https://arts-numeriques.codedrops.net/5-Parcourir-la-surface-de-l</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/5-Parcourir-la-surface-de-l</guid>
		<dc:date>2012-02-05T22:55:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;On peut parcourir la surface de l'animation pour y cr&#195;&#169;er des &#195;&#169;l&#195;&#169;ments &#195; intervalles r&#195;&#169;guliers, une grille donc. Deux boucles imbriqu&#195;&#169;es y suffit. &lt;br class='autobr' /&gt; Une variable &#034;division&#034; d&#195;&#169;finit le nombre de division dans la page. On calcule la largeur et hauteur de la grille &#195; partir de la taille de la fen&#195;&#170;tre et du nombre de division. &lt;br class='autobr' /&gt;
Ensuite, une premi&#195;&#168;re boucle va parcourir l'axe vertical de l'animation, une deuxi&#195;&#168;me va parcourir l'axe horizontal. &lt;br class='autobr' /&gt;
Ce script cr&#195;&#169;e une ligne diagonale de (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Formation-" rel="directory"&gt;Formation&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH150/arton322-fe63f.jpg?1726857209' class='spip_logo spip_logo_right' width='150' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;On peut parcourir la surface de l'animation pour y cr&#195;&#169;er des &#195;&#169;l&#195;&#169;ments &#195; intervalles r&#195;&#169;guliers, une grille donc. Deux boucles imbriqu&#195;&#169;es y suffit.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une variable &#034;division&#034; d&#195;&#169;finit le nombre de division dans la page. On calcule la largeur et hauteur de la grille &#195; partir de la taille de la fen&#195;&#170;tre et du nombre de division.&lt;/p&gt;
&lt;p&gt;Ensuite, une premi&#195;&#168;re boucle va parcourir l'axe vertical de l'animation, une deuxi&#195;&#168;me va parcourir l'axe horizontal.&lt;/p&gt;
&lt;p&gt;Ce script cr&#195;&#169;e une ligne diagonale de haut en bas ou de bas en haut, en fonction d'un tirage au sort.&lt;/p&gt;
&lt;p&gt;La fonction &#034;noLoop()&#034; permet d'arreter le script apr&#195;&#168;s un dessin, et de le relancer lorsqu'on appuie sur une touche.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le code :&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;int division=20; float largeur; float hauteur; void setup(){ size(800,800); largeur=width/division; hauteur=height/division; } void draw(){ background(255); for(int y=0;y&lt;height;y+=hauteur){ for(int x=0;x&lt;width;x+=largeur){ if(random(10)&gt; 5){ line(x,y,x+largeur,y+hauteur); } else { line(x,y+hauteur,x+hauteur,y); } } } noLoop(); } void keyPressed(){ loop(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Cr&#195;&#169;er un fichier xml</title>
		<link>https://arts-numeriques.codedrops.net/Plus-creer-un-xml</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Plus-creer-un-xml</guid>
		<dc:date>2011-12-06T14:13:04Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Ce script permet, &#195; partir de la webcam, de g&#195;&#169;n&#195;&#169;rer un fichier xml. Une classe a &#195;&#169;t&#195;&#169; cr&#195;&#169;&#195;&#169;e pour l'occasion. Elle peut cr&#195;&#169;er un fichier xml et d'&#195;&#169;crire des &#195;&#169;l&#195;&#169;ments &#195; partir de l'analyse d'une image. Ce script a &#195;&#169;t&#195;&#169; produit pour une structure de xml bien pr&#195;&#169;cise. Pour l'&#195;&#169;criture d'une autre structure il faudra modifier la classe... &lt;br class='autobr' /&gt; La classe xml_writer Voici la classe voici le code : // classe xml_writer // cr&#195;&#169;e un fichier xml // methode : // .initialise(&#034;nom_du_fichier&#034;) (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Outils-" rel="directory"&gt;Outils&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Ce script permet, &#195; partir de la webcam, de g&#195;&#169;n&#195;&#169;rer un fichier xml. Une classe a &#195;&#169;t&#195;&#169; cr&#195;&#169;&#195;&#169;e pour l'occasion. Elle peut cr&#195;&#169;er un fichier xml et d'&#195;&#169;crire des &#195;&#169;l&#195;&#169;ments &#195; partir de l'analyse d'une image.&lt;br class='manualbr' /&gt;Ce script a &#195;&#169;t&#195;&#169; produit pour une structure de xml bien pr&#195;&#169;cise. Pour l'&#195;&#169;criture d'une autre structure il faudra modifier la classe...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;La classe xml_writer&lt;/h2&gt;
&lt;p&gt;Voici la classe&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;voici le code: // classe xml_writer // cr&#195;&#169;e un fichier xml // methode : // .initialise(&#034;nom_du_fichier&#034;) // ouvre l'&#195;&#169;criture // .ajouteFrame(image) // ajoute un frame &#195; partir d'une image cropp&#195;&#169;e au besoin // .ajouteFrame(array) // ajoute un array de nombre // .stoppe() // ferme le fichier (indispensable) class xml_writer { String nomdufichier; int nb_images; PImage frame; boolean start; PrintWriter output; xml_writer(String tnom) { nomdufichier=tnom; start=false; } void initialise() { if (start==false) { output = createWriter(nomdufichier); output.println(&#034;&lt;?xml version=\&#034;1.0\&#034; encoding=\&#034;utf-8\&#034;?&gt;&#034;); output.println(&#034;&lt;ArrayOfEcranMatrix xmlns:xsi=\&#034;http://www.w3.org/2001/XMLSchema-instance\&#034; xmlns:xsd=\&#034;http://www.w3.org/2001/XMLSchema\&#034;&gt;&#034;); start=true; nb_images=0; println(&#034;fichier cr&#195;&#169;&#195;&#169;&#034;); } } void stoppe() { if (start==true) { output.flush(); // Writes the remaining data to the file output.println(&#034;&lt;/ArrayOfEcranMatrix&gt;&#034;); output.close(); // Finishes the file println(&#034;fichier ferm&#195;&#169;&#034;); } } void ajouteFrame(int[] f) { println(&#034;ajout d'un frame depuis un array&#034;); if (start==true) { if (f.length &gt; (44*28)-1) { output.println(&#034; &lt;EcranMatrix&gt;&#034;); output.println(&#034; &lt;Bytes&gt;&#034;); for (int i=0;i&lt; 44*28;i++) { output.println(&#034;&lt;int&gt;&#034;+ f[i] +&#034;&lt;/int&gt;&#034;); } output.println(&#034; &lt;/Bytes&gt;&#034;); output.println(&#034; &lt;Name&gt;&#034;+nb_images+&#034;&lt;/Name&gt;&#034;); output.println(&#034; &lt;/EcranMatrix&gt;&#034;); nb_images++; } } } void ajouteFrame(PImage tframe) { println(&#034;ajout d'un frame depuis une image&#034;); float ratio=44*1.0/28*1.0; // ratio de l'image float imaratio = tframe.width*1.0 / tframe.height*1.0; if (imaratio &lt; ratio) { tframe.resize(44, 0); } else { tframe.resize(0, 28); } tframe.save(&#034;images/img_&#034;+ nb_images +&#034;.tif&#034;); PImage finali=tframe.get(0, 0, 44, 28); if (start==true) { finali.loadPixels(); output.println(&#034; &lt;EcranMatrix&gt;&#034;); output.println(&#034; &lt;Bytes&gt;&#034;); for (int i=0;i&lt; 44*28;i++) { int pixelColor = finali.pixels[i]; // Faster method of calculating r, g, b than red(), green(), blue() int r = (pixelColor &gt;&gt; 16) &amp; 0xff; int g = (pixelColor &gt;&gt; 8) &amp; 0xff; int b = pixelColor &amp; 0xff; float luminance = 0.3*r + 0.59*g + 0.11*b; output.println(&#034; &lt;int&gt;&#034;+ int(luminance) +&#034;&lt;/int&gt;&#034;); } output.println(&#034; &lt;/Bytes&gt;&#034;); output.println(&#034; &lt;Name&gt;&#034;+nb_images+&#034;&lt;/Name&gt;&#034;); output.println(&#034; &lt;/EcranMatrix&gt;&#034;); nb_images++; } else { println(&#034;ecriture impossible, fichier non ouvert&#034;); } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Un exemple d'utilisation cette classe&lt;/h2&gt;
&lt;p&gt;Ce code envoie l'image de l'&#195;&#169;cran vers la classe, qui se charge de la r&#195;&#169;duire puis la coder dans le xml. Une image est aussi sauv&#195;&#169;e dans le dossier du script.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; Capture video; xml_writer lefichier; void setup(){ size(640,480); video = new Capture(this, 640, 480, 15); lefichier = new xml_writer(&#034;test.xml&#034;); lefichier.initialise(); background(255); } void draw(){ set(0, 0, video); } public void keyPressed() { switch (key) { case ' ': lefichier.ajouteFrame(get()); break; case 'x': lefichier.stoppe(); exit(); break; } } public void captureEvent(Capture c) { c.read(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Une variante : exporter les images d'un film&lt;/h2&gt;
&lt;p&gt;Ici, on capture une image tous les 15eme de secondes et on les exporte. Pas d'action manuelle, le script se lance, fait son job et quitte.&lt;br class='manualbr' /&gt;Attention, la librairie video est assez difficile sur les fichiers &#195; afficher. Certaines vid&#195;&#169;os se lisent mal, crashent parfois. Tester diff&#195;&#169;rents types de compression. Je n'ai jamais r&#195;&#169;ussi a &#195;&#170;tre certain d'un format...&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; Movie myMovie; xml_writer lefichier; void setup() { size(640, 480, P2D); background(0); frameRate(15); // Ne pas oublier de placer la vid&#195;&#169;o dans le dossier du script // et de modifier la ligne ci-dessous myMovie = new Movie(this, &#034;station.mov&#034;); myMovie.play(); lefichier = new xml_writer(&#034;movie.xml&#034;); lefichier.initialise(); } void movieEvent(Movie myMovie) { myMovie.read(); } void draw() { image(myMovie, 0,0,width,height); if (myMovie.duration() == myMovie.time()) { lefichier.stoppe(); exit(); } else { lefichier.ajouteFrame(myMovie.get()); } } void keyPressed() { // appuyer sur n'importe quelle touche quitte proprement lefichier.stoppe(); exit(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Ecrire et parser un fichier simple</title>
		<link>https://arts-numeriques.codedrops.net/Ecrire-et-parser-un-fichier-simple</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Ecrire-et-parser-un-fichier-simple</guid>
		<dc:date>2011-11-23T10:52:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>&lt;p&gt;Le parsing peut &#195;&#170;tre d&#195;&#169;fini en informatique comme l'op&#195;&#169;ration d'extraire une information structur&#195;&#169;e d'un flux de donn&#195;&#169;es. Un ensemble de caract&#195;&#168;res informatiques d'un c&#195;&#180;t&#195;&#169;, une information utilisable de l'autre, et au milieu analyse et extraction.&lt;/p&gt;

-
&lt;a href="https://arts-numeriques.codedrops.net/-Formation-" rel="directory"&gt;Formation&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH100/arton313-d8c22.jpg?1726857208' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Le parsing peut &#195;&#170;tre d&#195;&#169;fini en informatique comme l'op&#195;&#169;ration d'extraire une information structur&#195;&#169;e d'un flux de donn&#195;&#169;es. Un ensemble de caract&#195;&#168;res informatiques d'un c&#195;&#180;t&#195;&#169;, une information utilisable de l'autre, et au milieu analyse et extraction.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Garder une partie des informations produites par un logiciel est un probl&#195;&#168;me int&#195;&#169;ressant en informatique. Pouvoir utiliser ces informations, soit pour restituer fid&#195;&#168;lement le processus qui les a cr&#195;&#169;&#195;&#169;, soit pour les transformer en autre chose, est un autre probl&#195;&#168;me int&#195;&#169;ressant.&lt;/p&gt;
&lt;p&gt;Cet article s'attache &#195; montrer un syst&#195;&#168;me simple d'&#195;&#169;criture de donn&#195;&#169;es dans un fichier texte, et un autre syst&#195;&#168;me de lecture et utilisation de ces m&#195;&#170;mes donn&#195;&#169;es.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;1) &#195;&#169;crire des donn&#195;&#169;es avec printWriter&lt;/h2&gt;
&lt;p&gt;Printwriter est une classe permettant de g&#195;&#169;n&#195;&#169;rer des fichiers texte simples. On trouvera sur &lt;a href=&#034;http://processing.org/reference/PrintWriter.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la page de r&#195;&#169;f&#195;&#169;rence sur le site de Processing un exemple&lt;/a&gt;, que nous allons modifier l&#195;&#169;g&#195;&#168;rement pour le rendre plus riche en information.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PrintWriter output; void setup() {
size(600,400);
frameRate(24); // on calibre une vitesse d'ex&#195;&#169;cution // Create a new file in the sketch directory output = createWriter(&#034;positions.txt&#034;); background(255);
} void draw() { point(mouseX, mouseY); output.println(mouseX + &#034; &#034; + mouseY); // ici on a l&#195;&#169;g&#195;&#168;rement modifi&#195;&#169;
} void keyPressed() { output.flush(); // Writes the remaining data to the file output.close(); // Finishes the file exit(); // Stops the program
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans le setup(), j'ai ajout&#195;&#169; un frameRate(24), calibrant la vitesse du script &#195; la vitesse de 24 frames par seconde, une taille et un background &#195; l'animation. Dans le draw(), j'ai juste modifi&#195;&#169; la ligne commen&#195;&#167;ant par &#034;output&#034; pour &#195;&#169;crire en plus de la coordonn&#195;&#169;e en X de la souris, celle en Y.&lt;br class='manualbr' /&gt;Ce code produit un fichier texte d&#195;&#168;s le lancement du script, et ne s'arr&#195;&#170;te que lorsque l'on appuie sur n'importe quelle touche du clavier. Entre les deux, les coordonn&#195;&#169;es de la souris sont &#195;&#169;crite &#195; la vitesse du script, soit 24 fois par seconde.&lt;/p&gt;
&lt;p&gt;Ce script cr&#195;&#169;e un fichier du nom de &#034;positions.txt&#034; dans le dossier du sketch, et &#195;&#169;crit &#195; chaque draw() une ligne (avec un retour &#195; la ligne) contenant mouseX, un espace, et mouseY. Appuyer sur une touche termine le fichier. Cette op&#195;&#169;ration est importante : un fichier ouvert mais pas ferm&#195;&#169; ne sera pas valide. Il ne pourra pas &#195;&#170;tre ouvert plus tard.&lt;/p&gt;
&lt;p&gt;En laissant tourner ce script pendant quelques dizaines de secondes et en oubliant pas de fermer, on obtient un fichier texte tr&#195;&#168;s l&#195;&#169;ger, contenant des donn&#195;&#169;es num&#195;&#169;riques de ce type :&lt;/p&gt;
&lt;p&gt;2 350&lt;br class='manualbr' /&gt;2 350&lt;br class='manualbr' /&gt;6 345&lt;br class='manualbr' /&gt;14 339&lt;br class='manualbr' /&gt;24 334&lt;br class='manualbr' /&gt;32 331&lt;br class='manualbr' /&gt;38 328&lt;br class='manualbr' /&gt;46 326&lt;br class='manualbr' /&gt;50 323&lt;br class='manualbr' /&gt;60 317&lt;/p&gt;
&lt;p&gt;Deux chiffres s&#195;&#169;par&#195;&#169;s par un espace, les coordonn&#195;&#169;es de la souris durant l'ex&#195;&#169;cution du script.&lt;/p&gt;
&lt;p&gt;La richesse des arts num&#195;&#169;riques r&#195;&#169;side notamment dans la diversit&#195;&#169; des sources de donn&#195;&#169;es : souris, cam&#195;&#169;ra, clavier, micro, flux du net, fichier de tableur, etc.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;2) Lire le fichier texte avec loadStrings()&lt;/h2&gt;
&lt;p&gt;Nous allons maintenant cr&#195;&#169;er un autre sketch, capable de lire notre fichier positions.txt et d'utiliser ses donn&#195;&#169;es.&lt;/p&gt;
&lt;p&gt;On prendra bien soin de placer le fichier positions.txt dans le dossier du script !&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] infos;
int compteur=0; void setup(){ size(600,400); frameRate(24); infos=loadStrings(&#034;positions.txt&#034;); println(&#034;le fichier contient &#034; + infos.length + &#034; lignes&#034;); background(255);
} void draw(){ String i[] = split(infos[compteur],&#034; &#034;); int posx=int(i[0]); int posy=int(i[1]); ellipse(posx,posy,20,20); compteur++; if(compteur &gt; infos.length-1){ saveFrame(&#034;resultat.jpg&#034;); noLoop(); } } void keyPressed(){ compteur=0; background(255); loop();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_482 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH333/resultat-494ec.jpg?1758483406' width='500' height='333' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Le code charge le fichier &#034;positions.txt&#034; avec la fonction loadStrings() qui a la particularit&#195;&#169; de renvoyer un array de Strings, une liste de texte. LoadStrings() s&#195;&#169;pare le fichier texte sur base des retour &#195; la ligne, ce qui est parfait pour nous : chaque ligne contient les coordonn&#195;&#169;es de la souris enregistr&#195;&#169;e en temps r&#195;&#169;el.&lt;br class='manualbr' /&gt;Probl&#195;&#168;me : les deux coordonn&#195;&#169;es de la souris sont consid&#195;&#169;r&#195;&#169;es par Processing comme du texte (String) et pas deux donn&#195;&#169;es num&#195;&#169;rique (int). Il faut donc :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; s&#195;&#169;parer les deux informations. C'est la fonction split qui s'en charge. Elle a besoin de savoir ce qui s&#195;&#169;pare les informations dans le texte. Dans notre cas, c'est un espace, donc on sp&#195;&#169;cifie de couper la ligne en autant de morceaux que split trouve s&#195;&#169;par&#195;&#169; par des espaces (&lt;a href=&#034;http://processing.org/reference/split_.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;voir la page sur split()&lt;/a&gt;) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String i[] = split(infos[compteur],&#034; &#034;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On doit ensuite transformer ces deux informations, car elle sont actuellement consid&#195;&#169;r&#195;&#169;es par Processing comme du texte (String) et pas comme des chiffres (int). La fonction int() se charge de cette transformation.&lt;/p&gt;
&lt;p&gt;Enfin, on utilise les donn&#195;&#169;es pour &#195;&#169;crire un cercle. Lorsque toutes les lignes sont lues, le sketch se met en pause, et est relanc&#195;&#169; si on appuie sur une touche.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Nettoyer les donn&#195;&#169;es&lt;/h2&gt;
&lt;p&gt;Lors du lancement du script, j'ai mis un temps &#195; placer le curseur convenablement pour &#195;&#169;crire le mot &#034;hello&#034;. J'ai perdu du temps, et la souris a bri&#195;&#168;vement travers&#195;&#169; le bord de l'&#195;&#169;cran, laissant trois points perdus dans l'espace. Je peux nettoyer ces erreurs directement dans le fichier &#034;positions.txt&#034;. Je l'ouvre et rep&#195;&#168;re dans le d&#195;&#169;but du fichier les points perdus, ainsi que le moment d'arr&#195;&#170;t avant le d&#195;&#169;but du dessin lui-m&#195;&#170;me : la souris est en 0 0 au d&#195;&#169;but du script, puis deux coordonn&#195;&#169;es sont &#195;&#169;crites, plus la troisi&#195;&#168;me coordonn&#195;&#169;e se r&#195;&#169;p&#195;&#168;te un grand nombre de fois.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;0 0
0 0
0 0
0 0
0 0
0 0
572 45
560 29
545 13
545 13
545 13
545 13
545 13&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je supprime manuellement ces donn&#195;&#169;es parasites et le dessin d&#195;&#169;marre directement au lancement du script, tout propre.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_483 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH333/resultat-2-66ca0.jpg?1758483406' width='500' height='333' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Modifier l'interpr&#195;&#169;tation des donn&#195;&#169;es&lt;/h2&gt;
&lt;p&gt;La richesse de l'art num&#195;&#169;rique r&#195;&#169;side notamment dans la mani&#195;&#168;re dont on peut r&#195;&#169;interpr&#195;&#169;ter des donn&#195;&#169;es. On peut maintenant jouer avec les donn&#195;&#169;es contenues dans le fichier :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; lire les donn&#195;&#169;es &#195; l'envers, de la fin du fichier vers son d&#195;&#169;but
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; dessiner des lignes entre les point pour faire un dessin continu
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; dessiner en d&#195;&#169;formant l'&#195;&#169;chelle et les proportions
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; dessiner &#195; l'envers dans l'espace de l'animation
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; g&#195;&#169;n&#195;&#169;rer un son ou une couleur ou une vitesse de lecture d'une vid&#195;&#169;o
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; dessiner un parcours sur un plan g&#195;&#169;ographique
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; ...
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;/p&gt;
&lt;dl class='spip_document_484 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH333/resultat-3-570ff.jpg?1758483406' width='500' height='333' alt='JPEG - 23&#160;kio' /&gt;&lt;/dt&gt;
&lt;/dl&gt;&lt;dl class='spip_document_485 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH333/resultat-4-509a5.jpg?1758483406' width='500' height='333' alt='JPEG - 59.9&#160;kio' /&gt;&lt;/dt&gt;
&lt;/dl&gt;&lt;dl class='spip_document_486 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH200/resultat-5-505e9.jpg?1758483406' width='500' height='200' alt='JPEG - 19.4&#160;kio' /&gt;&lt;/dt&gt;
&lt;/dl&gt;&lt;dl class='spip_document_487 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH333/resultat-6-46eea.jpg?1758483406' width='500' height='333' alt='JPEG - 13.3&#160;kio' /&gt;&lt;/dt&gt;
&lt;/dl&gt;&lt;h2 class=&#034;spip&#034;&gt;Parser d'autres types de donn&#195;&#169;es&lt;/h2&gt;
&lt;p&gt;Il est &#195;&#169;videmment possible d'analyser d'autres types de donn&#195;&#169;es, comme les villes et leur localisation, ou encore la population d'un pays.&lt;br class='autobr' /&gt;
Les &lt;a href=&#034;https://github.com/jief/zipcode-belgium&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;codes postaux et g&#195;&#169;olocalisation des villes belges&lt;/a&gt;&lt;br class='autobr' /&gt;
Diff&#195;&#169;rentes &lt;a href=&#034;http://www.ibz.rrn.fgov.be/fr/population/statistiques-de-population/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;statistiques de population&lt;/a&gt; en Belgique&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>PDF : faire un livre &#195; partir de la camera</title>
		<link>https://arts-numeriques.codedrops.net/PDF-faire-un-livre-a-partir-de-la</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/PDF-faire-un-livre-a-partir-de-la</guid>
		<dc:date>2011-10-27T09:54:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;Ce script fabrique un pdf. Sur chaque page, 9 d'images captur&#195;&#169;es &#195; intervalle r&#195;&#169;gulier (une seconde). On appuie sur une touche pour lancer la cr&#195;&#169;ation du pdf, on appuie sur une touche pour la stopper &#195; la fin de la prochaine feuille. &lt;br class='autobr' /&gt; Ce script peut &#195;&#169;videmment &#195;&#170;tre am&#195;&#169;nag&#195;&#169; : le nombre d'images par page peut &#195;&#170;tre adapt&#195;&#169; l'intervalle peut &#195;&#170;tre r&#195;&#169;gl&#195;&#169; les marges peuvent &#195;&#170;tre adapt&#195;&#169;es Ces variables sont en d&#195;&#169;but de script. &lt;br class='autobr' /&gt;
Les images sont coll&#195;&#169;es les unes aux autres, mais une (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Traitement-video-" rel="directory"&gt;Traitement vid&#195;&#169;o&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Ce script fabrique un pdf. Sur chaque page, 9 d'images captur&#195;&#169;es &#195; intervalle r&#195;&#169;gulier (une seconde). On appuie sur une touche pour lancer la cr&#195;&#169;ation du pdf, on appuie sur une touche pour la stopper &#195; la fin de la prochaine feuille.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ce script peut &#195;&#169;videmment &#195;&#170;tre am&#195;&#169;nag&#195;&#169; :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le nombre d'images par page peut &#195;&#170;tre adapt&#195;&#169;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'intervalle peut &#195;&#170;tre r&#195;&#169;gl&#195;&#169;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; les marges peuvent &#195;&#170;tre adapt&#195;&#169;es&lt;br class='autobr' /&gt;
Ces variables sont en d&#195;&#169;but de script.&lt;/p&gt;
&lt;p&gt;Les images sont coll&#195;&#169;es les unes aux autres, mais une petite variable suppl&#195;&#169;mentaire devrait permettre de les s&#195;&#169;parer sur la largeur et la hauteur.&lt;/p&gt;
&lt;p&gt;Une police - Aller light - est utilis&#195;&#169;e. Elle peut &#195;&#170;tre remplac&#195;&#169;e par une autre ou t&#195;&#169;l&#195;&#169;charg&#195;&#169;e gratuitement (suivre le lien dans le script).&lt;/p&gt;
&lt;p&gt;Le code :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; import processing.pdf.*; // appuyer sur une touche pour commencer // appuyer pour stopper // le script quitte alors en fin de page // variable du script int nb_ima=3; // nombre d'images &#195; placer en largeur int marges=40; // pixels &#195; gauche, droite et haut et bas &#195; respecter int ledelai=1000; // delai entre chaque image PGraphicsPDF pdf; PFont myFont; Capture video; boolean stop=false; boolean start=false; float px, py; float largeur_ima, hauteur_ima; void setup() { size(594, 594); //String[] fontList = PFont.list(); //println(fontList); video = new Capture(this, 320, 240, 24); pdf = (PGraphicsPDF)beginRecord(PDF, &#034;video_book.pdf&#034;); // titre du pdf beginRecord(pdf); largeur_ima=(width-(2*marges))/nb_ima; hauteur_ima=(largeur_ima/4)*3; px=marges; py=marges; background(255); myFont = createFont(&#034;Aller-Light&#034;, 24); // police gratuite : http://www.fontsquirrel.com/fonts/Aller textFont(myFont, 10); fill(0); } void draw() { if (start==true) { // appuyer sur une touche pour commencer delay(ledelai); // attente entre chaque image image(video, px, py, largeur_ima, hauteur_ima); px=px+largeur_ima; if (px&gt;(width-marges)-10) { py+=hauteur_ima; px=marges; if (py &gt; (height-marges-10)) { // ajoute la date String texte = day() +&#034;/&#034;+month()+&#034;/&#034;+year()+&#034;, &#034;+hour()+&#034;:&#034;+minute()+&#034;:&#034;+second(); text(texte, marges, (height-marges)+15); // si on a demand&#195;&#169; l'arret, cloturer ici if (stop==true) { finit(); } else { pdf.nextPage(); px=marges; py=marges; background(255); } } } } } public void captureEvent(Capture c) { c.read(); } void keyReleased() { if (start==false) { start=true; } else if (stop==false) { stop=true; } } void finit() { endRecord(); exit(); // Quit }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Dessiner avec curveVertex</title>
		<link>https://arts-numeriques.codedrops.net/Dessiner-avec-curveVertex</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/Dessiner-avec-curveVertex</guid>
		<dc:date>2011-10-13T10:15:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>

		<description>
&lt;p&gt;curveVertex permet de dessiner des courbes vectorielles. Il existe d'autres m&#195;&#169;thodes en Processing pour utiliser les vecteurs, mais curveVertex est la m&#195;&#169;thode la plus simple, du moment que l'on a compris sa logique. &lt;br class='autobr' /&gt; La fonction est document&#195;&#169;e sur le site de processing, ici. Elle contient, dans les parenth&#195;&#168;ses, deux ou trois informations : les coordonn&#195;&#169;es en x,y et &#195;&#169;ventuellement z. &lt;br class='autobr' /&gt;
curveVertex(10,30) ; &lt;br class='autobr' /&gt;
Pour cr&#195;&#169;er une forme vectorielle avec curveVertex, on commencera et finira (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Formation-" rel="directory"&gt;Formation&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;curveVertex permet de dessiner des courbes vectorielles. Il existe d'autres m&#195;&#169;thodes en Processing pour utiliser les vecteurs, mais curveVertex est la m&#195;&#169;thode la plus simple, du moment que l'on a compris sa logique.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;La fonction est document&#195;&#169;e sur le site de processing, &lt;a href=&#034;http://processing.org/reference/curveVertex_.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ici&lt;/a&gt;. Elle contient, dans les parenth&#195;&#168;ses, deux ou trois informations : les coordonn&#195;&#169;es en x,y et &#195;&#169;ventuellement z.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;curveVertex(10,30);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour cr&#195;&#169;er une forme vectorielle avec curveVertex, on commencera et finira par la d&#195;&#169;claration beginShape()&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;beginShape(); // ici le dessin endShape();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attention, la majuscule sur Shape est importante.&lt;/p&gt;
&lt;p&gt;A partir de l&#195; on va d&#195;&#169;clarer une s&#195;&#169;rie de points qui vont servir de point de relai pour le dessin vectoriel. On ne doit pas, avec curveVertex, d&#195;&#169;clarer de poign&#195;&#169;e comme dans une courbe de B&#195;&#169;zier standard. Les poign&#195;&#169;es, pour rappel, sont des points qui influent sur la trajectoire du trac&#195;&#169;. Chaque trait poss&#195;&#168;de une poign&#195;&#169;e &#195; son point de d&#195;&#169;part et d'arriv&#195;&#169;e.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_464 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L237xH285/2701162118_74a6b5d751-ba4b9.jpg?1726877224' width='237' height='285' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CurveVertex g&#195;&#168;re lui-m&#195;&#170;me les poign&#195;&#169;es, sauf la premi&#195;&#168;re et la derni&#195;&#168;re du trac&#195;&#169;. C'est important a retenir : la premi&#195;&#168;re et la derni&#195;&#168;re commande curveVertex() d'un trac&#195;&#169; sont des poign&#195;&#169;es et pas des points du dessin. En cons&#195;&#169;quence, un simple trait sera d&#195;&#169;fini par 4 commandes : &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la premi&#195;&#168;re contient les coordonn&#195;&#169;es x et y de la poign&#195;&#169;e de d&#195;&#169;part
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la deuxi&#195;&#168;me contient les coordonn&#195;&#169;es x et y du premier point
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la troisi&#195;&#168;me contient les coordonn&#195;&#169;es x et y du deuxi&#195;&#168;me point
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la quatri&#195;&#168;me contient les coordonn&#195;&#169;es x et y de la poign&#195;&#169;e de fin de trac&#195;&#169;.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_465 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L369xH218/simple_curvevertex-04760.png?1726877224' width='369' height='218' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Ces quatre commandes dessinent dont une ligne droite, car les poign&#195;&#169;es ont les m&#195;&#170;mes coordonn&#195;&#169;es que les deux points du dessin. Si nous modifions les coordonn&#195;&#169;es des deux poign&#195;&#169;es, nous allons dessiner une ligne unique compos&#195;&#169;e de deux points, mais cette fois ce sera un arc.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_466 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L352xH185/poignee_curvevertex-bce49.png?1726877225' width='352' height='185' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Tous les points ajout&#195;&#169;s dans le trac&#195;&#169; avec curveVertex() cr&#195;&#169;eront des points suppl&#195;&#169;mentaires, avec des poign&#195;&#169;es &#034;automatiques&#034; guidant les courbes, ce qui suffit la plupart du temps.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_467 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L423xH191/vertex3-566b4.png?1726877225' width='423' height='191' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Fermer une forme&lt;/h2&gt;
&lt;p&gt;Si on veut fermer une forme de mani&#195;&#168;re fluide, il faudra jouer avec les poign&#195;&#169;es de mani&#195;&#168;re r&#195;&#169;fl&#195;&#169;chie.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_468 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L426xH193/forme-a8c22.png?1726877225' width='426' height='193' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Le premier et le dernier point sont identiques, on aura donc 5 points pour une forme dessin&#195;&#169;e en 4 points comme ce losange arrondi.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la premi&#195;&#168;re poign&#195;&#169;e a les m&#195;&#170;mes coordonn&#195;&#169;es que l'avant dernier point.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la derni&#195;&#168;re poign&#195;&#169;e a les m&#195;&#170;mes coordonn&#195;&#169;es que le deuxi&#195;&#168;me point.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_469 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L382xH316/forme2-d4f74.jpg?1726877225' width='382' height='316' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>PDF : 40 pages avec des lignes al&#195;&#169;atoires</title>
		<link>https://arts-numeriques.codedrops.net/PDF-40-pages-avec-des-lignes</link>
		<guid isPermaLink="true">https://arts-numeriques.codedrops.net/PDF-40-pages-avec-des-lignes</guid>
		<dc:date>2010-10-23T22:37:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>


		<dc:subject>Processing</dc:subject>
		<dc:subject>Big book</dc:subject>

		<description>
&lt;p&gt;Un script complet pour g&#195;&#169;n&#195;&#169;rer un livre de 40 pages avec couverture avant et arri&#195;&#168;re. Le script lui-m&#195;&#170;me g&#195;&#169;n&#195;&#168;re des lignes avec un d&#195;&#169;placement al&#195;&#169;atoire. D&#195;&#168;s que la ligne touche le bord de la zone d&#195;&#169;finie pour le dessin, une nouvelle page est cr&#195;&#169;&#195;&#169;e et un nouveau dessin d&#195;&#169;marre. Une fois les 40 pages cr&#195;&#169;&#195;&#169;e, le script s'arr&#195;&#170;te. &lt;br class='autobr' /&gt; Le code a des variables param&#195;&#169;trables en t&#195;&#170;te du script, pour d&#195;&#169;terminer l'amplitude des lignes, le nombre de pages, les marges du dessin, (&#8230;)&lt;/p&gt;


-
&lt;a href="https://arts-numeriques.codedrops.net/-Exemples-" rel="directory"&gt;int&#195;&#169;raction et calcul&lt;/a&gt;

/ 
&lt;a href="https://arts-numeriques.codedrops.net/+-Processing-+" rel="tag"&gt;Processing&lt;/a&gt;, 
&lt;a href="https://arts-numeriques.codedrops.net/+-Big-book,62-+" rel="tag"&gt;Big book&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Un script complet pour g&#195;&#169;n&#195;&#169;rer un livre de 40 pages avec couverture avant et arri&#195;&#168;re. Le script lui-m&#195;&#170;me g&#195;&#169;n&#195;&#168;re des lignes avec un d&#195;&#169;placement al&#195;&#169;atoire. D&#195;&#168;s que la ligne touche le bord de la zone d&#195;&#169;finie pour le dessin, une nouvelle page est cr&#195;&#169;&#195;&#169;e et un nouveau dessin d&#195;&#169;marre. Une fois les 40 pages cr&#195;&#169;&#195;&#169;e, le script s'arr&#195;&#170;te.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Le code a des variables param&#195;&#169;trables en t&#195;&#170;te du script, pour d&#195;&#169;terminer l'amplitude des lignes, le nombre de pages, les marges du dessin, l'auteur du livre...&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_389 spip_documents spip_documents_center'&gt;&lt;img src='https://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH548/randomlinesbook-12-9cf36.jpg?1757775066' width='500' height='548' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Chaque dessin est accompagn&#195;&#169; d'une num&#195;&#169;rotation de page, du d&#195;&#169;compte du nombre de lignes et du temps d'ex&#195;&#169;cution du dessin.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;//
// Livre aleatoire - octobre 2010
//
import processing.pdf.*;
PGraphicsPDF pdf; PFont myFont; // parametres du dessin, changer pour affiner
int nbpages=40; // nombre de pages
int marge=100; // marges &#195; respecter
int deplacement=8; // d&#195;&#169;placement maximum entre deux iterations
String auteur=&#034;St&#195;&#169;phane Noel&#034;; // variable du script
float posx,posy,p_posx,p_posy;
int compteur=1;
int nbsquare=0;
int startmillis=0; void setup() { size(594, 594); //String[] fontList = PFont.list(); //println(fontList); myFont = createFont(&#034;Aller-Light&#034;, 24); // police gratuite : http://www.fontsquirrel.com/fonts/Aller textFont(myFont,24); pdf = (PGraphicsPDF)beginRecord(PDF, &#034;randomlinesbook.pdf&#034;); // titre du pdf beginRecord(pdf); background(255); positionnebloc(); // nouvelle position de d&#195;&#169;part du dessin commencelivre(); // appelle la fonction qui cree la couverture fill(255); stroke(10); numerotation();
} void draw() { fill(255); line(posx,posy,p_posx,p_posy); p_posx=posx; p_posy=posy; nbsquare++; posx+=random(-deplacement,deplacement); posy+=random(-deplacement,deplacement); if(posx &gt; width-marge || posx &lt; marge || posy &gt; height-marge || posy &lt; marge) { // si la ligne sort de la zone fill(0); affichenbsquare(); afficher le nombre de lignes et le temps d'execution compteur++; fill(255); pdf.nextPage(); if(compteur &lt; nbpages) { background(255); positionnebloc(); // nouvelle position de d&#195;&#169;part du dessin nbsquare=0; numerotation(); } else { // si le nombre de page est atteint finitlivre(); // genere la couverture arriere endRecord(); exit(); // Quitte } }
} void positionnebloc() { p_posx=posx=random(width*0.45,width*0.55); p_posy=posy=random(height*0.45,width*0.55);
} void numerotation() { float ty=height-(marge/2); textFont(myFont,8); fill(0); textAlign(LEFT); text(&#034;Page &#034; + compteur,marge,ty);
} void affichenbsquare() { // calcule le temps de r&#195;&#169;alisation int duree=millis()-startmillis; float ty=height-(marge/2); textFont(myFont,8); fill(0); textAlign(RIGHT); text(duree/1000+ &#034; secondes, &#034; + nbsquare + &#034; formes&#034;,width-marge,ty); startmillis=millis();
} void commencelivre() { // cree la couverture fill(0); textAlign(CENTER); textFont(myFont,30); text(&#034;The random line book&#034;,width/2,(height/2)-30); textFont(myFont,18); text(auteur,width/2,(height/2)+30); pdf.nextPage(); pdf.nextPage(); background(255);
} void finitlivre() { pdf.nextPage(); // une page blanche fill(0); // cree une page avec la date de cr&#195;&#169;ation textAlign(LEFT); String texte=&#034;\nCe livre a &#195;&#169;t&#195;&#169; enti&#195;&#168;rement g&#195;&#169;n&#195;&#169;r&#195;&#169; par un script.\n\nChacun de ses dessins part de la zone centrale de la page, et est compos&#195;&#169; de traits d'une longueur de &#034; + (deplacement*25.1)/72 +&#034; millim&#195;&#168;tres maximum dans n'importe quelle direction, &#195; partir du trait pr&#195;&#169;c&#195;&#169;dent.&#034; +&#034; Chaque dessin s'arrete lorsque le bord de la zone de dessin est touch&#195;&#169;.\n\n&#034; +&#034;Ce livre est compos&#195;&#169; de &#034;+ nbpages +&#034; pages. Il a &#195;&#169;t&#195;&#169; g&#195;&#169;n&#195;&#169;r&#195;&#169; le &#034;+day() +&#034;/&#034;+month()+&#034;/&#034;+year()+&#034; &#195; &#034;+hour()+&#034;:&#034;+minute()+&#034;.&#034;; textFont(myFont,12); text(texte,marge,marge+12,width-(marge*2),height-(marge*2)); textFont(myFont,10); text(auteur,marge,height-(marge+12));
} void keyPressed() { // pour interrompre n'importe quand (garde-fou) affichenbsquare(); pdf.nextPage(); pdf.nextPage(); finitlivre(); endRecord(); exit(); // Quit
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://arts-numeriques.codedrops.net/IMG/pdf/randomlinesbook.pdf" length="406287" type="application/pdf" />
		
		<enclosure url="https://arts-numeriques.codedrops.net/IMG/zip/livre_random_line.zip" length="396453" type="application/zip" />
		

	</item>



</channel>

</rss>
