<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GrgrDvrt &#187; couleur</title>
	<atom:link href="http://grgrdvrt.com/blog/tag/couleur/feed/" rel="self" type="application/rss+xml" />
	<link>http://grgrdvrt.com/blog</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Tue, 10 Jan 2012 09:04:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Pixels + blur + paletteMap + colors</title>
		<link>http://grgrdvrt.com/blog/446/pixels-blur-palettemap-colors/</link>
		<comments>http://grgrdvrt.com/blog/446/pixels-blur-palettemap-colors/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 18:24:06 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[filtre]]></category>
		<category><![CDATA[paletteMap]]></category>
		<category><![CDATA[particules]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=446</guid>
		<description><![CDATA[start with something simple, change the code, get something unexpected, change the code, get something unexpected, change the code, get something unexpected...]]></description>
			<content:encoded><![CDATA[<p>Pixels:</p>


    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="785" height="625">
      <param name="movie" value="/storage/experiment_player.swf" />
      <param name="flashvars" value="file=/storage/446/pixels" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/experiment_player.swf" width="785" height="625" flashvars="file=/storage/446/pixels">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>

<p>Pixels + blur :</p>


    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_1" width="785" height="625">
      <param name="movie" value="/storage/experiment_player.swf" />
      <param name="flashvars" value="file=/storage/446/blur" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/experiment_player.swf" width="785" height="625" flashvars="file=/storage/446/blur">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>

<p>Pixels + blur + paletteMap :</p>


    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_2" width="785" height="625">
      <param name="movie" value="/storage/experiment_player.swf" />
      <param name="flashvars" value="file=/storage/446/palette" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/experiment_player.swf" width="785" height="625" flashvars="file=/storage/446/palette">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>
<p><img src="/storage/446/palette2.jpg"><img style="margin-right:0px;" src="/storage/446/palette3.jpg"></p>

<p>Pixels + blur + paletteMap + colors :</p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_3" width="785" height="625">
      <param name="movie" value="/storage/experiment_player.swf" />
      <param name="flashvars" value="file=/storage/446/colors" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/experiment_player.swf" width="785" height="625" flashvars="file=/storage/446/colors">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>
<p><img src="/storage/446/colors2.jpg"><img style="margin-right:0px;" src="/storage/446/colors3.jpg"></p>
<p><a href="/storage/446/Colors.as">sources</a></p><br/>
<p>Each step adds its own parameters which influence the final result, especially the blur radius and the paletteMap.<br/><br/>

 I haven&#8217;t used tools like <a href="http://blog.soulwire.co.uk/code/actionscript-3/simple-flash-prototype-gui-tool">Soulwire&#8217;s simple flash GUI tool</a> and it&#8217;s a mistake, I spent too much time to changing the code and compiling the swf just to set new parameters values.<br/><br/>

In the last experiment the color schemes are generated. I will probably write a post about that because it&#8217;s a subject I like a lot.<br/>
There are other experiments using paletteMap that I will show in another post because it&#8217;s really an interesting function.</p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/446/pixels-blur-palettemap-colors/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Des lignes</title>
		<link>http://grgrdvrt.com/blog/439/des-lignes/</link>
		<comments>http://grgrdvrt.com/blog/439/des-lignes/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 20:56:19 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[lignes]]></category>
		<category><![CDATA[mouvement]]></category>
		<category><![CDATA[particules]]></category>
		<category><![CDATA[perlin noise]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=439</guid>
		<description><![CDATA[Des fois le midi je mange vite alors il me reste un peu de temps pour faire des trucs avec des particules.]]></description>
			<content:encoded><![CDATA[
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_4" width="789" height="625">
      <param name="movie" value="/storage/439/curly.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/439/curly.swf" width="789" height="625">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<a href="/storage/439/sources.zip">sources</a>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/439/des-lignes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Perlinoisation</title>
		<link>http://grgrdvrt.com/blog/422/perlinoisation/</link>
		<comments>http://grgrdvrt.com/blog/422/perlinoisation/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 23:42:01 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[particules]]></category>
		<category><![CDATA[perlin noise]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=422</guid>
		<description><![CDATA[Le perlin noise c'est génial, ça marche à tous les coups.]]></description>
			<content:encoded><![CDATA[<p>Il y a un peu plus d&#8217;un an <a href="http://www.neuroproductions.be/">Neuroprod</a> faisait <a href="http://www.neuroproductions.be/experiments/image-vectors-convolutionfilter-fun/">des trucs avec des images</a>. Et ça m&#8217;a donné envie de jouer.<br/>
Sauf que les histoires de direction de l&#8217;image je m&#8217;en foutait un peu alors j&#8217;ai utilisé un bitmapData plein de perlin noise comme map pour orienter mes lignes.<p/>
<p>En lançant l&#8217;exemple ci-dessous, tu pourras admirer le résultat de tout ça et découvrir au passage qui sont nos invités mystères!!</p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_5" width="789" height="625">
      <param name="movie" value="/storage/422/perlinoisation/perlinoisation.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/422/perlinoisation/perlinoisation.swf" width="789" height="625">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>

<p>Si tu as juste lancé l&#8217;animation tu as dû d&#8217;abord paniquer à la vue de nos amis et ensuite tu as vu un effet sympa.<br/>
Si tu la stoppe et que tu la relance tu vas activer un second mode bien plus intéressant dans lequel l&#8217;image se dégrade au cours du temps.<br/>
L&#8217;idée c&#8217;est que dans le premier mode ce sont les couleurs la photo originale qui sont utilisées tandis que dans le second mode c&#8217;est l&#8217;image transformée (telle qu&#8217;on la voit) qui sert de source.<p><br/>

<p>Voici une séquence obtenue avec une image un peu plus verte.<br/>
Au début les deux modes donnent à peu près la même chose : </p>
<img src="/storage/422/1a.jpg"><br/>
<p>Après une dizaine de minutes c&#8217;est de la bouillie : </p>
<img src="/storage/422/1b.jpg"><br/>
<p>À la fin l&#8217;image se divise en aplats relativement stables : </p>
<img src="/storage/422/1c.jpg"><br/><br/>
<p>Et sinon en noir et blanc ça fait des choses amusantes aussi : </p>
<p><img src="/storage/422/2a.jpg"><img style="margin-right:0px;" src="/storage/422/2c.jpg"></p>
<img src="/storage/422/2b.jpg"><br/>
<p>Si tu veux les sources, <a href="/storage/422/perlinoisation.rar">les voilà</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/422/perlinoisation/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Median Cut</title>
		<link>http://grgrdvrt.com/blog/332/median-cut/</link>
		<comments>http://grgrdvrt.com/blog/332/median-cut/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 16:45:31 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[filtre]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=332</guid>
		<description><![CDATA[Le median cut filter est un filtre qui me paraissait super intéressant. Et puis en fait non. Enfin si, mais pas comme je l'aurai imaginé au début.]]></description>
			<content:encoded><![CDATA[<p>Au début de l&#8217;histoire, le truc qui m&#8217;a fait rêver c&#8217;est l&#8217;outil <a href="http://www.inthemod.com/inthemod.html">in the mod</a> de <a href="http://blog.drwoohoo.com/">Dr Woohoo</a> qui permet de récupérer une palette de couleurs à partir d&#8217;une image.<br/>
Alors moi tout naïf je me dis &#8220;ouai c&#8217;est facile, c&#8217;est tout comme réduire le nombre de couleurs de l&#8217;image&#8221; et je repense à nicoptère qui a fait <a href="http://en.nicoptere.net/?p=8">un truc qui y ressemble.</a><br/>
Sauf qu&#8217;en fait ce que je veux (va savoir pourquoi) c&#8217;est récupérer un nombre précis de couleurs. Alors j&#8217;en parle avec Nicoptère et là il me dit &#8220;ah mais ça a rien à voir (pov&#8217; nul), toi c&#8217;est une posterisation que tu veux faire! &#8220;. Ce à quoi google me répond &#8220;la posterisation <a href="http://www.adobe.com/designcenter/photoshop/articles/phs8posteriz.html">c&#8217;est ça</a>&#8220;. Ah bein oui, c&#8217;est un beau chien, mais là c&#8217;est le contraire de ce que je veux.<br/>
C&#8217;est quand même un bon début parcequ&#8217;en fouinant dans cette direction je découvre le <a href="http://web.cs.wpi.edu/~matt/courses/cs563/talks/color_quant/CQmediancut.html">median cut filter</a> et même comment <a href="http://www.leptonica.com/papers/mediancut.pdf">améliorer l&#8217;algorithme</a>. Bien sûr tout celà n&#8217;est pas à confondre avec avec l&#8217;autrement plus compliqué <a href="http://en.nicoptere.net/?p=444">mean shift filter</a>.<br/>
Bon, trop bien! Cette fois c&#8217;est le bon.</p><br/><br/>

<p>Là je fais une pause dans l&#8217;histoire, juste pour dire que si tu veux obtenir des belles couleurs d&#8217;une belle image, tu peux tout de suite aller chez soulwire voir ces articles:
<a href="http://blog.soulwire.co.uk/flash/actionscript-3/extract-average-colours-from-bitmapdata">couleurs moyennes</a> et <a href="http://blog.soulwire.co.uk/flash/actionscript-3/colourutils-bitmapdata-extract-colour-palette">extraire une palette de couleurs</a>, c&#8217;est plus simple et ça marche mieux.<br/>
Par contre tu vas rater la partie intéressante de l&#8217;histoire.</p><br/><br/>

<p>Pour en revenir au median cut filter, si tu te disais &#8220;Chouette, un filtre! on va sortir PixelBender&#8221; tu te trompes, ça marchera pas. C&#8217;est pas comme le BlurFilter ou ColorMatrixFilter, qui traitent chaque pixel pour les redéfinir en fonction de leurs voisins ou de paramètres quelconques. Là c&#8217;est l&#8217;espace colorimétrique de l&#8217;image qu&#8217;on va tripoter.</p><br/><br/>
<p><img src="/storage/332/color_space.jpg"/>L&#8217;espace colorimétrique c&#8217;est ce que tu vois juste à côté, un cube dans lequel chaque point est une couleur déterminée par sa position sur les axes R, G, B.</p><br/>
<p><img src="/storage/332/vlaminck.jpg"/>Maurice de Vlaminck a peint Les arbres rouges en 1906. C&#8217;est une huile sur toile de 65 x 81 cm et tu peux le voir au 5ème étage du Centre Pompidou.<br/>
Là (hérésie!) je l&#8217;ai recadré pour qu&#8217;il rentre dans la grille de l&#8217;article.</p>
<p><img src="/storage/332/vlaminck_color_space.jpg"/>Ici c&#8217;est toujours le Vlaminck mais représenté dans l&#8217;espace colorimétrique. Cette fois il n&#8217;est pas recadré. Si tu veux, <a href="/storage/332/color_space.rar">voilà les sources</a> pour que tu puisse faire la même chose avec tes images. Les résultats sont très différents selon les images, c&#8217;est assez intréssant</p>

<p><img src="/storage/332/one_box.jpg"/>On commence par mettre le tableau dans une boite. En vrai une boite ce sera juste une liste de pixels.</p>
<p><img src="/storage/332/two_boxes.jpg"/>Ensuite on regarde quel est le côté le plus long. Pour ça il suffit de prendre les valeurs extrèmes de rouge, vert et bleu dans la liste de pixels. On va alors trier la liste selon leur valeur de rouge si par exemple c&#8217;est dans le vert qu&#8217;on a le plus d&#8217;amplitude. Il n&#8217;y a plus qu&#8217;à diviser notre liste en deux parts égales de façon à obtenir deux boites contenant le même nombre de pixels.</p>
<p>On recommence la dernière étape avec la boite qui a le plus long côté jusqu&#8217;à avoir autant de boites qu&#8217;on veut de couleurs. On obtient la palette en récupérant la couleur moyenne de chaque boite. Après pour reconstituer l&#8217;image il faudrait faire une posterisation. Moi je me contente d&#8217;attribuer aux pixels la couleur de la boite où ils sont, ça revient presque au même.</p><br/><br/>

<p>Voilà <a href="/storage/332/median_cut_filter.rar">les sources du truc</a>.<br/>
Et voilà des images reconstituées avec 2, 4, 8 et 32 couleurs et les palettes correspondantes</p>
<p><img src="/storage/332/vlaminck_2.jpg"><img style="margin-right:0px;" src="/storage/332/vlaminck_4.jpg"><img src="/storage/332/vlaminck_8.jpg"><img style="margin-right:0px;" src="/storage/332/vlaminck_32.jpg"></p>
<p>Le fauvisme prend un sérieux coup.<br/>
À moins de 20 couleurs les palettes sont loin de ce qu&#8217;on pourrait attendre.</p>

<p>Tu es déçu et je te comprends. En lot de consolation, voilà un bonus cool sur le tri des tableaux</p>
<p>On a vu que l&#8217;algorithme nécessite que les pixels d&#8217;une boite soient triés lors de la division de celle-ci.<br/>
Trier un Vector c&#8217;est simple avec la methode sort(). Ça prend en paramètre une fonction de notre choix c qui est top pour trier des éléments comme on veux. L&#8217;inconvénient c&#8217;est que c&#8217;est lent. Trop lent pour trier tous les pixels d&#8217;une image.</p><br/><br/>

Voilà le test de base avec un Vector.<int>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">//nombre de valeurs à trier</span>
<span style="color: #000000; font-weight: bold;">var</span> n:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">20000</span>;
<span style="color: #808080; font-style: italic;">//Vector contenant les valeurs à trier</span>
<span style="color: #000000; font-weight: bold;">var</span> values:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>n, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//valeur maximale contenue dans le Vector (minimum 0)</span>
<span style="color: #000000; font-weight: bold;">var</span> valMax:<span style="color: #0066CC;">int</span> = 0xFF;
<span style="color: #808080; font-style: italic;">//remplissage du Vector avec des valeurs aléatoires</span>
<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">0</span>; i<span style="color: #66cc66;">&lt;</span> n; i++<span style="color: #66cc66;">&#41;</span>values<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> valMax;
<span style="color: #000000; font-weight: bold;">var</span> t:<span style="color: #0066CC;">int</span> = <span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//tri</span>
values.<span style="color: #0066CC;">sort</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>v1:<span style="color: #0066CC;">int</span>, v2:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> v1 - v2;<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> - t<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>



<p>chez moi j&#8217;ai :<br/> 
72 ms pour 10 000 éléments<br/>
3 900 ms pour 100 000 éléments<br/>
14 500 ms pour 200 000 éléments<br/>
après on dépasse les 15 secondes et ça plante.<br/>
Dommage, une image de 500&#215;500 ça fait déjà 250 000 pixels.</p><br/><br/>

<p>Heureusement les algorithmes de tri sont très nombreux et le <a href="http://en.wikipedia.org/wiki/Counting_sort">counting sort</a> m&#8217;a paru sympa.<br/>
Si on reprend le test de tout à l&#8217;heure</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> countingSort<span style="color: #66cc66;">&#40;</span>a:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span>, k:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span>:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> n:<span style="color: #0066CC;">int</span> = a.<span style="color: #0066CC;">length</span>;
	<span style="color: #000000; font-weight: bold;">var</span> b:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>n, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> c:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>k, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">0</span>; i<span style="color: #66cc66;">&lt;</span> n; i++<span style="color: #66cc66;">&#41;</span>c<span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span> = c<span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span> + <span style="color: #cc66cc;">1</span>;
	<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>i = <span style="color: #cc66cc;">1</span>; i <span style="color: #66cc66;">&lt;</span> k; i++<span style="color: #66cc66;">&#41;</span>c<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> = c<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> + c<span style="color: #66cc66;">&#91;</span>i - <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>i = n - <span style="color: #cc66cc;">1</span>; i <span style="color: #66cc66;">&gt;</span>= <span style="color: #cc66cc;">0</span>; i--<span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#123;</span>
		b<span style="color: #66cc66;">&#91;</span>c<span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> = a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>;
		c<span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span> = c<span style="color: #66cc66;">&#91;</span>a<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span> - <span style="color: #cc66cc;">1</span>;
	<span style="color: #66cc66;">&#125;</span>
	<span style="color: #b1b100;">return</span> b;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> n:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">100000</span>;
<span style="color: #000000; font-weight: bold;">var</span> values:Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>int<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>n, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> valMax:<span style="color: #0066CC;">int</span> = 0xFF;
<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">0</span>; i<span style="color: #66cc66;">&lt;</span> n; i++<span style="color: #66cc66;">&#41;</span> values<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> valMax;
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> t:<span style="color: #0066CC;">int</span> = <span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
values = countingSort<span style="color: #66cc66;">&#40;</span>values, valMax + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> - t<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>



<p>2ms pour 10 000 éléments<br/>
17ms pour 100 000 éléments<br/>
1600ms pour 10 000 000 éléments<br/>
Bon, en gros pour 50 fois plus d&#8217;éléments ça met à peu près 10 fois moins de temps. Pas mal non?</p><br/><br/>

<p>Bien sûr comme tu ne crois pas à la magie, tu sais qu&#8217;il y a des inconvénients.<br/>
En fait là ça marche bien parceque les valeurs à trier sont des entiers compris entre 0 et 255<br/>
Avec des nombre décimaux ça ne marcherai pas. Et avec des nombres négatifs il faudrait adapter un peu.<br/>
Avec des valeurs issues d&#8217;un large interval c&#8217;est la mémoire qui prendrait un coup.<br/>
Et puis il faut réécrire la fonction pour chaque type de Vector<br/>
<a href="http://en.wikipedia.org/wiki/Quicksort">Le quickSort</a> est plus pratique pour ces cas là, mais peut-être un peu moins rapide dans le cas des canaux rgb.
</p><br/><br/>
<p>La leçon c&#8217;est que le median cut filter ça sert peut-être à rien mais au moins maintenant je sais mieux trier mes objets</p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/332/median-cut/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>25 lignes, Février</title>
		<link>http://grgrdvrt.com/blog/308/25-lignes-fevrier/</link>
		<comments>http://grgrdvrt.com/blog/308/25-lignes-fevrier/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 14:53:07 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[filtre]]></category>
		<category><![CDATA[lignes]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=308</guid>
		<description><![CDATA[Ce que j'ai fait pour la troisième (et dernière) édition du concours <a href="http://www.25lines.com">25lines</a> n'est, pour une fois, pas interactif.
Par contre ça fait des jolies images.]]></description>
			<content:encoded><![CDATA[<p>À l&#8217;origine il y a une expérimentation qu&#8217; n&#8217;a rien à voir avec le concours.<br/>
Il s&#8217;agit simplement d&#8217;un tas de lignes qui suivent la souris, dessinés avec avec le blendMode Subtract et avec un ColorMatrixFilter par dessus tout ça.<br/>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_6" width="785" height="369">
      <param name="movie" value="/storage/308/boum.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/308/boum.swf" width="785" height="369">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/>
Voici <a href="/storage/308/boum.fla">le fla</a> (code en timeline, à l&#8217;ancienne) pour ceux que ça intéresse.</p><br/>
<p>Pour le concours j&#8217;ai appliqué ce principe avec un point qui suit une cycloïde au lieu de la souris pour guider les lignes.<br/><br/>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_7" width="785" height="625">
      <param name="movie" value="/storage/308/25lines3.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/308/25lines3.swf" width="785" height="625">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br/><br/>
Cette édition du concours n&#8217;a pas motivé les foules et du coup tous les participants <a href="http://www.25lines.com/?page_id=231">étaient finalistes</a>. Forcément tout n&#8217;est pas fantastique. À noter quand même le 09 où les cartes sont entièrement dessinées avec des champs de textes (!?).</p><br/>
<p>Voilà une sélection d&#8217;images générées de cette façon:</p>
<img src="/storage/308/img1.jpg"><br/>
<img src="/storage/308/img2.jpg"><br/>
<img src="/storage/308/img3.jpg"><br/>
<p><img src="/storage/308/img4.jpg"><img style="margin-right:0px;" src="/storage/308/img5.jpg"><img src="/storage/308/img6.jpg"><img style="margin-right:0px;" src="/storage/308/img7.jpg"></p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/308/25-lignes-fevrier/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>25 lignes, Janvier</title>
		<link>http://grgrdvrt.com/blog/279/25-lignes-janvier/</link>
		<comments>http://grgrdvrt.com/blog/279/25-lignes-janvier/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 17:12:31 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[lignes]]></category>
		<category><![CDATA[mouvement]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/blog/?p=279</guid>
		<description><![CDATA[Pour la deuxième édition du concours <a href="http://www.25lines.com">25lines</a> j'ai encore fait des lignes qui bougent.<br/>
Mais cette fois elles écrivent.]]></description>
			<content:encoded><![CDATA[<p>Et voilà le résultat:<br/>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_8" width="785" height="561">
      <param name="movie" value="/storage/279/25lines2.swf" />
      <param name="flashvars" value="test=ok" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/279/25lines2.swf" width="785" height="561" flashvars="test=ok">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p><br/>
<p>À la base je voulais stocker les tracés sur un minimum d&#8217;espace alors j&#8217;ai pensé au <a href="http://www.bytearray.org/?p=91">mouse gesture de bytearray</a> où les caractères sont représentés par une suite de directions. Finalement j&#8217;ai pensé que ce serait trop compliqué de les redessiner à partir de ça en 25 lignes donc finalement j&#8217;ai opté pour des classiques paires de coordonnées.<br/>
<img src="/storage/279/25lines1.jpg"/><img style="margin-right:0px;" src="/storage/279/25lines2.jpg"/></p>
<p>Et voilà <a href="http://www.25lines.com/?page_id=186">les finalistes</a> de cette édition. Le 8 était très fou mais finalement c&#8217;est le 30 qui a gagné :/<p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/279/25-lignes-janvier/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>qsdqsd</title>
		<link>http://grgrdvrt.com/blog/46/qsdqsd/</link>
		<comments>http://grgrdvrt.com/blog/46/qsdqsd/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 00:19:00 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[perlin noise]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/wordpress/?p=45</guid>
		<description><![CDATA[Perlin + lignes.]]></description>
			<content:encoded><![CDATA[
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_9" width="785" height="561">
      <param name="movie" value="/miam/starmonkey010.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/miam/starmonkey010.swf" width="785" height="561">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
 ]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/46/qsdqsd/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>qsdqsd</title>
		<link>http://grgrdvrt.com/blog/45/20080709qsdqsd2/</link>
		<comments>http://grgrdvrt.com/blog/45/20080709qsdqsd2/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 22:54:00 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[lignes]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/wordpress/?p=40</guid>
		<description><![CDATA[C'était pas vraiment ça que je voulais faire, mais finalement, je le garde.]]></description>
			<content:encoded><![CDATA[
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_10" width="785" height="561">
      <param name="movie" value="/miam/starmonkey006.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/miam/starmonkey006.swf" width="785" height="561">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<p>Cette expérimentation est le résultat d&#8217;un ratage complet que j&#8217;ai pas pris le temps de rattraper. Je voulais faire quelque chose de tentaculaire, avec une histoire de branches qui s&#8217;influenceraient les unes entre les autres. Donc j&#8217;ai fait une branche qui se divise en branche qui se divise etc&#8230; Et là je me suis rendu compte que ce n&#8217;était pas du tout l&#8217;idée que j&#8217;avais en tête. <br />
 J&#8217;ai quand même continué un peu sur ce que j&#8217;avais, histoire de voir le comportement si les extrémités de sous-branches directement issues d&#8217;une même branche se repoussaient, si je mettais un peu de couleur&#8230; C&#8217;est amusant de constater que si chaque branche produit juste une sous branche en plus ou si les dernières branches se divisent encore une fois le nombre total de branches devient tel que l&#8217;animation ne peut plus tourner.<br /><br />
 Finalement j&#8217;ai gardé cette animation parce que la trace laissée par cette structure est plutôt chouette <img src='http://grgrdvrt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/45/20080709qsdqsd2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qsdqsd</title>
		<link>http://grgrdvrt.com/blog/42/20080709qsdqsd/</link>
		<comments>http://grgrdvrt.com/blog/42/20080709qsdqsd/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 22:31:00 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[filtre]]></category>
		<category><![CDATA[mouvement]]></category>
		<category><![CDATA[particules]]></category>
		<category><![CDATA[perlin noise]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/wordpress/?p=42</guid>
		<description><![CDATA[Bouger des particules d'après un perlinNoise, c'est fou!]]></description>
			<content:encoded><![CDATA[
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_11" width="785" height="561">
      <param name="movie" value="/miam/starmonkey005.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/miam/starmonkey005.swf" width="785" height="561">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<p>À la base le mec intelligent c&#8217;est Nicoptère, avec le principe de <a href="http://www.nicoptere.net/blog/index.php/2008/06/01/39-shwoof" hreflang="fr">son effet swoosh</a> qui déplace des particules selon un perlinNoise.</p> <h4>Recette de cuisine:</h4> <br />
 <ul> <li>je pars d&#8217;une image en noir et blanc, là c&#8217;est un gros qsd créé par <a href="http://qudjesraigrdjvoudraietremaitredumonde.blogspot.com/" hreflang="fr">tantoitai</a> (notez la finesse du skin de son blog)</li> <br />
 <li>Je crée un bitmapData rempli de perlinNoise. Là je me casse pas trop la tête, je reprends celui de la doc de flash.</li> <br />
 <li>je parcours chaque pixel de l&#8217;image pour récupérer les position de chaque pixel noir. Pour ça je passe par un byteArray en espérant que c&#8217;est mieux que getPixel (j&#8217;ai jamais testé la différence).</li> <br />
 <li>Je crée un objet ayant d&#8217;une part des propriétés x et y basés sur les pixels de l&#8217;image et d&#8217;autre part une vitesse horizontale, une vitesse verticale et une couleur dont les valeurs sont respectivement déterminées par les couches r, v et b du perlinNoise.</li> <br />
 <li>Pour le mouvement j&#8217;additionne simplement les vitesse horizontales et verticales au positions x et y pour chaque objet. Cette vitesse est préalablement multiplié par une sinusoïdale dépendant du temps(formule littéraire pour Math.sin(t++) ), ce qui fait que l&#8217;image de base se déforme puis se reforme</li> <br />
 <li>Le rendu est obtenu en faisant un setPixel pour chacun de ces objets sur un bitmapData. Je n&#8217;efface jamais l&#8217;image, j&#8217;applique juste des filtres BlurFilter et ColorMatrix filter qui effacent progressivement en laissant une trainée (faut aller doucement là dessus, ça vire vite à la visualisation windows Mediaplayer)</li> </ul> <p>Bon forcément plus le bitmapData d&#8217;affichage est grand et plus y&#8217;a de particules moins c&#8217;est fluide. Donc voilà, vous avez tout les éléments pour faire un truc inutile mais tellement cool!</p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/42/20080709qsdqsd/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Coup de brosse</title>
		<link>http://grgrdvrt.com/blog/33/20071007coup-de-brosse/</link>
		<comments>http://grgrdvrt.com/blog/33/20071007coup-de-brosse/#comments</comments>
		<pubDate>Sun, 07 Oct 2007 20:49:00 +0000</pubDate>
		<dc:creator>Grgrdvrt</dc:creator>
				<category><![CDATA[Miam]]></category>
		<category><![CDATA[bitmapData]]></category>
		<category><![CDATA[couleur]]></category>
		<category><![CDATA[lignes]]></category>

		<guid isPermaLink="false">http://grgrdvrt.com/wordpress/?p=33</guid>
		<description><![CDATA[Je sais que vous avez toujours rêvé d'étaler les couleurs d'un jpeg pas encore sec.]]></description>
			<content:encoded><![CDATA[
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_12" width="785" height="625">
      <param name="movie" value="/storage/experiment_player.swf" />
      <param name="flashvars" value="file=/storage/scratch/scratch" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/storage/experiment_player.swf" width="785" height="625" flashvars="file=/storage/scratch/scratch">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<p><br />dessinez sur l&#8217;image pour la barbouiller et actualisez la page pour rétablir l&#8217;image.<br /><br />
 je mets pas de code cette fois-ci (sauf si quelqu&#8217;un le demande), il n&#8217;a pas grand intéret.<br />
 il s&#8217;agit simplement de tracer une centaine de lineTo autour de deux positions successives de la souris et d&#8217;appliquer pour chaque ligne un lineStyle avec une épaisseur de 1, un alpha très faible (genre 1 ou 2%) et pour la couleur un getPixel sur le point de départ de la ligne (il faut donc penser à refaire le lineStyle avant chanque ligne), rien de bien sorcier donc et bien que l&#8217;as3 soit conseillé pour que ça ne rame pas trop, l&#8217;effet est réalisable avec flash 8.<br />
 bon, là sinon j&#8217;ai repris le bon vieux bouquin de Penner au chapitre physique et je m&#8217;amuse à bouger des objets à coup de forces et tout, je posterait peut-être un truc là dessus un de ces jours <img src='http://grgrdvrt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://grgrdvrt.com/blog/33/20071007coup-de-brosse/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

