<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Cleyson Reinhold</title>
    <link>https://cgreinhold.dev/</link>
    
    <atom:link href="/feed.xml" rel="self" type="application/rss+xml"/>
    
    <description></description>
    <pubDate>Thu, 04 Jul 2024 09:12:13 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>Corrente - Experimentos em Programação Criativa - 12</title>
      <link>https://cgreinhold.dev/2024/07/04/creative-coding-experiments-12/</link>
      <guid>https://cgreinhold.dev/2024/07/04/creative-coding-experiments-12/</guid>
      <pubDate>Thu, 04 Jul 2024 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>Desta vez, uma das imagens que eu tinha salvo como inspiração é a seguinte:</p><p><img src="/images/creative-coding/part-12/cc-1.png" alt="Grade de círculos conectando-se"></p><p>Assim como o <a href="https://cgreinhold.dev/2024/06/20/creative-coding-experiments-11/">projeto anterior</a>, esse também é criado por <a href="https://openprocessing.org/user/184331" target="_blank" rel="noopener">Roni Kaufman</a>, onde conseguimos encontrar rascunhos semelhantes para entender como o autor criou.</p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><p>Da mesma forma como no <a href="https://cgreinhold.dev/2024/06/20/creative-coding-experiments-11/">artigo anterior</a>, vou usar um projeto do autor original para entender como criar um rascunho semelhante. Usarei <a href="https://openprocessing.org/sketch/1942847?hidden=true" target="_blank" rel="noopener">esse projeto</a> como base, mas desta vez criarei a minha versão do zero, usando o código original como referência.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>O código completo do projeto de Roni Kaufman pode ser visto abaixo.</p><details>  <summary>    Código original completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> N;</span><br><span class="line"><span class="keyword">let</span> s, margin = <span class="number">1.5</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> detail = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> palette1, palette2;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">500</span>, <span class="number">500</span>, WEBGL);</span><br><span class="line">  N = random([<span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>]);</span><br><span class="line">  s = width/(N+<span class="number">2</span>*margin);</span><br><span class="line">  margin *= s;</span><br><span class="line">  noStroke();</span><br><span class="line">  noLoop();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  translate(-width/<span class="number">2</span>, -height/<span class="number">2</span>);</span><br><span class="line">  </span><br><span class="line">  palette1 = [<span class="string">"#abcd5e"</span>, <span class="string">"#14976b"</span>, <span class="string">"#2b67af"</span>, <span class="string">"#62b6de"</span>, <span class="string">"#f589a3"</span>, <span class="string">"#ef562f"</span>, <span class="string">"#fc8405"</span>, <span class="string">"#f9d531"</span>];</span><br><span class="line">  palette2 = shuffle([<span class="string">"#050505"</span>, <span class="string">"#fffbe6"</span>]);</span><br><span class="line">  </span><br><span class="line"><span class="keyword">let</span> backCol = random([<span class="number">0</span>, <span class="number">1</span>]);</span><br><span class="line">  background(palette2[backCol]);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= N; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = i*s+margin;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= N; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> y = j*s+margin;</span><br><span class="line">      fill(palette2[(i+j)%<span class="number">2</span>]);</span><br><span class="line">      ellipse(x, y, s, s, detail*<span class="number">4</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; N; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; N; j++) &#123;</span><br><span class="line">      makeTile(i, j);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= N; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = i*s+margin;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= N; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> y = j*s+margin;</span><br><span class="line"><span class="keyword">if</span> ((i+j)%<span class="number">2</span> == backCol) fill(random(palette1));</span><br><span class="line"><span class="keyword">else</span> fill(palette2[<span class="number">1</span>-(i+j)%<span class="number">2</span>]);</span><br><span class="line">      ellipse(x, y, s/<span class="number">2</span>, s/<span class="number">2</span>, detail*<span class="number">4</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeTile</span>(<span class="params">i, j</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> x = i*s+margin;</span><br><span class="line">  <span class="keyword">let</span> y = j*s+margin;</span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">1</span>/<span class="number">2</span>) &#123;</span><br><span class="line">    fill(random(palette1));</span><br><span class="line">    square(x, y, s);</span><br><span class="line">    fill(palette2[(i+j)%<span class="number">2</span>]);</span><br><span class="line">    arc(x, y, s, s, <span class="number">0</span>, PI/<span class="number">2</span>, PIE, detail);</span><br><span class="line">    arc(x+s, y+s, s, s, PI, <span class="number">3</span>*PI/<span class="number">2</span>, PIE, detail);</span><br><span class="line">    fill(palette2[<span class="number">1</span>-(i+j)%<span class="number">2</span>]);</span><br><span class="line">    arc(x+s, y, s, s, PI/<span class="number">2</span>, PI, PIE, detail);</span><br><span class="line">    arc(x, y+s, s, s, <span class="number">3</span>*PI/<span class="number">2</span>, TAU, PIE, detail);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (random() &lt; <span class="number">1</span>/<span class="number">2</span>) &#123;</span><br><span class="line">      fill(palette2[<span class="number">1</span>-(i+j)%<span class="number">2</span>]);</span><br><span class="line">      square(x, y, s);</span><br><span class="line">      fill(palette2[(i+j)%<span class="number">2</span>]);</span><br><span class="line">      arc(x, y, s, s, <span class="number">0</span>, PI/<span class="number">2</span>, PIE, detail);</span><br><span class="line">      arc(x+s, y+s, s, s, PI, <span class="number">3</span>*PI/<span class="number">2</span>, PIE, detail);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      fill(palette2[(i+j)%<span class="number">2</span>]);</span><br><span class="line">      square(x, y, s);</span><br><span class="line">      fill(palette2[<span class="number">1</span>-(i+j)%<span class="number">2</span>]);</span><br><span class="line">      arc(x+s, y, s, s, PI/<span class="number">2</span>, PI, PIE, detail);</span><br><span class="line">      arc(x, y+s, s, s, <span class="number">3</span>*PI/<span class="number">2</span>, TAU, PIE, detail);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details><p>O resultado é o seguinte:</p><p><img src="/images/creative-coding/part-12/cc-2.png" alt="Grade de círculos conectando-se"></p><p>Analisando o código, conseguimos ver que ele consiste principalmente de 3 loops. O primeiro gera os grandes círculos do grid, o segundo gera as conexões entre os grandes círculos, e o terceiro os pequenos círculos coloridos.</p><p>Começamos então criando a paleta de cores e definindo as propriedades do grid. Vamos usar o código original como base e criar a paleta dos pontos, do plano de fundo, quantidade de pontos, tamanho e margem.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> dotsPallete = [<span class="string">"#abcd5e"</span>, <span class="string">"#14976b"</span>, <span class="string">"#2b67af"</span>, <span class="string">"#62b6de"</span>, <span class="string">"#f589a3"</span>, <span class="string">"#ef562f"</span>, <span class="string">"#fc8405"</span>, <span class="string">"#f9d531"</span>]</span><br><span class="line"><span class="keyword">const</span> backgroundPallete = [<span class="string">"#050505"</span>, <span class="string">"#fffbe6"</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> dotCount = <span class="number">4</span></span><br><span class="line"><span class="keyword">let</span> dotSize = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> margin = <span class="number">1.5</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">500</span>, <span class="number">500</span>)</span><br><span class="line">  </span><br><span class="line">  dotCount = random([<span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>])</span><br><span class="line">  dotSize = width/(dotCount+<span class="number">2</span>*margin)</span><br><span class="line">  margin *= dotSize</span><br><span class="line">  </span><br><span class="line">  noLoop()</span><br><span class="line">  noStroke()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Para a função de desenho, vamos definir a cor do plano de fundo aleatóriamente e os pequenos pontos coloridos.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> backgroundColor = random([<span class="number">0</span>, <span class="number">1</span>])</span><br><span class="line">  background(backgroundPallete[backgroundColor])</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Loop para pontos coloridos</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      fill(random(dotsPallete))</span><br><span class="line">      ellipse(x, y, dotSize / <span class="number">2</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Esse é o nosso resultado:</p><p><img src="/images/creative-coding/part-12/cc-3.png" alt="Tela escura com grade de pontos coloridos"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Na sequência, vamos adicionas os grandes círculos. Esse será um loop semelhante ao anterios, mas que irá adicionar os círculos intercalados entre um e outro. Isso precisa ser feito antes dos pequenos círculos. As cores também serão opostas ao do plano de fundo.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Loop para grandes círculos</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">      ellipse(x, y, dotSize)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-12/cc-4.png" alt="Tela escura com grade de pontos coloridos"></p><p>Vamos também ajustar os pontos dentro dos grandes círculos para serem da mesma cor do plano de fundo</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Loop para pontos coloridos</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      <span class="keyword">if</span>((i+j)%<span class="number">2</span> !== backgroundColor) fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">      <span class="keyword">else</span> fill(random(dotsPallete))</span><br><span class="line">      ellipse(x, y, dotSize / <span class="number">2</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-12/cc-5.png" alt="Tela escura com grade de pontos coloridos"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Por fim, vamos fazer o loop que adicionar os conectores entre os grandes círculos. Para isso vamos adicionar quadrados entre os pequenos círculos. Esses quadrados serão da cor do correspondente círculo grande, e 2 arcos serão adicionados nos cantos, dando a impressão de que os grandes círculos se conectam.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Loop para os conectores</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      drawConectors(i, j)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawConectors</span>(<span class="params">i, j</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> x = i * dotSize + margin</span><br><span class="line">  <span class="keyword">let</span> y = j * dotSize + margin</span><br><span class="line"></span><br><span class="line">  fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">  square(x, y, dotSize)  </span><br><span class="line">  fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">  arc(x, y, dotSize, dotSize, <span class="number">0</span>, PI/<span class="number">2</span>, PIE)</span><br><span class="line">  arc(x+dotSize, y+dotSize, dotSize, dotSize, PI, <span class="number">3</span>*PI/<span class="number">2</span>, PIE)    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-12/cc-6.png" alt="Tela com grade de pontos coloridos conectados diagonalmente"></p><p>Como podemos ver, com isso os pontos serão conectados sempre diagonalmente. Vamos adicionar algumas aleatoriedades para não adicionar os conectores em todas as posições, e inverter a direção em alguns casos</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawConectors</span>(<span class="params">i, j</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> x = i * dotSize + margin</span><br><span class="line">  <span class="keyword">let</span> y = j * dotSize + margin</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (random(<span class="number">1</span>) &gt; <span class="number">0.8</span>) <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">  <span class="keyword">if</span> (random([<span class="number">0</span>, <span class="number">1</span>])) &#123;</span><br><span class="line">    fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">    square(x, y, dotSize)  </span><br><span class="line">    fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">    arc(x, y, dotSize, dotSize, <span class="number">0</span>, PI/<span class="number">2</span>, PIE)</span><br><span class="line">    arc(x+dotSize, y+dotSize, dotSize, dotSize, PI, <span class="number">3</span>*PI/<span class="number">2</span>, PIE)    </span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">    square(x, y, dotSize)  </span><br><span class="line">    fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">    arc(x+dotSize, y, dotSize, dotSize, PI/<span class="number">2</span>, PI, PIE)</span><br><span class="line">    arc(x, y+dotSize, dotSize, dotSize, <span class="number">3</span>*PI/<span class="number">2</span>, TAU, PIE)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-12/cc-7.png" alt="Tela com grade de pontos coloridos conectados diagonalmente"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Há ainda alguns passos para atingir o resultado do original, mas para não manter o artigo muito longo finalizamos por aqui.<br>Algumas das alterações para ficar mais parecido com o original seriam alterar alguns conectores para serem coloridos, além de a deformação dos conectores serem mais finas.<br>Outra correção seria eliminar as linhas dos quadrados que aparecem quando o a tela é renderizada. Podemos ver que o autor original utiliza o modo WEBGL do p5.js para resolver esse problema.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> dotsPallete = [<span class="string">"#abcd5e"</span>, <span class="string">"#14976b"</span>, <span class="string">"#2b67af"</span>, <span class="string">"#62b6de"</span>, <span class="string">"#f589a3"</span>, <span class="string">"#ef562f"</span>, <span class="string">"#fc8405"</span>, <span class="string">"#f9d531"</span>]</span><br><span class="line"><span class="keyword">const</span> backgroundPallete = [<span class="string">"#050505"</span>, <span class="string">"#fffbe6"</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> dotCount = <span class="number">4</span></span><br><span class="line"><span class="keyword">let</span> dotSize = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> margin = <span class="number">1.5</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">500</span>, <span class="number">500</span>)</span><br><span class="line">  </span><br><span class="line">  dotCount = random([<span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>])</span><br><span class="line">  dotSize = width/(dotCount+<span class="number">2</span>*margin)</span><br><span class="line">  margin *= dotSize</span><br><span class="line">  </span><br><span class="line">  noLoop()</span><br><span class="line">  noStroke()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> backgroundColor = random([<span class="number">0</span>, <span class="number">1</span>])</span><br><span class="line">  background(backgroundPallete[backgroundColor])</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">      ellipse(x, y, dotSize)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      drawConectors(i, j)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt;= dotCount; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> x = i * dotSize + margin</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt;= dotCount; j++) &#123;</span><br><span class="line">      <span class="keyword">const</span> y = j * dotSize + margin</span><br><span class="line">      <span class="keyword">if</span>((i+j)%<span class="number">2</span> !== backgroundColor) fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">      <span class="keyword">else</span> fill(random(dotsPallete))</span><br><span class="line">      ellipse(x, y, dotSize / <span class="number">2</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawConectors</span>(<span class="params">i, j</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> x = i * dotSize + margin</span><br><span class="line">  <span class="keyword">let</span> y = j * dotSize + margin</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (random(<span class="number">1</span>) &gt; <span class="number">0.8</span>) <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">  <span class="keyword">if</span> (random([<span class="number">0</span>, <span class="number">1</span>])) &#123;</span><br><span class="line">    fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">    square(x, y, dotSize)  </span><br><span class="line">    fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">    arc(x, y, dotSize, dotSize, <span class="number">0</span>, PI/<span class="number">2</span>, PIE)</span><br><span class="line">    arc(x+dotSize, y+dotSize, dotSize, dotSize, PI, <span class="number">3</span>*PI/<span class="number">2</span>, PIE)    </span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    fill(backgroundPallete[(i+j)%<span class="number">2</span>])</span><br><span class="line">    square(x, y, dotSize)  </span><br><span class="line">    fill(backgroundPallete[<span class="number">1</span>-(i+j)%<span class="number">2</span>])</span><br><span class="line">    arc(x+dotSize, y, dotSize, dotSize, PI/<span class="number">2</span>, PI, PIE)</span><br><span class="line">    arc(x, y+dotSize, dotSize, dotSize, <span class="number">3</span>*PI/<span class="number">2</span>, TAU, PIE)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2024/07/04/creative-coding-experiments-12/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Hexagonos - Experimentos em Programação Criativa - 11</title>
      <link>https://cgreinhold.dev/2024/06/20/creative-coding-experiments-11/</link>
      <guid>https://cgreinhold.dev/2024/06/20/creative-coding-experiments-11/</guid>
      <pubDate>Thu, 20 Jun 2024 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>Desta vez, uma das imagens que eu tinha salvo como inspiração é a seguinte:</p><p><img src="/images/creative-coding/part-11/cc-1.png" alt="Múltiplos hexagonos parecendo salas"></p><p>No caso dessa imagem, lembrei que tinha encontrado através do canal <a href="https://discord.gg/hBrWUCKu" target="_blank" rel="noopener">Birb’s Nest no discord</a>, então fui atrás da origem. Não encontrei a exata imagem, mas encontrei <a href="https://www.gorillasun.de/blog/a-guide-to-hexagonal-grids-in-p5js/" target="_blank" rel="noopener">esse ótimo artigo</a> do Gorilla Sun, e <a href="https://openprocessing.org/sketch/1361971?hidden=true" target="_blank" rel="noopener">esse projeto</a> de Roni Kaufman no Open Processing, que por sinal é o mesmo autor da imagem de inspiração.</p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><p>Neste artigo, diferentemente dos outros dessa série, vou analisar e alterar o projeto acima para tentar chegar no resultado da imagem de inspiração. Isso irá facilitar chegar no resultado, e é algo que geralmente faço em outros projetos (alterar códigos prontos para chegar em novos resultados)</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>O código completo do projeto de Roni Kaufman pode ser visto abaixo, assim como o resultado, mas vamos analisá-lo passo a passo</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> matrix = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> WIDTH = <span class="number">60</span></span><br><span class="line"><span class="keyword">const</span> CHECKED_SIZE = <span class="number">6</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(WIDTH * (CHECKED_SIZE + <span class="number">2</span>), WIDTH * (CHECKED_SIZE + <span class="number">2</span>))</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, i</span>) =&gt;</span> &#123;</span><br><span class="line">    matrix.push([])</span><br><span class="line">    <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, j</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> v = i % <span class="number">2</span> === <span class="number">0</span> ? (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>) : (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">0</span> : <span class="number">1</span>)</span><br><span class="line">      matrix[i].push(v)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; matrix.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; matrix[i].length; j++) &#123;</span><br><span class="line">      fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">0</span> : <span class="number">220</span>)</span><br><span class="line">      <span class="keyword">const</span> x = WIDTH * i + WIDTH</span><br><span class="line">      <span class="keyword">const</span> y = WIDTH * j + WIDTH</span><br><span class="line">      square(x, y, WIDTH)</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">const</span> isXWall = i === <span class="number">0</span> || i === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">const</span> isYWall = j === <span class="number">0</span> || j === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">if</span> (isXWall &amp;&amp; isYWall) &#123;</span><br><span class="line">        fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">220</span> : <span class="number">0</span>)</span><br><span class="line">        circle(x + WIDTH/<span class="number">2</span>, y + WIDTH/<span class="number">2</span>, WIDTH / <span class="number">2</span>)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">mouseClicked</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> isLeftWall = mouseX &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isRightWall = mouseX &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">const</span> isTopWall = mouseY &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isBottomWall = mouseY &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">if</span> (isLeftWall || isRightWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> row = floor(mouseY * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    rotateMatrix(row - <span class="number">1</span>, <span class="string">'x'</span>, isLeftWall ? <span class="string">'right'</span> : <span class="string">'left'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (isTopWall || isBottomWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> column = floor(mouseX * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    rotateMatrix(column - <span class="number">1</span>, <span class="string">'y'</span>, isTopWall ? <span class="string">'bottom'</span> : <span class="string">'top'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">rotateMatrix</span>(<span class="params">index, axis, direction</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt;= CHECKED_SIZE) <span class="keyword">return</span></span><br><span class="line">  <span class="keyword">if</span>(axis === <span class="string">'y'</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'bottom'</span>) &#123;</span><br><span class="line">      matrix[index].unshift(matrix[index].pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      matrix[index].push(matrix[index].shift())</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> cells = matrix.map(<span class="function"><span class="params">row</span> =&gt;</span> row[index])</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'right'</span>) &#123;</span><br><span class="line">      cells.unshift(cells.pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      cells.push(cells.shift())</span><br><span class="line">    &#125;</span><br><span class="line">    matrix.forEach(<span class="function">(<span class="params">row, i</span>) =&gt;</span> row[index] = cells[i])</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details><p><img src="/images/creative-coding/part-11/cc-2.png" alt="Múltiplos hexagonos listrados"></p><p>No setup da aplicação, podemos ver que algumas cores são definidas (provavelmente as cores das linhas internas de cada hexagono), além de algumas configurações básicas para as linhas. Podemos ver também que ele não será executado em um loop. Para chegarmos no resultado que buscamos vamos precisar mudar as cores.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> SQRT3 = <span class="built_in">Math</span>.sqrt(<span class="number">3</span>);</span><br><span class="line"><span class="keyword">let</span> colors = [<span class="string">"#026edb"</span>, <span class="string">"#f5d216"</span>, <span class="string">"#fc3503"</span>, <span class="string">"#09b734"</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">496</span>, <span class="number">496</span>);</span><br><span class="line">  noLoop();</span><br><span class="line">  strokeWeight(<span class="number">2.4</span>);</span><br><span class="line">  strokeJoin(BEVEL);</span><br><span class="line">  noFill();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>O método de desenho, por sua vez, possui alguns loops. Vendo o resultado renderizado em tela, posso presumir que um dos loops irá desenhar o plano de fundo, e o outro os hexagonos acima.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  translate(width/<span class="number">2</span>, height/<span class="number">2</span>);</span><br><span class="line">  rotate(random(([<span class="number">0</span>, PI/<span class="number">6</span>])));</span><br><span class="line">  background(<span class="number">255</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> s = <span class="number">18</span>;</span><br><span class="line">  <span class="keyword">let</span> t = s*SQRT3;</span><br><span class="line">  stroke(<span class="number">220</span>);</span><br><span class="line">  <span class="keyword">let</span> n = <span class="number">13</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = -n; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = -n; j &lt;= n; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = (i*SQRT3 + j*SQRT3/<span class="number">2</span>)*s;</span><br><span class="line">      <span class="keyword">let</span> y = (j*<span class="number">3</span>/<span class="number">2</span>)*s;</span><br><span class="line">      <span class="keyword">let</span> theta0 = random([<span class="number">0</span>, PI/<span class="number">3</span>]);</span><br><span class="line">      <span class="keyword">for</span> (<span class="keyword">let</span> theta = theta0+PI/<span class="number">6</span>; theta &lt; TWO_PI; theta += TWO_PI/<span class="number">3</span>) &#123;</span><br><span class="line">        push();</span><br><span class="line">        translate(x + cos(theta)*s/<span class="number">2</span>, y + sin(theta)*s/<span class="number">2</span>);</span><br><span class="line">        rotate(theta+PI/<span class="number">2</span>);</span><br><span class="line">        makeRhombus(s, t);</span><br><span class="line">        pop();</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  rotate(PI/<span class="number">6</span>);  </span><br><span class="line">  s *= SQRT3;</span><br><span class="line">  t *= SQRT3;</span><br><span class="line">  n = <span class="number">7</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = -n; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = -n; j &lt;= n; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = (i*SQRT3 + j*SQRT3/<span class="number">2</span>)*s;</span><br><span class="line">      <span class="keyword">let</span> y = (j*<span class="number">3</span>/<span class="number">2</span>)*s;</span><br><span class="line">      <span class="keyword">if</span> (dist(x, y, <span class="number">0</span>, <span class="number">0</span>) &lt; <span class="number">185</span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> mode = random([<span class="number">0</span>, <span class="number">1</span>]); <span class="comment">// which orientation for the hexagon</span></span><br><span class="line">        <span class="keyword">let</span> theta0 = (mode == <span class="number">0</span>) ? <span class="number">0</span> : PI/<span class="number">3</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> theta = theta0+PI/<span class="number">6</span>; theta &lt; TWO_PI; theta += TWO_PI/<span class="number">3</span>) &#123;</span><br><span class="line">          push();</span><br><span class="line">          translate(x + cos(theta)*s/<span class="number">2</span>, y + sin(theta)*s/<span class="number">2</span>);</span><br><span class="line">          rotate(theta+PI/<span class="number">2</span>);</span><br><span class="line">          <span class="keyword">let</span> l = floor(random(<span class="number">2</span>, <span class="number">6</span>));</span><br><span class="line">          noStroke();</span><br><span class="line">          fill(<span class="number">255</span>);</span><br><span class="line">          makeRhombus(s, t);</span><br><span class="line">          stroke(random(colors));</span><br><span class="line">          makeRhombusLines(s, t, l);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          noFill();</span><br><span class="line">          makeRhombus(s, t);</span><br><span class="line">          pop();</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Por fim temos algumas funções auxiliares criando “rhombus”, ou losangos, e o que parecem ser suas linhas iternas. Por isso podemos presumir que não são necessáriamente hexagonos desenhados, mas sim 3 losangos lado a lado formando cada hexagono.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeRhombus</span>(<span class="params">s, t</span>) </span>&#123;</span><br><span class="line">  beginShape();</span><br><span class="line">  vertex(<span class="number">0</span>, -s/<span class="number">2</span>);</span><br><span class="line">  vertex(t/<span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  vertex(<span class="number">0</span>, s/<span class="number">2</span>);</span><br><span class="line">  vertex(-t/<span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  endShape(CLOSE);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeRhombusLines</span>(<span class="params">s, t, l</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> a = [<span class="number">0</span>, -s/<span class="number">2</span>]; <span class="comment">// top vertex</span></span><br><span class="line">  <span class="keyword">let</span> b = [t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// right vertex</span></span><br><span class="line">  <span class="keyword">let</span> c = [<span class="number">0</span>, s/<span class="number">2</span>]; <span class="comment">// bottom vertex</span></span><br><span class="line">  <span class="keyword">let</span> d = [-t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// left vertex</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">1</span>/<span class="number">2</span>) &#123;</span><br><span class="line">    [b, d] = [d, b];</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> double = random() &lt; <span class="number">1</span>/<span class="number">2</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> z = <span class="number">1</span>/l; z &lt; <span class="number">1</span>; z += <span class="number">1</span>/l) &#123;</span><br><span class="line">    <span class="keyword">let</span> [x1, y1] = prop(a, b, z);</span><br><span class="line">    <span class="keyword">let</span> [x2, y2] = prop(d, c, z);</span><br><span class="line">    line(x1, y1, x2, y2);</span><br><span class="line">    <span class="keyword">if</span> (double) &#123;</span><br><span class="line">      [x1, y1] = prop(a, d, z);</span><br><span class="line">      [x2, y2] = prop(b, c, z);</span><br><span class="line">      line(x1, y1, x2, y2);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">prop</span>(<span class="params">a, b, k</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> xC = (<span class="number">1</span>-k)*a[<span class="number">0</span>] + k*b[<span class="number">0</span>];</span><br><span class="line">  <span class="keyword">let</span> yC = (<span class="number">1</span>-k)*a[<span class="number">1</span>] + k*b[<span class="number">1</span>];</span><br><span class="line">  <span class="keyword">return</span> [xC, yC];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Começando de forma fácil, vamos remover o primeiro loop da função de desenho, e alterar um pouco os valores para descobrir a função de cada um.<br>De cara, podemos descobrir, aumentando e diminuindo o valor da <code>const s</code>, que esse aparenta ser o tamanho dos losangos. Vamos então aumentá-lo para <code>40</code>, e remover o acrécimo que é feito a ele antes do segundo loop, ficando assim mais próximo da imagem de inspiração.</p><p><img src="/images/creative-coding/part-11/cc-3.png" alt="Múltiplos hexagonos listrados"></p><p>Outra coisa que podemos notar é a <code>const mode</code>, que define a direção dos hexagonos. Vamos removê-la, removendo também a <code>const theta0</code>, pois não vamos usar esses diferentes modos. Além disso, remover as funções de <code>rotate</code> e ajustar o size</p><p>A função de desenho ficou assim após essas alterações:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  translate(width/<span class="number">2</span>, height/<span class="number">2</span>);</span><br><span class="line">  background(<span class="number">255</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> size = <span class="number">40</span>;</span><br><span class="line">  <span class="keyword">let</span> t = size*SQRT3;</span><br><span class="line">  stroke(<span class="number">220</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> n = <span class="number">7</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = -n; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = -n; j &lt;= n; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = (i*SQRT3 + j*SQRT3/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">let</span> y = (j*<span class="number">3</span>/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">if</span> (dist(x, y, <span class="number">0</span>, <span class="number">0</span>) &lt; <span class="number">175</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> theta = PI/<span class="number">6</span>; theta &lt; TWO_PI; theta += TWO_PI/<span class="number">3</span>) &#123;</span><br><span class="line">          push();</span><br><span class="line">          translate(x + cos(theta)*size/<span class="number">2</span>, y + sin(theta)*size/<span class="number">2</span>);</span><br><span class="line">          rotate(theta+PI/<span class="number">2</span>);</span><br><span class="line">          <span class="keyword">let</span> l = floor(random(<span class="number">2</span>, <span class="number">6</span>));</span><br><span class="line">          noStroke();</span><br><span class="line">          fill(<span class="number">255</span>);</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          stroke(random(colors));</span><br><span class="line">          makeRhombusLines(size, t, l);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          noFill();</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          pop();</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Vamos agora ajustar as cores. Dentro do loop podemos ver que as cores das linhas são definidas com a função <code>stroke(random(colors));</code>. Vamos mudá-la para apenas <code>stroke(0);</code>.<br>Para os amarelos, podemos trocar o <code>fill(255);</code>, por uma validação na váriavel <code>theta</code> do loop, onde pegamos o resto da divisão do valor por 3 (cada lado) e adicionamos uma cor para cada lado:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">0</span>) fill(<span class="number">255</span>,<span class="number">250</span>,<span class="number">193</span>);</span><br><span class="line"><span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">1</span>) fill(<span class="number">252</span>,<span class="number">179</span>,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">2</span>) fill(<span class="number">255</span>,<span class="number">203</span>,<span class="number">31</span>);</span><br></pre></td></tr></table></figure><p>A função de desenho atualizada fica assim:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  translate(width/<span class="number">2</span>, height/<span class="number">2</span>);</span><br><span class="line">  background(<span class="number">255</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> size = <span class="number">40</span>;</span><br><span class="line">  <span class="keyword">let</span> t = size*SQRT3;</span><br><span class="line">  stroke(<span class="number">220</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> n = <span class="number">7</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = -n; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = -n; j &lt;= n; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = (i*SQRT3 + j*SQRT3/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">let</span> y = (j*<span class="number">3</span>/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">if</span> (dist(x, y, <span class="number">0</span>, <span class="number">0</span>) &lt; <span class="number">175</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> theta = PI/<span class="number">6</span>; theta &lt; TWO_PI; theta += TWO_PI/<span class="number">3</span>) &#123;</span><br><span class="line">          push();</span><br><span class="line">          translate(x + cos(theta)*size/<span class="number">2</span>, y + sin(theta)*size/<span class="number">2</span>);</span><br><span class="line">          rotate(theta+PI/<span class="number">2</span>);</span><br><span class="line">          <span class="keyword">let</span> l = floor(random(<span class="number">2</span>, <span class="number">6</span>));</span><br><span class="line">          noStroke();</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">0</span>) fill(<span class="number">255</span>,<span class="number">250</span>,<span class="number">193</span>);</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">1</span>) fill(<span class="number">252</span>,<span class="number">179</span>,<span class="number">0</span>);</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">2</span>) fill(<span class="number">255</span>,<span class="number">203</span>,<span class="number">31</span>);</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          makeRhombusLines(size, t, l);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          noFill();</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          pop();</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E esse é o resultado</p><p><img src="/images/creative-coding/part-11/cc-4.png" alt="Múltiplos hexagonos amarelos listrados"></p><h2 id="Passo-4"><a href="#Passo-4" class="headerlink" title="Passo 4"></a>Passo 4</h2><p>Para a próxima parte, vamos alterar a função que altera as linhas dos losangos. Para facilitar, vou criar uma função para cada tipo de parede, e chamálas de forma aleatória dentro da função <code>makeRhombusLines(s, t)</code> já existente:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeRhombusLines</span>(<span class="params">s, t</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> a = [<span class="number">0</span>, -s/<span class="number">2</span>]; <span class="comment">// top vertex</span></span><br><span class="line">  <span class="keyword">let</span> b = [t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// right vertex</span></span><br><span class="line">  <span class="keyword">let</span> c = [<span class="number">0</span>, s/<span class="number">2</span>]; <span class="comment">// bottom vertex</span></span><br><span class="line">  <span class="keyword">let</span> d = [-t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// left vertex</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Invert direction of inner content on same side of hexagon</span></span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">1</span>/<span class="number">2</span>) &#123;</span><br><span class="line">    [b, d] = [d, b];</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> isStripped = round(random(<span class="number">1</span>,<span class="number">2</span>)) === <span class="number">1</span></span><br><span class="line">  <span class="keyword">const</span> type = round(random(<span class="number">1</span>,<span class="number">8</span>))</span><br><span class="line">  <span class="keyword">if</span> (isStripped) makeStripedWall(a,b,c,d)</span><br><span class="line">  <span class="keyword">if</span> (type === <span class="number">2</span>) makeDoor(s,t)</span><br><span class="line">  <span class="keyword">if</span> (!isStripped &amp;&amp; type === <span class="number">3</span>) makeWindow(s,t)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeStripedWall</span>(<span class="params">a,b,c,d</span>) </span>&#123;</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeDoor</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeWindow</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Para a função de parede listrada será fácil. Basta usarmos a mesma que já tinhamos originalmente. A única diferença é que não iremos pintar duas vezes fazendo xadrezes.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeStripedWall</span>(<span class="params">a,b,c,d</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> z = <span class="number">1</span>/<span class="number">4</span>; z &lt; <span class="number">1</span>; z += <span class="number">1</span>/<span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> [x1, y1] = prop(a, b, z);</span><br><span class="line">    <span class="keyword">let</span> [x2, y2] = prop(d, c, z);</span><br><span class="line">    line(x1, y1, x2, y2);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>A função de janela também é simples. Podemos usar a mesma lógica de fazer os hexagonos e o xadrez, porém reduzindo o tamanho e usando apenas uma linha vertical e horizontal.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeWindow</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">  makeRhombus(s/<span class="number">2</span>,t/<span class="number">2</span>)</span><br><span class="line">  <span class="keyword">let</span> a = [<span class="number">0</span>, -s/<span class="number">4</span>]; <span class="comment">// top vertex</span></span><br><span class="line">  <span class="keyword">let</span> b = [t/<span class="number">4</span>, <span class="number">0</span>]; <span class="comment">// right vertex</span></span><br><span class="line">  <span class="keyword">let</span> c = [<span class="number">0</span>, s/<span class="number">4</span>]; <span class="comment">// bottom vertex</span></span><br><span class="line">  <span class="keyword">let</span> d = [-t/<span class="number">4</span>, <span class="number">0</span>]; <span class="comment">// left vertex</span></span><br><span class="line">  <span class="keyword">let</span> [vx1, vy1] = prop(a, b, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  <span class="keyword">let</span> [vx2, vy2] = prop(d, c, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  line(vx1,vy1,vx2,vy2)</span><br><span class="line">  <span class="keyword">let</span> [hx1, hy1] = prop(a, d, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  <span class="keyword">let</span> [hx2, hy2] = prop(b, c, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  line(hx1,hy1,hx2,hy2)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Para a porta, decidi fazer apenas um losango e movê-lo para o canto do losango maior, e adicionar um ponto. A lógica fica bem simples, por mais que não fique exatamente igual à imagem de inspiração.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeDoor</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">  push();</span><br><span class="line">  translate(-t/<span class="number">8</span>, -s/<span class="number">8</span>)</span><br><span class="line">  makeRhombus(s/<span class="number">2</span>,t/<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  point(t/<span class="number">16</span>, -s/<span class="number">12</span>);</span><br><span class="line">  pop();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-11/cc-5.png" alt="Múltiplos hexagonos amarelos listrados e com janelas"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Esse artigo foi um dos mais simples de implementar, já que todo o trabalho duro foi copiado do projeto original de Roni Kaufman. De qualquer forma, acho um bom exercício modificar projetos de outros programadores, pois assim aprendemos coisas novas e novas formas de implementar pequenos algoritmos.</p><p>Para terminar esse projeto com um visual mais similar ao da imagem de inspiração, ajustar a largura da porta seria o último passo.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> SQRT3 = <span class="built_in">Math</span>.sqrt(<span class="number">3</span>);</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">496</span>, <span class="number">496</span>);</span><br><span class="line">  noLoop();</span><br><span class="line">  strokeWeight(<span class="number">2.4</span>);</span><br><span class="line">  strokeJoin(BEVEL);</span><br><span class="line">  noFill();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  translate(width/<span class="number">2</span>, height/<span class="number">2</span>);</span><br><span class="line">  background(<span class="number">255</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> size = <span class="number">40</span>;</span><br><span class="line">  <span class="keyword">let</span> t = size*SQRT3;</span><br><span class="line">  stroke(<span class="number">220</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> n = <span class="number">7</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = -n; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = -n; j &lt;= n; j++) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = (i*SQRT3 + j*SQRT3/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">let</span> y = (j*<span class="number">3</span>/<span class="number">2</span>)*size;</span><br><span class="line">      <span class="keyword">if</span> (dist(x, y, <span class="number">0</span>, <span class="number">0</span>) &lt; <span class="number">175</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> theta = PI/<span class="number">6</span>; theta &lt; TWO_PI; theta += TWO_PI/<span class="number">3</span>) &#123;</span><br><span class="line">          push();</span><br><span class="line">          translate(x + cos(theta)*size/<span class="number">2</span>, y + sin(theta)*size/<span class="number">2</span>);</span><br><span class="line">          rotate(theta+PI/<span class="number">2</span>);</span><br><span class="line">          <span class="keyword">let</span> l = floor(random(<span class="number">2</span>, <span class="number">6</span>));</span><br><span class="line">          noStroke();</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">0</span>) fill(<span class="number">255</span>,<span class="number">250</span>,<span class="number">193</span>);</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">1</span>) fill(<span class="number">252</span>,<span class="number">179</span>,<span class="number">0</span>);</span><br><span class="line">          <span class="keyword">if</span>(floor(theta)%<span class="number">3</span> === <span class="number">2</span>) fill(<span class="number">255</span>,<span class="number">203</span>,<span class="number">31</span>);</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          makeRhombusLines(size, t, l);</span><br><span class="line">          stroke(<span class="number">0</span>);</span><br><span class="line">          noFill();</span><br><span class="line">          makeRhombus(size, t);</span><br><span class="line">          pop();</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeRhombus</span>(<span class="params">s, t</span>) </span>&#123;</span><br><span class="line">  beginShape();</span><br><span class="line">  vertex(<span class="number">0</span>, -s/<span class="number">2</span>);</span><br><span class="line">  vertex(t/<span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  vertex(<span class="number">0</span>, s/<span class="number">2</span>);</span><br><span class="line">  vertex(-t/<span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  endShape(CLOSE);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeRhombusLines</span>(<span class="params">s, t</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> a = [<span class="number">0</span>, -s/<span class="number">2</span>]; <span class="comment">// top vertex</span></span><br><span class="line">  <span class="keyword">let</span> b = [t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// right vertex</span></span><br><span class="line">  <span class="keyword">let</span> c = [<span class="number">0</span>, s/<span class="number">2</span>]; <span class="comment">// bottom vertex</span></span><br><span class="line">  <span class="keyword">let</span> d = [-t/<span class="number">2</span>, <span class="number">0</span>]; <span class="comment">// left vertex</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Invert direction of inner content on same side of hexagon</span></span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">1</span>/<span class="number">2</span>) &#123;</span><br><span class="line">    [b, d] = [d, b];</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> isStripped = round(random(<span class="number">1</span>,<span class="number">2</span>)) === <span class="number">1</span></span><br><span class="line">  <span class="keyword">const</span> type = round(random(<span class="number">1</span>,<span class="number">8</span>))</span><br><span class="line">  <span class="keyword">if</span> (isStripped) makeStripedWall(a,b,c,d)</span><br><span class="line">  <span class="keyword">if</span> (type === <span class="number">2</span>) makeDoor(s,t)</span><br><span class="line">  <span class="keyword">if</span> (!isStripped &amp;&amp; type === <span class="number">3</span>) makeWindow(s,t)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeStripedWall</span>(<span class="params">a,b,c,d</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> z = <span class="number">1</span>/<span class="number">4</span>; z &lt; <span class="number">1</span>; z += <span class="number">1</span>/<span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> [x1, y1] = prop(a, b, z);</span><br><span class="line">    <span class="keyword">let</span> [x2, y2] = prop(d, c, z);</span><br><span class="line">    line(x1, y1, x2, y2);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeWindow</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">  makeRhombus(s/<span class="number">2</span>,t/<span class="number">2</span>)</span><br><span class="line">  <span class="keyword">let</span> a = [<span class="number">0</span>, -s/<span class="number">4</span>]; <span class="comment">// top vertex</span></span><br><span class="line">  <span class="keyword">let</span> b = [t/<span class="number">4</span>, <span class="number">0</span>]; <span class="comment">// right vertex</span></span><br><span class="line">  <span class="keyword">let</span> c = [<span class="number">0</span>, s/<span class="number">4</span>]; <span class="comment">// bottom vertex</span></span><br><span class="line">  <span class="keyword">let</span> d = [-t/<span class="number">4</span>, <span class="number">0</span>]; <span class="comment">// left vertex</span></span><br><span class="line">  <span class="keyword">let</span> [vx1, vy1] = prop(a, b, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  <span class="keyword">let</span> [vx2, vy2] = prop(d, c, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  line(vx1,vy1,vx2,vy2)</span><br><span class="line">  <span class="keyword">let</span> [hx1, hy1] = prop(a, d, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  <span class="keyword">let</span> [hx2, hy2] = prop(b, c, <span class="number">1</span>/<span class="number">2</span>);</span><br><span class="line">  line(hx1,hy1,hx2,hy2)</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">makeDoor</span>(<span class="params">s,t</span>) </span>&#123;</span><br><span class="line">  push();</span><br><span class="line">  translate(-t/<span class="number">8</span>, -s/<span class="number">8</span>)</span><br><span class="line">  makeRhombus(s/<span class="number">2</span>,t/<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  point(t/<span class="number">16</span>, -s/<span class="number">12</span>);</span><br><span class="line">  pop();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">prop</span>(<span class="params">a, b, k</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> xC = (<span class="number">1</span>-k)*a[<span class="number">0</span>] + k*b[<span class="number">0</span>];</span><br><span class="line">  <span class="keyword">let</span> yC = (<span class="number">1</span>-k)*a[<span class="number">1</span>] + k*b[<span class="number">1</span>];</span><br><span class="line">  <span class="keyword">return</span> [xC, yC];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2024/06/20/creative-coding-experiments-11/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Xadrez - Experimentos em Programação Criativa - 10</title>
      <link>https://cgreinhold.dev/2024/06/12/creative-coding-experiments-10/</link>
      <guid>https://cgreinhold.dev/2024/06/12/creative-coding-experiments-10/</guid>
      <pubDate>Wed, 12 Jun 2024 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>Desta vez, uma das imagens que eu tinha salvo como inspiração é a capa do album Wings da banda BTS:</p><p><img src="/images/creative-coding/part-10/cc-1.gif" alt="Grid com movimento ao clicar nas bordas"></p><p>Nessa imagem, quatro círculos são desenhados com diferentes estilos. A proposta não é desenvolver algo 100% fiel, mas que relembre essa capa.</p><p>O resultado foi o seguinte:</p><p><img src="/images/creative-coding/part-10/cc-2.gif" alt="Reprodução de grid com movimento ao clicar nas bordas"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Começando pelo grid, vamos criar uma matriz que guardará cada uma das células. Os valores serão 1 para células pretas e 0 para células brancas.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> matrix = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> WIDTH = <span class="number">60</span></span><br><span class="line"><span class="keyword">const</span> CHECKED_SIZE = <span class="number">6</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(WIDTH * (CHECKED_SIZE + <span class="number">2</span>), WIDTH * (CHECKED_SIZE + <span class="number">2</span>))</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, i</span>) =&gt;</span> &#123;</span><br><span class="line">    matrix.push([])</span><br><span class="line">    <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, j</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> v = i % <span class="number">2</span> === <span class="number">0</span> ? (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>) : (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">0</span> : <span class="number">1</span>)</span><br><span class="line">      matrix[i].push(v)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E pintamos eles na tela como um grid de quadrados</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; matrix.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; matrix[i].length; j++) &#123;</span><br><span class="line">      fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">0</span> : <span class="number">220</span>)</span><br><span class="line">      <span class="keyword">const</span> x = WIDTH * i + WIDTH</span><br><span class="line">      <span class="keyword">const</span> y = WIDTH * j + WIDTH</span><br><span class="line">      square(x, y, WIDTH)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Com isso temos o seguinte resultado:</p><p><img src="/images/creative-coding/part-10/cc-3.png" alt="Grid com xadrez na tela"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Para o próximo passo, vamos adicionar os pequenos círculos nas quatro pontas do tabuleiro. Basta verificarmos se o quadrado faz parte de uma das pontas, e adicionar um círculo na posição central</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; matrix.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; matrix[i].length; j++) &#123;</span><br><span class="line">      ...</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">const</span> isXWall = i === <span class="number">0</span> || i === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">const</span> isYWall = j === <span class="number">0</span> || j === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">if</span> (isXWall &amp;&amp; isYWall) &#123;</span><br><span class="line">        fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">220</span> : <span class="number">0</span>)</span><br><span class="line">        circle(x + WIDTH/<span class="number">2</span>, y + WIDTH/<span class="number">2</span>, WIDTH / <span class="number">2</span>)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Resultando no seguinte:</p><p><img src="/images/creative-coding/part-10/cc-4.png" alt="Grid com xadrez na tela e um círculo em cada ponta"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Neste último passo, vamos adicionar a ação do clique. O próprio p5.js já possui uma função interna que observa o método <code>mouseClicked()</code> para facilitar o desenvolvimento, por isso podemos só implementar esse método e usar as variáveis <code>mouseX</code> e <code>mouseY</code> para detectar a posição do canvas que foi clicado.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">mouseClicked</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> isLeftWall = mouseX &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isRightWall = mouseX &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">const</span> isTopWall = mouseY &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isBottomWall = mouseY &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">if</span> (isLeftWall || isRightWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> row = floor(mouseY * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    <span class="comment">// Mover a linha para a direita ou esquerda</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (isTopWall || isBottomWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> column = floor(mouseX * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    <span class="comment">// Mover a coluna para baixo ou para cima</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E com uma lógica um pouco mais elaborada, podemos fazer o deslocamento das células para a direção desejada.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">mouseClicked</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="keyword">if</span> (isLeftWall || isRightWall) &#123;</span><br><span class="line">    ...</span><br><span class="line">    rotateMatrix(row - <span class="number">1</span>, <span class="string">'x'</span>, isLeftWall ? <span class="string">'right'</span> : <span class="string">'left'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (isTopWall || isBottomWall) &#123;</span><br><span class="line">    ...</span><br><span class="line">    rotateMatrix(column - <span class="number">1</span>, <span class="string">'y'</span>, isTopWall ? <span class="string">'bottom'</span> : <span class="string">'top'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">rotateMatrix</span>(<span class="params">index, axis, direction</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt;= CHECKED_SIZE) <span class="keyword">return</span></span><br><span class="line">  <span class="keyword">if</span>(axis === <span class="string">'y'</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'bottom'</span>) &#123;</span><br><span class="line">      matrix[index].unshift(matrix[index].pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      matrix[index].push(matrix[index].shift())</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> cells = matrix.map(<span class="function"><span class="params">row</span> =&gt;</span> row[index])</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'right'</span>) &#123;</span><br><span class="line">      cells.unshift(cells.pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      cells.push(cells.shift())</span><br><span class="line">    &#125;</span><br><span class="line">    matrix.forEach(<span class="function">(<span class="params">row, i</span>) =&gt;</span> row[index] = cells[i])</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Produzindo nosso resultado final:</p><p><img src="/images/creative-coding/part-10/cc-5.gif" alt="Resultado final com as ações do clique deslocando as linhas e colunas do xadrez"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Para um resultado mais fiel ao original, seria legal adicionar uma animação para visualizar as linhas e colunas movendo para a direção que estão sendo deslocadas, além de linhas delimitando quais direções podem ou não ser clicadas.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> matrix = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> WIDTH = <span class="number">60</span></span><br><span class="line"><span class="keyword">const</span> CHECKED_SIZE = <span class="number">6</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(WIDTH * (CHECKED_SIZE + <span class="number">2</span>), WIDTH * (CHECKED_SIZE + <span class="number">2</span>))</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, i</span>) =&gt;</span> &#123;</span><br><span class="line">    matrix.push([])</span><br><span class="line">    <span class="keyword">new</span> <span class="built_in">Array</span>(CHECKED_SIZE).fill(<span class="number">0</span>).map(<span class="function">(<span class="params">_, j</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> v = i % <span class="number">2</span> === <span class="number">0</span> ? (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>) : (j % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">0</span> : <span class="number">1</span>)</span><br><span class="line">      matrix[i].push(v)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">2</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; matrix.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; matrix[i].length; j++) &#123;</span><br><span class="line">      fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">0</span> : <span class="number">220</span>)</span><br><span class="line">      <span class="keyword">const</span> x = WIDTH * i + WIDTH</span><br><span class="line">      <span class="keyword">const</span> y = WIDTH * j + WIDTH</span><br><span class="line">      square(x, y, WIDTH)</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">const</span> isXWall = i === <span class="number">0</span> || i === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">const</span> isYWall = j === <span class="number">0</span> || j === CHECKED_SIZE - <span class="number">1</span></span><br><span class="line">      <span class="keyword">if</span> (isXWall &amp;&amp; isYWall) &#123;</span><br><span class="line">        fill(matrix[i][j] === <span class="number">1</span> ? <span class="number">220</span> : <span class="number">0</span>)</span><br><span class="line">        circle(x + WIDTH/<span class="number">2</span>, y + WIDTH/<span class="number">2</span>, WIDTH / <span class="number">2</span>)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">mouseClicked</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> isLeftWall = mouseX &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isRightWall = mouseX &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">const</span> isTopWall = mouseY &lt; WIDTH</span><br><span class="line">  <span class="keyword">const</span> isBottomWall = mouseY &gt; WIDTH * <span class="number">7</span></span><br><span class="line">  <span class="keyword">if</span> (isLeftWall || isRightWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> row = floor(mouseY * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    rotateMatrix(row - <span class="number">1</span>, <span class="string">'x'</span>, isLeftWall ? <span class="string">'right'</span> : <span class="string">'left'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (isTopWall || isBottomWall) &#123;</span><br><span class="line">    <span class="keyword">const</span> column = floor(mouseX * (CHECKED_SIZE + <span class="number">2</span>) / width)</span><br><span class="line">    rotateMatrix(column - <span class="number">1</span>, <span class="string">'y'</span>, isTopWall ? <span class="string">'bottom'</span> : <span class="string">'top'</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">rotateMatrix</span>(<span class="params">index, axis, direction</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt;= CHECKED_SIZE) <span class="keyword">return</span></span><br><span class="line">  <span class="keyword">if</span>(axis === <span class="string">'y'</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'bottom'</span>) &#123;</span><br><span class="line">      matrix[index].unshift(matrix[index].pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      matrix[index].push(matrix[index].shift())</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> cells = matrix.map(<span class="function"><span class="params">row</span> =&gt;</span> row[index])</span><br><span class="line">    <span class="keyword">if</span> (direction === <span class="string">'right'</span>) &#123;</span><br><span class="line">      cells.unshift(cells.pop())</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      cells.push(cells.shift())</span><br><span class="line">    &#125;</span><br><span class="line">    matrix.forEach(<span class="function">(<span class="params">row, i</span>) =&gt;</span> row[index] = cells[i])</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2024/06/12/creative-coding-experiments-10/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Wings - Experimentos em Programação Criativa - 9</title>
      <link>https://cgreinhold.dev/2024/06/06/creative-coding-experiments-9/</link>
      <guid>https://cgreinhold.dev/2024/06/06/creative-coding-experiments-9/</guid>
      <pubDate>Thu, 06 Jun 2024 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>Desta vez, uma das imagens que eu tinha salvo como inspiração é a capa do album Wings da banda BTS:</p><p><img src="/images/creative-coding/part-9/cc-1.png" alt="Álbum Wings da banda BTS"></p><p>Nessa imagem, quatro círculos são desenhados com diferentes estilos. A proposta não é desenvolver algo 100% fiel, mas que relembre essa capa.</p><p>O resultado foi o seguinte:</p><p><img src="/images/creative-coding/part-9/cc-2.png" alt="Reprodução da capa do álbum"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Começando pelo círculo do canto inferior direito, que é representado apenas como um círculo preto com gradiente, podemos iniciar o nosso canvas apenas desenhando um círculo na posição correta.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> diameter = <span class="number">150</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">450</span>, <span class="number">450</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">255</span>)</span><br><span class="line">  </span><br><span class="line">  drawGradientCircle(width / <span class="number">3</span> * <span class="number">2</span>, height / <span class="number">3</span> * <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawGradientCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  ellipse(x, y, diameter, diameter)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Com esse código inicial criamos um círculo na posição correta do canvas</p><p><img src="/images/creative-coding/part-9/cc-3.png" alt="Círculo no canvas"></p><p>Para gerar a sensação de gradiente, vamos simplesmente adicionar círculos menores na frente deste círculo, diminuindo a cor interna de cada um</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawGradientCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> h = <span class="number">0</span></span><br><span class="line">  noStroke()</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> r = diameter; r &gt; <span class="number">0</span>; --r) &#123;</span><br><span class="line">    fill(h);</span><br><span class="line">    ellipse(x, y, r, r);</span><br><span class="line">    h += <span class="number">0.6</span></span><br><span class="line">    y += <span class="number">0.2</span></span><br><span class="line">    x += <span class="number">0.1</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Resultando no nosso primeiro círculo completo:</p><p><img src="/images/creative-coding/part-9/cc-4.png" alt="Círculo com gradiente"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>O segundo círculo será o superior direito, com as listras. O desafio nesse círculo é que as listras fazem um ziguezague.</p><p>Para isso, vamos criar uma função que calcula um ponto no canvas com base em 1. um ponto inicial, 2. uma distancia do ponto inicial, e 3. o ângulo em que o novo ponto estará posicionado. Com isso, podemos criar uma forma de quatro pontos que se assemelha ao objetivo.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  drawLineCircle(width / <span class="number">3</span> * <span class="number">2</span>, height / <span class="number">3</span>)</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLineCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">8</span>)</span><br><span class="line">  </span><br><span class="line">  beginShape()</span><br><span class="line">  <span class="keyword">const</span> firstPoint = &#123; <span class="attr">x</span>: x - diameter/<span class="number">2</span>, y &#125;</span><br><span class="line">  vertex(firstPoint.x, firstPoint.y)</span><br><span class="line">  <span class="keyword">const</span> secondPoint = calculatePoint(firstPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">  vertex(secondPoint.x, secondPoint.y)</span><br><span class="line">  <span class="keyword">const</span> thirdPoint = calculatePoint(secondPoint, <span class="number">-20</span> * (PI/<span class="number">180</span>), <span class="number">140</span>)</span><br><span class="line">  vertex(thirdPoint.x, thirdPoint.y)</span><br><span class="line">  <span class="keyword">const</span> forthPoint = calculatePoint(thirdPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">  vertex(forthPoint.x, forthPoint.y)</span><br><span class="line">  endShape()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">calculatePoint</span>(<span class="params">initialPoint, angle, distance</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      x: initialPoint.x + distance * <span class="built_in">Math</span>.cos(angle),</span><br><span class="line">      y: initialPoint.y + distance * <span class="built_in">Math</span>.sin(angle)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-9/cc-5.png" alt="Ziguezague no canvas"></p><p>Na sequência, fazemos um loop para desenhar esse ziguezague algumas vezes no canvas</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLineCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">8</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> bufferY = y - <span class="number">100</span></span><br><span class="line">  <span class="keyword">let</span> bufferX = x - diameter/<span class="number">2</span> + <span class="number">10</span></span><br><span class="line">  <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">16</span>; i++) &#123;</span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">const</span> firstPoint = &#123; <span class="attr">x</span>: bufferX, <span class="attr">y</span>: bufferY &#125;</span><br><span class="line">    vertex(firstPoint.x, firstPoint.y)</span><br><span class="line">    <span class="keyword">const</span> secondPoint = calculatePoint(firstPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">    vertex(secondPoint.x, secondPoint.y)</span><br><span class="line">    <span class="keyword">const</span> thirdPoint = calculatePoint(secondPoint, <span class="number">-20</span> * (PI/<span class="number">180</span>), <span class="number">140</span>)</span><br><span class="line">    vertex(thirdPoint.x, thirdPoint.y)</span><br><span class="line">    <span class="keyword">const</span> forthPoint = calculatePoint(thirdPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">    vertex(forthPoint.x, forthPoint.y)</span><br><span class="line"></span><br><span class="line">    endShape()</span><br><span class="line">    bufferY += <span class="number">15</span></span><br><span class="line">    bufferX -= <span class="number">5</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-9/cc-6.png" alt="Vários ziguezagues no canvas"></p><p>E por fim, fazemos um <code>clip</code> no <code>drawingContext</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLineCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  fill(<span class="number">255</span>)</span><br><span class="line">  noStroke()</span><br><span class="line">  drawingContext.save()  </span><br><span class="line">  ellipse(x, y, diameter, diameter)</span><br><span class="line">  drawingContext.clip()</span><br><span class="line">  ...</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-9/cc-7.png" alt="Círculo com ziguezagues no canvas"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Para o primeiro círculo, utilizei <a href="https://thecodingtrain.com/challenges/36-blobby" target="_blank" rel="noopener">esse tutorial</a> do Coding Train. A explicação em vídeo é bastante clara, e o código final é disponibilizado para p5.js. O código para esse projeto ficou simplesmente assim:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  drawBlobCircle(width / <span class="number">3</span>, height / <span class="number">3</span>)</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawBlobCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  noStroke()</span><br><span class="line">  fill(<span class="number">10</span>)</span><br><span class="line">  beginShape();</span><br><span class="line">  <span class="keyword">let</span> xoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">let</span> yoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> a = <span class="number">0</span>; a &lt; TWO_PI; a += <span class="number">0.1</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> offset = map(noise(xoff, yoff), <span class="number">0</span>, <span class="number">1</span>, <span class="number">-25</span>, <span class="number">25</span>)</span><br><span class="line">    <span class="keyword">let</span> r = diameter / <span class="number">2</span> + offset</span><br><span class="line">    <span class="keyword">let</span> newX = r * cos(a)</span><br><span class="line">    <span class="keyword">let</span> newY = r * sin(a)</span><br><span class="line">    vertex(x + newX, y + newY)</span><br><span class="line">    xoff += <span class="number">0.03</span></span><br><span class="line">    yoff += <span class="number">0.01</span></span><br><span class="line">  &#125;</span><br><span class="line">  endShape()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-9/cc-8.png" alt="Cículo blob no canvas"></p><h2 id="Passo-4"><a href="#Passo-4" class="headerlink" title="Passo 4"></a>Passo 4</h2><p>Para o último círculo usaremos um algoritmo de <strong>pixel sorting</strong>. Vamos então criar uma lista e adicionar diversos pontos de cor aleatória (entre 0 e 150, ou preto e cinza). Para definir os pontos aleatórios vamos utilizar o algoritmo de <code>noise</code>, disponível no p5.js.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawPixelSortCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> areaPixels = []</span><br><span class="line">  <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; diameter; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; diameter; j++) &#123;</span><br><span class="line">      <span class="keyword">if</span> (!areaPixels[i]) areaPixels[i] = []</span><br><span class="line">      <span class="keyword">const</span> noiseX = <span class="number">0.05</span></span><br><span class="line">      <span class="keyword">const</span> noiseY = <span class="number">0.1</span></span><br><span class="line">      <span class="keyword">const</span> n = noise(noiseX + noiseX*i, noiseY + noiseY*j + <span class="number">5</span>)</span><br><span class="line">      <span class="keyword">const</span> c = map(n, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">150</span>)</span><br><span class="line">      areaPixels[i].push(round(c))</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  areaPixels.forEach(<span class="function">(<span class="params">column, ic</span>) =&gt;</span> &#123;</span><br><span class="line">    column.forEach(<span class="function">(<span class="params">p, ir</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> newX = x + ic - diameter / <span class="number">2</span></span><br><span class="line">      <span class="keyword">const</span> newY = y + ir - diameter / <span class="number">2</span></span><br><span class="line">      <span class="keyword">if</span> (dist(newX, newY, x, y) &lt; diameter/<span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">set</span>(newX, newY, p)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  updatePixels()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Com esse código estamos adicionando todos os pixels em colunas na área do tamanho do círculo, e posteriormente desenhando na tela apenas os pixels que estão dentro do raio do círculo.</p><p>O resultado disso fica assim:</p><p><img src="/images/creative-coding/part-9/cc-9.png" alt="Cículo com textura de nuvem"></p><p>Agora vamos ordenar os pixels por coluna. Não queremos ele 100% ordenado, então cada vez que a diferença de cor entre dois pixels for muito grande, eles não serão odernados, resultando num efeito semelhante ao qoue procuramos. O código fica mais ou menos assim:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawPixelSortCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> colorTreshold = <span class="number">60</span></span><br><span class="line">  areaPixels.forEach(<span class="function"><span class="params">column</span> =&gt;</span> &#123;</span><br><span class="line">    column.sort(<span class="function">(<span class="params">a,b</span>) =&gt;</span> abs(a-b) &lt; colorTreshold ? a - b : b - a)</span><br><span class="line">  &#125;)</span><br><span class="line">  </span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E esse é o resultado:</p><p><img src="/images/creative-coding/part-9/cc-10.png" alt="Resultado com todos os cículos"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>O resultado final não é exatamente igual a capa, e para tentar um resultado mais fiel poderiamos melhorar cada círculo com algoritmos que relembrem mais a capa original.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> diameter = <span class="number">150</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">450</span>, <span class="number">450</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">255</span>)</span><br><span class="line">  </span><br><span class="line">  drawBlobCircle(width / <span class="number">3</span>, height / <span class="number">3</span>)</span><br><span class="line">  drawGradientCircle(width / <span class="number">3</span> * <span class="number">2</span>, height / <span class="number">3</span> * <span class="number">2</span>)</span><br><span class="line">  drawPixelSortCircle(width / <span class="number">3</span>, height / <span class="number">3</span> * <span class="number">2</span>)</span><br><span class="line">  drawLineCircle(width / <span class="number">3</span> * <span class="number">2</span>, height / <span class="number">3</span>)</span><br><span class="line"></span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawGradientCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> h = <span class="number">0</span></span><br><span class="line">  noStroke()</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> r = diameter; r &gt; <span class="number">0</span>; --r) &#123;</span><br><span class="line">    fill(h);</span><br><span class="line">    ellipse(x, y, r, r);</span><br><span class="line">    h += <span class="number">0.6</span></span><br><span class="line">    y += <span class="number">0.2</span></span><br><span class="line">    x += <span class="number">0.1</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLineCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  fill(<span class="number">255</span>)</span><br><span class="line">  noStroke()</span><br><span class="line">  drawingContext.save()  </span><br><span class="line">  ellipse(x, y, diameter, diameter)</span><br><span class="line">  drawingContext.clip()</span><br><span class="line">  </span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">0</span>)</span><br><span class="line">  strokeWeight(<span class="number">8</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">let</span> bufferY = y - <span class="number">100</span></span><br><span class="line">  <span class="keyword">let</span> bufferX = x - diameter/<span class="number">2</span> + <span class="number">10</span></span><br><span class="line">  <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">16</span>; i++) &#123;</span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">const</span> firstPoint = &#123; <span class="attr">x</span>: bufferX, <span class="attr">y</span>: bufferY &#125;</span><br><span class="line">    vertex(firstPoint.x, firstPoint.y)</span><br><span class="line">    <span class="keyword">const</span> secondPoint = calculatePoint(firstPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">    vertex(secondPoint.x, secondPoint.y)</span><br><span class="line">    <span class="keyword">const</span> thirdPoint = calculatePoint(secondPoint, <span class="number">-20</span> * (PI/<span class="number">180</span>), <span class="number">140</span>)</span><br><span class="line">    vertex(thirdPoint.x, thirdPoint.y)</span><br><span class="line">    <span class="keyword">const</span> forthPoint = calculatePoint(thirdPoint, <span class="number">60</span> * (PI/<span class="number">180</span>), <span class="number">50</span>)</span><br><span class="line">    vertex(forthPoint.x, forthPoint.y)</span><br><span class="line"></span><br><span class="line">    endShape()</span><br><span class="line">    bufferY += <span class="number">15</span></span><br><span class="line">    bufferX -= <span class="number">5</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">calculatePoint</span>(<span class="params">initialPoint, angle, distance</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      x: initialPoint.x + distance * <span class="built_in">Math</span>.cos(angle),</span><br><span class="line">      y: initialPoint.y + distance * <span class="built_in">Math</span>.sin(angle)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawBlobCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  noStroke()</span><br><span class="line">  fill(<span class="number">10</span>)</span><br><span class="line">  beginShape();</span><br><span class="line">  <span class="keyword">let</span> xoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">let</span> yoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> a = <span class="number">0</span>; a &lt; TWO_PI; a += <span class="number">0.1</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> offset = map(noise(xoff, yoff), <span class="number">0</span>, <span class="number">1</span>, <span class="number">-25</span>, <span class="number">25</span>)</span><br><span class="line">    <span class="keyword">let</span> r = diameter / <span class="number">2</span> + offset</span><br><span class="line">    <span class="keyword">let</span> newX = r * cos(a)</span><br><span class="line">    <span class="keyword">let</span> newY = r * sin(a)</span><br><span class="line">    vertex(x + newX, y + newY)</span><br><span class="line">    xoff += <span class="number">0.03</span></span><br><span class="line">    yoff += <span class="number">0.01</span></span><br><span class="line">    <span class="comment">//ellipse(x, y, 4, 4);</span></span><br><span class="line">  &#125;</span><br><span class="line">  endShape();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawPixelSortCircle</span>(<span class="params">x, y</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> areaPixels = []</span><br><span class="line">  <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; diameter; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; diameter; j++) &#123;</span><br><span class="line">      <span class="keyword">if</span> (!areaPixels[i]) areaPixels[i] = []</span><br><span class="line">      <span class="keyword">const</span> noiseX = <span class="number">0.05</span></span><br><span class="line">      <span class="keyword">const</span> noiseY = <span class="number">0.1</span></span><br><span class="line">      <span class="keyword">const</span> n = noise(noiseX + noiseX*i, noiseY + noiseY*j + <span class="number">5</span>)</span><br><span class="line">      <span class="keyword">const</span> c = map(n, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">150</span>)</span><br><span class="line">      areaPixels[i].push(round(c))</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> colorTreshold = <span class="number">60</span></span><br><span class="line">  areaPixels.forEach(<span class="function"><span class="params">column</span> =&gt;</span> &#123;</span><br><span class="line">    column.sort(<span class="function">(<span class="params">a,b</span>) =&gt;</span> abs(a-b) &lt; colorTreshold ? a - b : b - a)</span><br><span class="line">  &#125;)</span><br><span class="line">  </span><br><span class="line">  areaPixels.forEach(<span class="function">(<span class="params">column, ic</span>) =&gt;</span> &#123;</span><br><span class="line">    column.forEach(<span class="function">(<span class="params">p, ir</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> newX = x + ic - diameter / <span class="number">2</span></span><br><span class="line">      <span class="keyword">const</span> newY = y + ir - diameter / <span class="number">2</span></span><br><span class="line">      <span class="keyword">if</span> (dist(newX, newY, x, y) &lt; diameter/<span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">set</span>(newX, newY, p)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  updatePixels()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2024/06/06/creative-coding-experiments-9/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Dithering - Experimentos em Programação Criativa - 8</title>
      <link>https://cgreinhold.dev/2023/11/29/creative-coding-experiments-8/</link>
      <guid>https://cgreinhold.dev/2023/11/29/creative-coding-experiments-8/</guid>
      <pubDate>Wed, 29 Nov 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>Desta vez, uma das imagens que eu tinha salvo como inspiração é a seguinte:</p><p><img src="/images/creative-coding/part-8/cc-1.png" alt="Gradiente pixelado"></p><p>Por mais que pareça usar um algoritmo diferente, decidi usar ela como inspiração para aprender a implementar algoritmos de dithering. Dithering é uma forma de ruído, usado para “melhorar” a qualidade de imagens quando utilizando uma quantidade limitada de cores. Em nosso exemplo, usaremos apenas preto e branco.</p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação, usando como inspiração <a href="https://surma.dev/things/ditherpunk/" target="_blank" rel="noopener">esse artigo</a> e <a href="https://github.com/meemoo/meemooapp/blob/main/src/nodes/image-monochrome-worker.js" target="_blank" rel="noopener">essa implementação</a>, também em Javascript.</p><p>O artigo consegue explicar muito melhor como cada artigo funciona, então aqui descreverei apenas como fiz para representar o mesmo usando o editor do p5 e também usar como referência caso eu pretenda usálo em outros projetos.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Ao invés de usar um simples gradiente, camos usar a própria câmera do laptop como input para o nosso algoritmo. Isso pode ser feito facilmente com p5 da seguinte forma:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> capture;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">600</span>, <span class="number">450</span>);</span><br><span class="line">  capture = createCapture(VIDEO);</span><br><span class="line">  capture.hide()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>);</span><br><span class="line">  image(capture, <span class="number">0</span>, <span class="number">0</span>, width, height);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Com esse código exebimos no canvas a imagem da câmera</p><p><img src="/images/creative-coding/part-8/cc-2.png" alt="Imagem da câmera"></p><p>Fazendo um loop nos pixels da imagem podemos calcular qual o valor médio de cor em cada pixel e atribuir 0 (preto) ou 255 (branco) para o pixel, fazendo assim a imagem monocromática.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  applyMonochrome();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyMonochrome</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; <span class="number">129</span> ? <span class="number">0</span> : <span class="number">255</span></span><br><span class="line">    pixels[i] = c;</span><br><span class="line">    pixels[i + <span class="number">1</span>] = c;</span><br><span class="line">    pixels[i + <span class="number">2</span>] = c;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-8/cc-3.png" alt="Imagem monocromática"></p><p>Interessante notar que a lista the <code>pixels</code> gerada pelo p5 contem 4 itens para cada pixel, respectivamente os canais RGBA. Por isso precisamos atualizar os três primeiros para que a cor seja definida.</p><p>Para testarmos diferentes níveis de limear, podemos usar também um slider.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> slider;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ... </span><br><span class="line"></span><br><span class="line">  slider = createSlider(<span class="number">0</span>, <span class="number">255</span>, <span class="number">129</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyMonochrome</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span></span><br><span class="line">  ... </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>O segundo algoritmo que implementaremos será o de Floyd-Steinberg, que utiliza uma matriz de difusão para distribuição de erro aos pixels vizinhos.</p><p>O algoritmo final fica desta forma</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyFloydSteiberg</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> err = <span class="built_in">Math</span>.floor((blackAndWhite - c) / <span class="number">16</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; <span class="number">3</span>; j++) &#123;</span><br><span class="line">      pixels[i + j] = c;</span><br><span class="line">      pixels[i + j + <span class="number">4</span>] += err * <span class="number">7</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width - <span class="number">4</span>] += err * <span class="number">3</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width] += err * <span class="number">5</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width + <span class="number">4</span>] += err * <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-8/cc-4.png" alt="Imagem com filtro Floyd-Steiberg"></p><p>A imagem aparenta até ter tons de cinza, mas olhando próximo é possível perceber que são pixeis pretos e brancos intercalados.</p><p>Para facilitar o teste, podemos adicionar radio buttons para alternar entre os métodos.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> radio;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  radio = createRadio();</span><br><span class="line">  radio.option(<span class="string">'monochrome'</span>);</span><br><span class="line">  radio.option(<span class="string">'Floyd-Steinberg'</span>);</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">switch</span>(radio.value()) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">'monochrome'</span>: &#123;</span><br><span class="line">      applyMonochrome();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">'Floyd-Steinberg'</span>: &#123;</span><br><span class="line">      applyFloydSteiberg();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h1><p>Sem muitas explicações, os seguintes algoritmos são o de Bill Atkinson e Bayer</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyBillAttkinson</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> err = <span class="built_in">Math</span>.floor((blackAndWhite - c) / <span class="number">8</span>);</span><br><span class="line">   </span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; <span class="number">3</span>; j++) &#123;</span><br><span class="line">      pixels[i + j]= c;</span><br><span class="line">      pixels[i + j + <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">8</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width - <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width + <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">8</span> * width] += err;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyBayer</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> bayerThresholdMap = [</span><br><span class="line">    [  <span class="number">15</span>, <span class="number">135</span>,  <span class="number">45</span>, <span class="number">165</span> ],</span><br><span class="line">    [ <span class="number">195</span>,  <span class="number">75</span>, <span class="number">225</span>, <span class="number">105</span> ],</span><br><span class="line">    [  <span class="number">60</span>, <span class="number">180</span>,  <span class="number">30</span>, <span class="number">150</span> ],</span><br><span class="line">    [ <span class="number">240</span>, <span class="number">120</span>, <span class="number">210</span>,  <span class="number">90</span> ]</span><br><span class="line">  ];</span><br><span class="line"></span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> x = i/<span class="number">4</span> % width;</span><br><span class="line">    <span class="keyword">const</span> y = <span class="built_in">Math</span>.floor(i/<span class="number">4</span> / width);</span><br><span class="line">    <span class="keyword">const</span> mapped = <span class="built_in">Math</span>.floor( (blackAndWhite + bayerThresholdMap[x%<span class="number">4</span>][y%<span class="number">4</span>]) / <span class="number">2</span> );</span><br><span class="line">    <span class="keyword">const</span> c = (mapped &lt; slider.value()) ? <span class="number">0</span> : <span class="number">255</span>;</span><br><span class="line">    </span><br><span class="line">    pixels[i] = c;</span><br><span class="line">    pixels[i + <span class="number">1</span>] = c;</span><br><span class="line">    pixels[i + <span class="number">2</span>] = c;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-8/cc-5.png" alt="Imagem com filtro de Bill Atkinson"></p><p><img src="/images/creative-coding/part-8/cc-6.png" alt="Imagem com filtro Bayer"></p><h2 id="Proximos-Passos"><a href="#Proximos-Passos" class="headerlink" title="Próximos Passos"></a>Próximos Passos</h2><p>Esses não são os únicos. Outros algoritmos de dithering também podem ser aplicados. A ideia de próximo passos é implementar novos algoritmos e talvez pensar em quais peojetos seria divertido aplicá-los.</p><p>O código completo está abaixo e é uma forma rápida de começar a testar e brincar com esses filtros.</p><details>  <summary>    Código completo  </summary>  <p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> capture;</span><br><span class="line"><span class="keyword">let</span> slider;</span><br><span class="line"><span class="keyword">let</span> radio;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">600</span>, <span class="number">450</span>);</span><br><span class="line">  capture = createCapture(VIDEO);</span><br><span class="line">  capture.hide();</span><br><span class="line">  </span><br><span class="line">  radio = createRadio();</span><br><span class="line">  radio.option(<span class="string">'monochrome'</span>);</span><br><span class="line">  radio.option(<span class="string">'Floyd-Steinberg'</span>);</span><br><span class="line">  radio.option(<span class="string">'Bill Atkinson'</span>);</span><br><span class="line">  radio.option(<span class="string">'Bayer'</span>);</span><br><span class="line"></span><br><span class="line">  slider = createSlider(<span class="number">0</span>, <span class="number">255</span>, <span class="number">129</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>);</span><br><span class="line">  image(capture, <span class="number">0</span>, <span class="number">0</span>, width, height);</span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">  <span class="keyword">switch</span>(radio.value()) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">'monochrome'</span>: &#123;</span><br><span class="line">      applyMonochrome();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125; </span><br><span class="line">    <span class="keyword">case</span> <span class="string">'Floyd-Steinberg'</span>: &#123;</span><br><span class="line">      applyFloydSteiberg();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">'Bill Atkinson'</span>: &#123;</span><br><span class="line">      applyBillAttkinson();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">'Bayer'</span>: &#123;</span><br><span class="line">      applyBayer();</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyMonochrome</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span></span><br><span class="line">    pixels[i] = c;</span><br><span class="line">    pixels[i + <span class="number">1</span>] = c;</span><br><span class="line">    pixels[i + <span class="number">2</span>] = c;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyFloydSteiberg</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> err = <span class="built_in">Math</span>.floor((blackAndWhite - c) / <span class="number">16</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; <span class="number">3</span>; j++) &#123;</span><br><span class="line">      pixels[i + j] = c;</span><br><span class="line">      pixels[i + j + <span class="number">4</span>] += err * <span class="number">7</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width - <span class="number">4</span>] += err * <span class="number">3</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width] += err * <span class="number">5</span>;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width + <span class="number">4</span>] += err * <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyBillAttkinson</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    <span class="keyword">const</span> c = blackAndWhite &lt; slider.value() ? <span class="number">0</span> : <span class="number">255</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> err = <span class="built_in">Math</span>.floor((blackAndWhite - c) / <span class="number">8</span>);</span><br><span class="line">   </span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; <span class="number">3</span>; j++) &#123;</span><br><span class="line">      pixels[i + j]= c;</span><br><span class="line">      pixels[i + j + <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">8</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width - <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width] += err;</span><br><span class="line">      pixels[i + j + <span class="number">4</span> * width + <span class="number">4</span>] += err;</span><br><span class="line">      pixels[i + j + <span class="number">8</span> * width] += err;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyBayer</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> bayerThresholdMap = [</span><br><span class="line">    [  <span class="number">15</span>, <span class="number">135</span>,  <span class="number">45</span>, <span class="number">165</span> ],</span><br><span class="line">    [ <span class="number">195</span>,  <span class="number">75</span>, <span class="number">225</span>, <span class="number">105</span> ],</span><br><span class="line">    [  <span class="number">60</span>, <span class="number">180</span>,  <span class="number">30</span>, <span class="number">150</span> ],</span><br><span class="line">    [ <span class="number">240</span>, <span class="number">120</span>, <span class="number">210</span>,  <span class="number">90</span> ]</span><br><span class="line">  ];</span><br><span class="line"></span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> blackAndWhite = <span class="built_in">Math</span>.floor((pixels[i] + pixels[i + <span class="number">1</span>] + pixels[i + <span class="number">2</span>]) / <span class="number">3</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> x = i/<span class="number">4</span> % width;</span><br><span class="line">    <span class="keyword">const</span> y = <span class="built_in">Math</span>.floor(i/<span class="number">4</span> / width);</span><br><span class="line">    <span class="keyword">const</span> mapped = <span class="built_in">Math</span>.floor( (blackAndWhite + bayerThresholdMap[x%<span class="number">4</span>][y%<span class="number">4</span>]) / <span class="number">2</span> );</span><br><span class="line">    <span class="keyword">const</span> c = (mapped &lt; slider.value()) ? <span class="number">0</span> : <span class="number">255</span>;</span><br><span class="line">    </span><br><span class="line">    pixels[i] = c;</span><br><span class="line">    pixels[i + <span class="number">1</span>] = c;</span><br><span class="line">    pixels[i + <span class="number">2</span>] = c;</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/11/29/creative-coding-experiments-8/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Skate - Experimentos em Programação Criativa - 7</title>
      <link>https://cgreinhold.dev/2023/11/03/creative-coding-experiments-7/</link>
      <guid>https://cgreinhold.dev/2023/11/03/creative-coding-experiments-7/</guid>
      <pubDate>Fri, 03 Nov 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa. Como nas últimas vezes, o objetivo dessa tentativa é de utilizar uma inspiração para aprender técnicas e conceitos novos. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que usarei como inspiração desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-7/cc-1.png" alt="Skate com linhas"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-7/cc-2.png" alt="Linhas"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação, dessa vez com a modalidade WEBGL.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Desta vez, achei que seria mais fácil alcançar o resultado utilizando WEBGL, criando cada elemento da tela de forma 3D, facilitando assim o posicionamento de cada um em frente do outro.</p><p>Utilizar WEBGL com o p5js é bastante simples, bastando adicionar um novo parâmetro para função de criação do canvas <code>createCanvas(400, 400, WEBGL)</code>. Criar um cubo pode ser feito de forma simples:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>, WEBGL)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line"></span><br><span class="line">  <span class="comment">// As funções de rotação serão apenas para debug, mas não serão necessárias para esse código</span></span><br><span class="line">  rotateX(frameCount * <span class="number">0.01</span>)</span><br><span class="line">  rotateY(frameCount * <span class="number">0.01</span>)</span><br><span class="line"></span><br><span class="line">  box(<span class="number">50</span>, <span class="number">50</span>, <span class="number">50</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-3.png" alt="Cubo rotacionado"></p><p>Para o resultado final não usaremos as funções <code>rotateX</code> e <code>rotateY</code>, mas durante a implementação usarei em alguns momentos para depurar a posição de cada elemento da tela.</p><p>Um conceito interessante de notar, é que todos os elementos 3D adicionados em tela são posicionados no centro da tela. Portanto, quando quisermos mudar a posição de algum elemento, devemos usar as funções de transformação, como <code>translate</code> e <code>rotate</code>. </p><p>Para o resultado que estamos buscando, usaremos vários paralelepípedos posicionados lado a lado. Para isso, podemos criar um loop que adicionará os elementos e fazer um translate após isso.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> LINES_COUNT = <span class="number">26</span></span><br><span class="line"><span class="keyword">const</span> LINE_WIDTH = <span class="number">10</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>, WEBGL)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line"></span><br><span class="line">  <span class="comment">// As funções de rotação serão apenas para debug, mas não serão necessárias para esse código</span></span><br><span class="line">  rotateX(frameCount * <span class="number">0.01</span>)</span><br><span class="line">  rotateY(frameCount * <span class="number">0.01</span>)</span><br><span class="line"></span><br><span class="line">  push()</span><br><span class="line">  translate(LINES_COUNT / <span class="number">2</span> * LINE_WIDTH * <span class="number">-1</span>, <span class="number">0</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; LINES_COUNT; i++) &#123;</span><br><span class="line">    box(LINE_WIDTH, <span class="number">300</span>, <span class="number">5</span>)</span><br><span class="line">    translate(LINE_WIDTH, <span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  pop()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-4.png" alt="Paralelepípedos rotacionados"></p><p>Com esse resultado sem rotação:</p><p><img src="/images/creative-coding/part-7/cc-5.png" alt="Paralelepípedos paralelos"></p><p>Transladando o eixo Z, fazemos com que cada paralelepípedo fique em posições diferentes, por onde as linhas horizontais passarão nas próximas etapas. Decidi fazer a translação duas vezes, voltando para a origem no eixo Z, para que usarmos 3 níveis diferentes (gerados de forma aleatória).</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  push()</span><br><span class="line">  translate(LINES_COUNT / <span class="number">2</span> * LINE_WIDTH * <span class="number">-1</span>, <span class="number">0</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; LINES_COUNT; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">0</span>, zIndex)</span><br><span class="line">    box(LINE_WIDTH, <span class="number">300</span>, <span class="number">5</span>)</span><br><span class="line">    translate(LINE_WIDTH, <span class="number">0</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">  pop()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-6.png" alt="Paralelepípedos paralelos"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Antes de adicionar os paralelepípedos horizontais, vamos ajustar algumas outras coisas no código até agora. Primeiro, podemos adicionar cores. </p><p>O p5 permite várias configurações de <a href="https://p5js.org/reference/#group-3D" target="_blank" rel="noopener">luzes e materiais</a>. Para o nosso caso, usaremos o <code>emissiveMaterial()</code>, que é usado para definir uma cor com sua força total, ignorando qualquer configuração de luz. Essa função deve ser chamada antes de renderizar algum elemento na tela, com a cor desejada.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  push()</span><br><span class="line">  translate(LINES_COUNT / <span class="number">2</span> * LINE_WIDTH * <span class="number">-1</span>, <span class="number">0</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; LINES_COUNT; i++) &#123;</span><br><span class="line">    emissiveMaterial(random(<span class="number">100</span>,<span class="number">255</span>), random(<span class="number">100</span>,<span class="number">255</span>), random(<span class="number">100</span>,<span class="number">255</span>))</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">0</span>, zIndex)</span><br><span class="line">    box(LINE_WIDTH, <span class="number">300</span>, <span class="number">5</span>)</span><br><span class="line">    translate(LINE_WIDTH, <span class="number">0</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">  pop()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-7.png" alt="Paralelepípedos coloridos paralelos"></p><p>Além disso, usamos o <code>noStroke()</code> para remover as bordas.</p><p><img src="/images/creative-coding/part-7/cc-8.png" alt="Paralelepípedos coloridos paralelos"></p><p>Por fim, precisamos ajustar a camera para o modo ortogonal. Com isso, todos os objetos de mesmas dimensões terão o mesmo tamanho, independetemente da distância até a câmera. Com isso, o resultado ficará bem mais parecido com o que buscamos.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>, WEBGL)</span><br><span class="line">  ortho(-width / <span class="number">2</span>, width / <span class="number">2</span>, height / <span class="number">2</span>, -height / <span class="number">2</span>, <span class="number">0</span>, <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-9.png" alt="Paralelepípedos coloridos ortogonais paralelos"></p><p>Por mais que não pareça, se rotacionarmos o canvas conseguímos ver que o eixo Z ainda está diferente para cada elemento.</p><p><img src="/images/creative-coding/part-7/cc-10.png" alt="Paralelepípedos coloridos ortogonais paralelos"></p><h2 id="Parte-3"><a href="#Parte-3" class="headerlink" title="Parte 3"></a>Parte 3</h2><p>A última etapa será adicionar as linhas horizontais que atravessam as verticais. Isso pode ser feito com um loop semelhante ao anterior, apenas invertendo o desenho do cubo para horizontal, e definindo a cor padrão como preto.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  emissiveMaterial(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  translate(<span class="number">-5</span>, <span class="number">-165</span>, <span class="number">5</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">30</span>, zIndex)</span><br><span class="line">    box(<span class="number">300</span>, LINE_WIDTH, <span class="number">5</span>)</span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">0</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-11.png" alt="Paralelepípedos coloridos ortogonais paralelos"></p><p>Como estamos adicionando os elementos aleatoriamente no eixo Z, conseguimos ver as faixas horizontais passando em frente e atrás das verticais.</p><p>Por fim adicionamos algumas faixas verticais para conectar as horizontais, e o resultado está pronto.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">30</span>, zIndex)</span><br><span class="line">    box(<span class="number">300</span>, LINE_WIDTH, <span class="number">5</span>)</span><br><span class="line">    <span class="keyword">if</span> (i === <span class="number">9</span>) <span class="keyword">break</span></span><br><span class="line">    translate(i % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">145</span> : <span class="number">-145</span>, <span class="number">15</span>, <span class="number">0</span>)</span><br><span class="line">    box(LINE_WIDTH, <span class="number">30</span>, <span class="number">5</span>)</span><br><span class="line">    translate(i % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">-145</span> : <span class="number">145</span>, <span class="number">-15</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-7/cc-12.png" alt="Paralelepípedos coloridos ortogonais paralelos"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Algumas ideias para um próximo passo seria brincar com o tamanho e larguras das faixas, além de alterar mais as formas como o eixo Z é trabalhado, tentando alcançar algo mais entrelaçado.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> LINES_COUNT = <span class="number">26</span></span><br><span class="line"><span class="keyword">const</span> LINE_WIDTH = <span class="number">10</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>, WEBGL)</span><br><span class="line">  ortho(-width / <span class="number">2</span>, width / <span class="number">2</span>, height / <span class="number">2</span>, -height / <span class="number">2</span>, <span class="number">0</span>, <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  </span><br><span class="line">  noLoop()</span><br><span class="line">  noStroke()</span><br><span class="line"></span><br><span class="line">  push()</span><br><span class="line">  translate(LINES_COUNT / <span class="number">2</span> * LINE_WIDTH * <span class="number">-1</span>, <span class="number">0</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; LINES_COUNT; i++) &#123;</span><br><span class="line">    emissiveMaterial(random(<span class="number">100</span>,<span class="number">255</span>), random(<span class="number">100</span>,<span class="number">255</span>), random(<span class="number">100</span>,<span class="number">255</span>))</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">0</span>, zIndex)</span><br><span class="line">    box(LINE_WIDTH, <span class="number">300</span>, <span class="number">5</span>)</span><br><span class="line">    translate(LINE_WIDTH, <span class="number">0</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">  pop()</span><br><span class="line">  </span><br><span class="line">  emissiveMaterial(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  translate(<span class="number">-5</span>, <span class="number">-165</span>, <span class="number">5</span>)</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> zIndex = int(random(<span class="number">1</span>, <span class="number">4</span>)) * <span class="number">10</span></span><br><span class="line">    translate(<span class="number">0</span>, <span class="number">30</span>, zIndex)</span><br><span class="line">    box(<span class="number">300</span>, LINE_WIDTH, <span class="number">5</span>)</span><br><span class="line">    <span class="keyword">if</span> (i === <span class="number">9</span>) <span class="keyword">break</span></span><br><span class="line">    translate(i % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">145</span> : <span class="number">-145</span>, <span class="number">15</span>, <span class="number">0</span>)</span><br><span class="line">    box(LINE_WIDTH, <span class="number">30</span>, <span class="number">5</span>)</span><br><span class="line">    translate(i % <span class="number">2</span> === <span class="number">0</span> ? <span class="number">-145</span> : <span class="number">145</span>, <span class="number">-15</span>, -zIndex)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/11/03/creative-coding-experiments-7/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Diretório de bibliotecas para computação criativa</title>
      <link>https://cgreinhold.dev/2023/10/29/creative-coding-directory/</link>
      <guid>https://cgreinhold.dev/2023/10/29/creative-coding-directory/</guid>
      <pubDate>Sun, 29 Oct 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Esta página é um diretório de bibliotecas, linguagens e ferramentas que podem ser usadas para computação criativa. A principal motivação 
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Esta página é um diretório de bibliotecas, linguagens e ferramentas que podem ser usadas para computação criativa. A principal motivação para eu manter esse diretório, é a de salvar materiais de ensino e poder usar como inspiração para quando quiser construir ou praticar algo novo.</p><h2 id="1-p5-js"><a href="#1-p5-js" class="headerlink" title="1. p5.js"></a>1. p5.js</h2><p>O <a href="https://p5js.org/" target="_blank" rel="noopener">p5.js</a> é a biblioteca que eu mais tenho usado nessa lista. É uma biblioteca JavaScript que facilita a criação de animações e visuais interativos e criativos. É frequentemente usado para projetos artísticos, arte generativa e fins educacionais.</p><h3 id="Referencias"><a href="#Referencias" class="headerlink" title="Referências"></a>Referências</h3><ul><li><a href="https://p5js.org/reference/" target="_blank" rel="noopener">Página oficial da biblioteca com referências</a></li><li><a href="https://thecodingtrain.com/challenges" target="_blank" rel="noopener">Coding Train</a></li><li><a href="https://www.youtube.com/watch?v=X_ocxmXeczk" target="_blank" rel="noopener">Dave</a></li></ul><h2 id="2-three-js"><a href="#2-three-js" class="headerlink" title="2. three.js"></a>2. three.js</h2><p>O <a href="https://threejs.org/" target="_blank" rel="noopener">three.js</a> é uma biblioteca gráfica 3D popular para JavaScript. Ele permite que os desenvolvedores criem visualizações e jogos 3D impressionantes no navegador, tornando-o uma escolha ideal para projetos 3D baseados na web.</p><h3 id="Referencias-1"><a href="#Referencias-1" class="headerlink" title="Referências"></a>Referências</h3><ul><li><a href="https://threejs.org/examples/?q=pixel" target="_blank" rel="noopener">Exemplo de códigos usando pixel art</a></li><li><a href="https://github.com/pmndrs/react-three-fiber" target="_blank" rel="noopener">React Three Fiber</a>, utilizado para construir projetos com three.js em react</li></ul><h2 id="3-Sonic-Pi"><a href="#3-Sonic-Pi" class="headerlink" title="3. Sonic Pi"></a>3. Sonic Pi</h2><p>O <a href="https://sonic-pi.net/" target="_blank" rel="noopener">Sonic Pi</a> é um sintetizador de música com codificação ao vivo. Ele foi escrito em Ruby e projetado para criação e experimentação musical em tempo real, tornando-o uma ferramenta única para codificação criativa baseada em áudio.</p><h2 id="4-ShaderToy"><a href="#4-ShaderToy" class="headerlink" title="4. ShaderToy"></a>4. ShaderToy</h2><p>O <a href="https://www.shadertoy.com/" target="_blank" rel="noopener">ShaderToy</a> é uma plataforma para criar e compartilhar shaders em tempo real. Ele usa principalmente GLSL para escrever shaders, permitindo que artistas e desenvolvedores criem efeitos visuais e animações impressionantes.</p><h3 id="Referencias-2"><a href="#Referencias-2" class="headerlink" title="Referências"></a>Referências</h3><ul><li><a href="https://thebookofshaders.com/" target="_blank" rel="noopener">The Book of Shaders</a></li></ul><h2 id="5-pico-8"><a href="#5-pico-8" class="headerlink" title="5. pico-8"></a>5. pico-8</h2><p>O <a href="https://www.lexaloffle.com/pico-8.php" target="_blank" rel="noopener">pico-8</a> é um console retrô para criar, compartilhar e jogar pequenos jogos e gráficos interativos. Ele é construído em torno da linguagem de programação Lua e incentiva o desenvolvimento de pequenos jogos de inspiração retro.</p><h3 id="Referencias-3"><a href="#Referencias-3" class="headerlink" title="Referências"></a>Referências</h3><p><img src="/images/pico8/pico8-1.gif" alt="Pico-8 vídeo 1"><br><img src="/images/pico8/pico8-2.gif" alt="Pico-8 vídeo 2"><br><img src="/images/pico8/pico8-3.gif" alt="Pico-8 vídeo 3"><br><img src="/images/pico8/pico8-4.gif" alt="Pico-8 vídeo 4"><br><img src="/images/pico8/pico8-5.gif" alt="Pico-8 vídeo 5"><br><img src="/images/pico8/pico8-6.gif" alt="Pico-8 vídeo 6"><br><img src="/images/pico8/pico8-7.gif" alt="Pico-8 vídeo 7"><br><img src="/images/pico8/pico8-8.gif" alt="Pico-8 vídeo 8"><br><img src="/images/pico8/pico8-9.gif" alt="Pico-8 vídeo 9"><br><img src="/images/pico8/pico8-10.gif" alt="Pico-8 vídeo 10"></p><h2 id="6-ORCA"><a href="#6-ORCA" class="headerlink" title="6. ORCA"></a>6. ORCA</h2><p><a href="https://hundredrabbits.github.io/Orca/" target="_blank" rel="noopener">ORCA</a> é uma linguagem de programação visual para música e recursos visuais de codificação ao vivo. Seu código é compilado para WebAssembly, permitindo codificação criativa em tempo real com foco na composição algorítmica e recursos visuais generativos.</p><h3 id="Referencias-4"><a href="#Referencias-4" class="headerlink" title="Referências"></a>Referências</h3><ul><li><a href="https://metasyn.srht.site/learn-orca/" target="_blank" rel="noopener">Learn ORCA</a></li></ul><h2 id="7-paper-js"><a href="#7-paper-js" class="headerlink" title="7. paper.js"></a>7. paper.js</h2><p>O <a href="http://paperjs.org/" target="_blank" rel="noopener">paper.js</a> é uma biblioteca de gráficos vetoriais para a web. Ele simplifica a criação de gráficos vetoriais complexos e animações interativas no navegador, tornando-o ideal para arte baseada na Web e visualização de dados.</p><h2 id="8-handsfree-js"><a href="#8-handsfree-js" class="headerlink" title="8. handsfree.js"></a>8. handsfree.js</h2><p>O <a href="https://handsfreejs.netlify.app/" target="_blank" rel="noopener">handsfree.js</a> é uma biblioteca JavaScript para criar interações mãos-livres com aplicativos da web. Ele usa visão computacional e aprendizado de máquina para permitir o controle baseado em gestos de projetos de codificação criativos e aplicativos da web interativos.</p><h2 id="9-Zdog-js"><a href="#9-Zdog-js" class="headerlink" title="9. Zdog js"></a>9. Zdog js</h2><p>O <a href="https://zzz.dog/" target="_blank" rel="noopener">Zdog.js</a> é uma biblioteca de modelagem e animação pseudo-3D para a web. Ele permite a criação de gráficos 3D simples e estilizados com foco na facilidade de uso, tornando-o uma ótima opção para arte 3D baseada na web.</p><h2 id="10-Hydra"><a href="#10-Hydra" class="headerlink" title="10. Hydra"></a>10. Hydra</h2><p>O <a href="https://hydra.ojack.xyz/" target="_blank" rel="noopener">Hydra</a> é uma plataforma para codificação visual ao vivo no navegador. É baseado em JavaScript e é conhecido por seus recursos de shader e manipulação gráfica em tempo real, tornando-o uma escolha popular para performances ao vivo e instalações de arte interativas.</p><h2 id="11-Pure-Data"><a href="#11-Pure-Data" class="headerlink" title="11. Pure Data"></a>11. Pure Data</h2><p>O <a href="https://puredata.info/" target="_blank" rel="noopener">Pure Data</a> é uma linguagem de programação visual para áudio e multimídia em tempo real. É utilizado para a criação de instalações audiovisuais interativas, composição musical e síntese sonora.</p><h2 id="12-ml5-js"><a href="#12-ml5-js" class="headerlink" title="12. ml5.js"></a>12. ml5.js</h2><p>O <a href="https://ml5js.org/" target="_blank" rel="noopener">ml5.js</a> é uma biblioteca de aprendizado de máquina para projetos de codificação criativos. Ele simplifica a integração de modelos de aprendizado de máquina em aplicativos JavaScript, permitindo criações visuais e de áudio interativas e baseadas em IA.</p><h2 id="13-pts-js"><a href="#13-pts-js" class="headerlink" title="13. pts.js"></a>13. pts.js</h2><p>O <a href="https://ptsjs.org/" target="_blank" rel="noopener">pts.js</a> é uma biblioteca leve de gráficos vetoriais 2D para JavaScript. É usado para criar visuais dinâmicos e expressivos, geralmente para visualização de dados, arte generativa e aplicações web interativas.</p><h2 id="15-Oimo-js"><a href="#15-Oimo-js" class="headerlink" title="15. Oimo.js"></a>15. Oimo.js</h2><p>O <a href="https://github.com/lo-th/Oimo.js/" target="_blank" rel="noopener">Oimo.js</a> é um mecanismo de física para a web. Ele permite a simulação realista da física em jogos baseados na web, simulações e experiências interativas em 3D.</p><h2 id="16-Theater-js-https-github-com-ariaminaei-theatre"><a href="#16-Theater-js-https-github-com-ariaminaei-theatre" class="headerlink" title="16. Theater.js https://github.com/ariaminaei/theatre"></a>16. Theater.js <a href="https://github.com/ariaminaei/theatre" target="_blank" rel="noopener">https://github.com/ariaminaei/theatre</a></h2><p>O <a href="https://github.com/theatre-js/theatre" target="_blank" rel="noopener">Theatre.js</a> é uma estrutura JavaScript para codificação criativa que se concentra na criação de narrativas interativas e narrativas visuais no navegador. É frequentemente usado para contar histórias baseadas na web e experiências imersivas.</p><h2 id="17-tixy-land"><a href="#17-tixy-land" class="headerlink" title="17. tixy.land"></a>17. tixy.land</h2><p><a href="https://tixy.land/" target="_blank" rel="noopener">tixy.land</a> é uma plataforma online para codificação criativa usando a linguagem Tixy. Tixy é uma linguagem minimalista projetada para criar código artístico pequeno, conciso e visualmente atraente.</p><h2 id="18-Electron"><a href="#18-Electron" class="headerlink" title="18. Electron"></a>18. Electron</h2><p>O <a href="https://www.electronjs.org/" target="_blank" rel="noopener">Electron</a> é uma estrutura para construção de aplicativos de desktop multiplataforma usando tecnologias da web como HTML, CSS e JavaScript. É uma interessante alternativa para criar projetos que utilizam das interfaces gráficas do sistema operacional de formas criativas.</p><h2 id="19-Thixels"><a href="#19-Thixels" class="headerlink" title="19. Thixels"></a>19. Thixels</h2><p>O <a href="https://thixels.live/" target="_blank" rel="noopener">Thixels</a> é uma plataforma interessante para live-coding.</p><h2 id="20-ASCII-play"><a href="#20-ASCII-play" class="headerlink" title="20. ASCII play"></a>20. ASCII play</h2><p><a href="https://play.ertdfgcvb.xyz/#/" target="_blank" rel="noopener">ASCII Play</a> é um playground para criação de animações em ASCII.</p><h2 id="23-matter-js"><a href="#23-matter-js" class="headerlink" title="23. matter.js"></a>23. matter.js</h2><p>O <a href="https://brm.io/matter-js/" target="_blank" rel="noopener">Matter.js</a> é um mecanismo de física 2D para a web, escrito em JavaScript. É usado principalmente para simular física realista e colisões em aplicativos interativos da web, jogos, simulações e projetos de arte interativos.</p>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/10/29/creative-coding-directory/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Campo de Fluxo - Experimentos em Programação Criativa - 6</title>
      <link>https://cgreinhold.dev/2023/09/21/creative-coding-experiments-6/</link>
      <guid>https://cgreinhold.dev/2023/09/21/creative-coding-experiments-6/</guid>
      <pubDate>Thu, 21 Sep 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo.
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que tentei replicar através de código desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-6/cc-1.png" alt="Linhas rotacionadas em um fluxo direcional dentro de um círculo"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-6/cc-2.png" alt="Linhas rotacionadas em um fluxo direcional dentro de um círculo de forma parecida"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Seguindo a mesma onde do artigo anterior, utilizei como base o código do Daniel Shiffman ensinado <a href="https://thecodingtrain.com/challenges/24-perlin-noise-flow-field" target="_blank" rel="noopener">neste vídeo</a>. No vídeo, um algoritmo para <em>flow fields</em> é ensinado, e essa é a principal parte necessária para o resultado final.</p><p>Seguindo o tutorial, conseguimos o seguinte código como base para o nosso projeto:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> inc = <span class="number">0.02</span></span><br><span class="line"><span class="keyword">const</span> scl = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> cols, rows</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">600</span>, <span class="number">600</span>)</span><br><span class="line">  cols = floor(width / scl)</span><br><span class="line">  rows = floor(height / scl)</span><br><span class="line">  </span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noStroke()</span><br><span class="line">  <span class="keyword">let</span> yoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; rows; y++) &#123;</span><br><span class="line">    <span class="keyword">let</span> xoff = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; cols; x++) &#123;</span><br><span class="line">      <span class="keyword">const</span> index = x + y * cols</span><br><span class="line">      <span class="keyword">const</span> angle = noise(xoff, yoff) * TWO_PI * <span class="number">4</span></span><br><span class="line">      <span class="keyword">const</span> v = p5.Vector.fromAngle(angle)</span><br><span class="line">      xoff += inc</span><br><span class="line">      stroke(<span class="number">255</span>)</span><br><span class="line">      strokeWeight(<span class="number">2</span>)</span><br><span class="line">      push();</span><br><span class="line">      translate(x * scl, y * scl)</span><br><span class="line">      rotate(v.heading())</span><br><span class="line">      line(<span class="number">0</span>, <span class="number">0</span>, scl, <span class="number">0</span>)</span><br><span class="line">      pop()</span><br><span class="line">    &#125;</span><br><span class="line">    yoff += inc</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Retornando esse resultado</p><p><img src="/images/creative-coding/part-6/cc-3.png" alt="Linhas rotacionadas em um fluxo direcional"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Na sequência podemos adicionar as cores e ajustar um pouco as linhas.</p><p>Começando pelas cores, podemos adicionar cores aleatórias para as linhas com base em uma lista de cores pré-selecionadas, e atualizar o background</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> colors = [<span class="string">'#ff0026'</span>, <span class="string">'#ff3400'</span>, <span class="string">'#ea3d96'</span>, <span class="string">'#7a62a4'</span>, <span class="string">'#ffea00'</span>, <span class="string">'#98398f'</span>, <span class="string">'#839db2'</span>, <span class="string">'#0ead00'</span>, <span class="string">'#578400'</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...  </span><br><span class="line">  background(<span class="string">'#ffd000'</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; rows; y++) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; cols; x++) &#123;</span><br><span class="line">      ...</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">const</span> c = colors[int(random(<span class="number">0</span>, colors.length))]</span><br><span class="line">      stroke(c)</span><br><span class="line">      fill(c)</span><br><span class="line">      strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">      ...</span><br><span class="line">    &#125;</span><br><span class="line">    ...</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-6/cc-4.png" alt="Linhas coloridas rotacionadas em um fluxo direcional"></p><p>Podemos também alterar a função que desenha a linha para adicionar algumas colas e um pouco de aleatoriedade em quando as linhas devem ou não aparecer</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; rows; y++) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; cols; x++) &#123;</span><br><span class="line">      ...</span><br><span class="line">      drawLine(scl)</span><br><span class="line">      ...</span><br><span class="line">    &#125;</span><br><span class="line">    ...</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLine</span>(<span class="params">size</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">0.9</span>) &#123;</span><br><span class="line">    line(<span class="number">0</span>, <span class="number">0</span>, size, <span class="number">0</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">0.7</span>) &#123;</span><br><span class="line">    circle(<span class="number">0</span>, <span class="number">0</span>, <span class="number">2</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-6/cc-5.png" alt="Linhas coloridas rotacionadas em um fluxo direcional"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Agora, vamos adicionar uma máscara para que o <em>flow field</em> apareça apenas dentro de um círculo, e não on canvas inteiro.</p><p>O p5.js não possui nenhuma função específica para isso, mas como o código é executado em um canvas HTML, podemos utilizar a própria função dele para isso. <a href="https://github.com/processing/p5.js/issues/3998#issuecomment-670270414" target="_blank" rel="noopener">Essa discussão</a> nas issues do p5.js explica melhor como isso pode ser usado.</p><p>No nosso código, podemos adicionar da seguinte forma:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  drawingContext.save()  </span><br><span class="line">  fill(<span class="string">'#bfc187'</span>)</span><br><span class="line">  circle(width / <span class="number">2</span>, height / <span class="number">2</span>, height / <span class="number">1.5</span>)</span><br><span class="line">  drawingContext.clip()</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Obtendo esse resultado:</p><p><img src="/images/creative-coding/part-6/cc-6.png" alt="Linhas coloridas rotacionadas em um fluxo direcional dentro de um círculo"></p><h2 id="Passo-4"><a href="#Passo-4" class="headerlink" title="Passo 4"></a>Passo 4</h2><p>O último passo é adicionar uma granularidade para a tela, assim como na imagem original. </p><p>Para isso, trapaceei pedindo ao ChatGPT para gerar um código que “granule” o canvas. O resultado foi esse:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  applyGrainyFilter()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyGrainyFilter</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">const</span> length = <span class="number">20</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="comment">// Add random noise to the red, green, and blue channels</span></span><br><span class="line">    pixels[i] += random(-length, length);</span><br><span class="line">    pixels[i + <span class="number">1</span>] += random(-length, length);</span><br><span class="line">    pixels[i + <span class="number">2</span>] += random(-length, length);</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-6/cc-7.png" alt="Linhas coloridas rotacionadas em um fluxo direcional dentro de um círculo em um canvas granulado"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Algumas ideias para avançar mais nesse projeto seriam brincar com a função de <em>drawLine</em> para chegar mais próximo do resultado original, ou tentar encontrar uma paleta de cores mais semelhantes.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> inc = <span class="number">0.02</span></span><br><span class="line"><span class="keyword">const</span> scl = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> cols, rows</span><br><span class="line"><span class="keyword">const</span> colors = [<span class="string">'#ff0026'</span>, <span class="string">'#ff3400'</span>, <span class="string">'#ea3d96'</span>, <span class="string">'#7a62a4'</span>, <span class="string">'#ffea00'</span>, <span class="string">'#98398f'</span>, <span class="string">'#839db2'</span>, <span class="string">'#0ead00'</span>, <span class="string">'#578400'</span>]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">600</span>, <span class="number">600</span>)</span><br><span class="line">  cols = floor(width / scl)</span><br><span class="line">  rows = floor(height / scl)</span><br><span class="line">  </span><br><span class="line">  background(<span class="string">'#ffd000'</span>)</span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noStroke()</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// https://github.com/processing/p5.js/issues/3998#issuecomment-670270414</span></span><br><span class="line">  drawingContext.save()  </span><br><span class="line">  fill(<span class="string">'#bfc187'</span>)</span><br><span class="line">  circle(width / <span class="number">2</span>, height / <span class="number">2</span>, height / <span class="number">1.5</span>)</span><br><span class="line">  drawingContext.clip()</span><br><span class="line"></span><br><span class="line">  <span class="comment">// https://thecodingtrain.com/challenges/24-perlin-noise-flow-field</span></span><br><span class="line">  <span class="keyword">let</span> yoff = <span class="number">0</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; rows; y++) &#123;</span><br><span class="line">    <span class="keyword">let</span> xoff = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; cols; x++) &#123;</span><br><span class="line">      <span class="keyword">const</span> index = x + y * cols</span><br><span class="line">      <span class="keyword">const</span> angle = noise(xoff, yoff) * TWO_PI * <span class="number">4</span></span><br><span class="line">      <span class="keyword">const</span> v = p5.Vector.fromAngle(angle)</span><br><span class="line">      xoff += inc</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">const</span> c = colors[int(random(<span class="number">0</span>, colors.length))]</span><br><span class="line">      stroke(c)</span><br><span class="line">      fill(c)</span><br><span class="line">      strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">      push();</span><br><span class="line">      translate(x * scl, y * scl)</span><br><span class="line">      rotate(v.heading())</span><br><span class="line">      drawLine(scl)</span><br><span class="line">      pop()</span><br><span class="line">    &#125;</span><br><span class="line">    yoff += inc</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  applyGrainyFilter()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawLine</span>(<span class="params">size</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">0.9</span>) &#123;</span><br><span class="line">    line(<span class="number">0</span>, <span class="number">0</span>, size, <span class="number">0</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (random() &lt; <span class="number">0.7</span>) &#123;</span><br><span class="line">    circle(<span class="number">0</span>, <span class="number">0</span>, <span class="number">2</span>)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">applyGrainyFilter</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  loadPixels();</span><br><span class="line">  <span class="keyword">const</span> length = <span class="number">20</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; pixels.length; i += <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="comment">// Add random noise to the red, green, and blue channels</span></span><br><span class="line">    pixels[i] += random(-length, length);</span><br><span class="line">    pixels[i + <span class="number">1</span>] += random(-length, length);</span><br><span class="line">    pixels[i + <span class="number">2</span>] += random(-length, length);</span><br><span class="line">  &#125;</span><br><span class="line">  updatePixels();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/09/21/creative-coding-experiments-6/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Empacotamento - Experimentos em Programação Criativa - 5</title>
      <link>https://cgreinhold.dev/2023/09/04/creative-coding-experiments-5/</link>
      <guid>https://cgreinhold.dev/2023/09/04/creative-coding-experiments-5/</guid>
      <pubDate>Mon, 04 Sep 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo.
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que tentei replicar através de código desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-5/cc-1.png" alt="Espirais empacotadas"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-5/cc-2.png" alt="Espirais empacotados de forma parecida"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Nesse projeto decidi seguir uma forma simples de reutilizar códigos já feito por outras pessoas ao invés de codificar tudo do zero. É um pouco preguiçoso, mas sempre acho essa uma forma boa de aprender, já que eu sempre busco entender o código dos outros antes de começar a alterar ou incrementar algo.</p><p>Para isso, usei como base o código <a href="https://www.youtube.com/watch?v=QHEQuoIKgNE" target="_blank" rel="noopener">desse vídeo do coding train</a>, onde Daniel Shiffman ensina a aplicar um algoritmo de circle packing. O código do vídeo está <a href="https://editor.p5js.org/codingtrain/sketches/wxGRAd4I-" target="_blank" rel="noopener">nesse projeto</a> que usei como base, fazendo algumas alterações para utilizar o canvas inteiro ao invés de uma imagem.</p><p>Esse é o código após as alterações:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> circles = []</span><br><span class="line"><span class="keyword">let</span> spots = []</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; width; x++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; height; y++) &#123;</span><br><span class="line">      spots.push(createVector(x, y))</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">let</span> total = <span class="number">5</span></span><br><span class="line">  <span class="keyword">let</span> count = <span class="number">0</span></span><br><span class="line">  <span class="keyword">let</span> attempts = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">while</span> (count &lt; total) &#123;</span><br><span class="line">    <span class="keyword">let</span> newC = newCircle()</span><br><span class="line">    <span class="keyword">if</span> (newC !== <span class="literal">null</span>) &#123;</span><br><span class="line">      circles.push(newC)</span><br><span class="line">      count++</span><br><span class="line">    &#125;</span><br><span class="line">    attempts++</span><br><span class="line">    <span class="keyword">if</span> (attempts &gt; <span class="number">1000</span>) &#123;</span><br><span class="line">      noLoop()</span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; circles.length; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> circl = circles[i]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (circl.growing) &#123;</span><br><span class="line">      <span class="keyword">if</span> (circl.edges()) &#123;</span><br><span class="line">        circl.growing = <span class="literal">false</span></span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; circles.length; j++) &#123;</span><br><span class="line">          <span class="keyword">let</span> other = circles[j]</span><br><span class="line">          <span class="keyword">if</span> (circl !== other) &#123;</span><br><span class="line">            <span class="keyword">var</span> d = dist(circl.x, circl.y, other.x, other.y)</span><br><span class="line">            <span class="keyword">var</span> distance = circl.r + other.r</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (d - <span class="number">4</span> &lt; distance) &#123;</span><br><span class="line">              circl.growing = <span class="literal">false</span></span><br><span class="line">              <span class="keyword">break</span></span><br><span class="line">            &#125;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    circl.show()</span><br><span class="line">    circl.grow()</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">newCircle</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">var</span> r = int(random(<span class="number">0</span>, spots.length))</span><br><span class="line">  <span class="keyword">var</span> spot = spots[r]</span><br><span class="line">  <span class="keyword">var</span> x = spot.x</span><br><span class="line">  <span class="keyword">var</span> y = spot.y</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> valid = <span class="literal">true</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; circles.length; i++) &#123;</span><br><span class="line">    <span class="keyword">var</span> circle = circles[i]</span><br><span class="line">    <span class="keyword">var</span> d = dist(x, y, circle.x, circle.y)</span><br><span class="line">    <span class="keyword">if</span> (d &lt; circle.r) &#123;</span><br><span class="line">      valid = <span class="literal">false</span></span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (valid) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> Circle(x, y)</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">null</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(x, y) &#123;</span><br><span class="line">    <span class="keyword">this</span>.x = x</span><br><span class="line">    <span class="keyword">this</span>.y = y</span><br><span class="line">    <span class="keyword">this</span>.r = <span class="number">1</span></span><br><span class="line">    <span class="keyword">this</span>.growing = <span class="literal">true</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  grow() &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.growing) &#123;</span><br><span class="line">      <span class="keyword">this</span>.r += <span class="number">1</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  show() &#123;</span><br><span class="line">    fill(<span class="number">255</span>)</span><br><span class="line">    noStroke()</span><br><span class="line">    ellipse(<span class="keyword">this</span>.x, <span class="keyword">this</span>.y, <span class="keyword">this</span>.r * <span class="number">2</span>, <span class="keyword">this</span>.r * <span class="number">2</span>)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  edges() &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="keyword">this</span>.x + <span class="keyword">this</span>.r &gt;= width ||</span><br><span class="line">      <span class="keyword">this</span>.x - <span class="keyword">this</span>.r &lt;= <span class="number">0</span> ||</span><br><span class="line">      <span class="keyword">this</span>.y + <span class="keyword">this</span>.r &gt;= height ||</span><br><span class="line">      <span class="keyword">this</span>.y - <span class="keyword">this</span>.r &lt;= <span class="number">0</span></span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-5/cc-3.png" alt="Círculos empacotados"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Meu segundo passo foi alterar o código para desenhar espirais ao invés de círculos. Pedi para o ChatGPT criar esse código para mim, e esse foi o resultado:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawSpiral</span>(<span class="params">centerX, centerY, radius</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> angle = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">let</span> increment = <span class="number">0.1</span>;</span><br><span class="line"></span><br><span class="line">  beginShape();</span><br><span class="line">  noFill();</span><br><span class="line">  stroke(<span class="number">0</span>);</span><br><span class="line">  strokeWeight(<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; radius; r += <span class="number">0.1</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = centerX + cos(angle) * r;</span><br><span class="line">    <span class="keyword">let</span> y = centerY + sin(angle) * r;</span><br><span class="line">    vertex(x, y);</span><br><span class="line">    angle += increment;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  endShape();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Esse código já faz bastante do que queremos, e com um pouco de ajustes podemos subsituír o método <code>show</code> da nossa classe <code>Circle</code>.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  show() &#123;</span><br><span class="line">    <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">    <span class="keyword">let</span> increment = <span class="number">0.2</span></span><br><span class="line"></span><br><span class="line">    beginShape()</span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="number">255</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; <span class="keyword">this</span>.r; r += <span class="number">0.1</span>) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = <span class="keyword">this</span>.x + cos(angle) * r</span><br><span class="line">      <span class="keyword">let</span> y = <span class="keyword">this</span>.y + sin(angle) * r</span><br><span class="line">      vertex(x, y)</span><br><span class="line">      angle += increment</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    endShape()</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-5/cc-4.png" alt="Espirais empacotadas"></p><h1 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h1><p>Para adicionarmos cores em alguns dos espirais, teremos que mudar o método <code>show</code> para usar linhas ao invés de vértices, já que a cor irá mudando do início até o fim da espiral.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  show() &#123;</span><br><span class="line">    <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">    <span class="keyword">let</span> increment = <span class="number">0.2</span></span><br><span class="line"></span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="number">255</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> prev</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; <span class="keyword">this</span>.r; r += <span class="number">0.1</span>) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = <span class="keyword">this</span>.x + cos(angle) * r</span><br><span class="line">      <span class="keyword">let</span> y = <span class="keyword">this</span>.y + sin(angle) * r</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (prev) &#123;</span><br><span class="line">        line(prev.x, prev.y, x, y)</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        point(x, y)</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      prev = createVector(x, y)</span><br><span class="line">      angle += increment</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Então alteramos o <code>show</code> novamente para adicionar uma cor de stroke aleatória e mudamos o <code>colorMode</code> do nosso projeto para HSB</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  colorMode(HSB)</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(x, y) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">this</span>.colorRange = random(<span class="number">0</span>, <span class="number">360</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  show() &#123;</span><br><span class="line">    <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">    <span class="keyword">let</span> increment = <span class="number">0.2</span></span><br><span class="line"></span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="number">255</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> prev</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; <span class="keyword">this</span>.r; r += <span class="number">0.1</span>) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = <span class="keyword">this</span>.x + cos(angle) * r</span><br><span class="line">      <span class="keyword">let</span> y = <span class="keyword">this</span>.y + sin(angle) * r</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (<span class="keyword">this</span>.colorRange === <span class="number">0</span>) &#123;</span><br><span class="line">        stroke(<span class="number">255</span>)</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        stroke(r * <span class="number">3</span> + <span class="keyword">this</span>.colorRange, height, height)</span><br><span class="line">      &#125;</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (prev) &#123;</span><br><span class="line">        line(prev.x, prev.y, x, y)</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        point(x, y)</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      prev = createVector(x, y)</span><br><span class="line">      angle += increment</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-5/cc-5.png" alt="Espirais empacotadas coloridas"></p><h1 id="Passo-4"><a href="#Passo-4" class="headerlink" title="Passo 4"></a>Passo 4</h1><p>O último passo é definir alguns circulos onde apenas espirais dentro deles serão coloridos. Primeiro geramos a lista de áreas coloridas:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> colorCircles = []</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; i++) &#123;</span><br><span class="line">    colorCircles.push(&#123;</span><br><span class="line">      x: random(<span class="number">0</span>, width),</span><br><span class="line">      y: random(<span class="number">0</span>, height),</span><br><span class="line">      r: random(<span class="number">10</span>, <span class="number">30</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Na sequência atualizamos o método <code>grow</code> para atualizar a cor da espiral caso esteja dentro de um dos círculos coloridos.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  grow() &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.growing) &#123;</span><br><span class="line">      <span class="keyword">this</span>.r += <span class="number">1</span></span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (<span class="keyword">this</span>.colorRange &gt; <span class="number">0</span>) <span class="keyword">return</span></span><br><span class="line">      <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; colorCircles.length; i++) &#123;</span><br><span class="line">        <span class="keyword">const</span> other = colorCircles[i]</span><br><span class="line">        <span class="keyword">var</span> d = dist(<span class="keyword">this</span>.x, <span class="keyword">this</span>.y, other.x, other.y)</span><br><span class="line">        <span class="keyword">var</span> distance = <span class="keyword">this</span>.r + other.r * <span class="number">2</span></span><br><span class="line">        <span class="keyword">if</span> (d - <span class="number">4</span> &lt; distance) &#123;</span><br><span class="line">          <span class="keyword">this</span>.colorRange = random(<span class="number">0</span>, <span class="number">360</span>)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-5/cc-6.png" alt="Espirais empacotadas coloridas e brancas"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Como podem ver na imagem base e na final, nossos círculos coloridos não são perfeitos. Isso acontece porque só verificamos se as espirais encostam em uma das áreas coloridas, mas não paramos de crescê-las quando elas ultrapassam.</p><p>Uma ideia para brincar mais um pouco com esse código seria adicionar essa validação para que não sejam desenhadas espirais entre as áreas coloridas e preto e brancas.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> circles = []</span><br><span class="line"><span class="keyword">let</span> spots = []</span><br><span class="line"><span class="keyword">let</span> colorCircles = []</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>)</span><br><span class="line">  colorMode(HSB)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> x = <span class="number">0</span>; x &lt; width; x++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> y = <span class="number">0</span>; y &lt; height; y++) &#123;</span><br><span class="line">      spots.push(createVector(x, y))</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">3</span>; i++) &#123;</span><br><span class="line">    colorCircles.push(&#123;</span><br><span class="line">      x: random(<span class="number">0</span>, width),</span><br><span class="line">      y: random(<span class="number">0</span>, height),</span><br><span class="line">      r: <span class="number">30</span></span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">let</span> total = <span class="number">5</span></span><br><span class="line">  <span class="keyword">let</span> count = <span class="number">0</span></span><br><span class="line">  <span class="keyword">let</span> attempts = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">while</span> (count &lt; total) &#123;</span><br><span class="line">    <span class="keyword">let</span> newC = newCircle()</span><br><span class="line">    <span class="keyword">if</span> (newC !== <span class="literal">null</span>) &#123;</span><br><span class="line">      circles.push(newC)</span><br><span class="line">      count++</span><br><span class="line">    &#125;</span><br><span class="line">    attempts++</span><br><span class="line">    <span class="keyword">if</span> (attempts &gt; <span class="number">1000</span>) &#123;</span><br><span class="line">      noLoop()</span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; circles.length; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> circl = circles[i]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (circl.growing) &#123;</span><br><span class="line">      <span class="keyword">if</span> (circl.edges()) &#123;</span><br><span class="line">        circl.growing = <span class="literal">false</span></span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; circles.length; j++) &#123;</span><br><span class="line">          <span class="keyword">let</span> other = circles[j]</span><br><span class="line">          <span class="keyword">if</span> (circl !== other) &#123;</span><br><span class="line">            <span class="keyword">var</span> d = dist(circl.x, circl.y, other.x, other.y)</span><br><span class="line">            <span class="keyword">var</span> distance = circl.r + other.r</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (d - <span class="number">4</span> &lt; distance) &#123;</span><br><span class="line">              circl.growing = <span class="literal">false</span></span><br><span class="line">              <span class="keyword">break</span></span><br><span class="line">            &#125;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    circl.show()</span><br><span class="line">    circl.grow()</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">newCircle</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">var</span> r = int(random(<span class="number">0</span>, spots.length))</span><br><span class="line">  <span class="keyword">var</span> spot = spots[r]</span><br><span class="line">  spots.splice(r, <span class="number">1</span>)</span><br><span class="line">  <span class="keyword">var</span> x = spot.x</span><br><span class="line">  <span class="keyword">var</span> y = spot.y</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> valid = <span class="literal">true</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; circles.length; i++) &#123;</span><br><span class="line">    <span class="keyword">var</span> circle = circles[i]</span><br><span class="line">    <span class="keyword">var</span> d = dist(x, y, circle.x, circle.y)</span><br><span class="line">    <span class="keyword">if</span> (d &lt; circle.r) &#123;</span><br><span class="line">      valid = <span class="literal">false</span></span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (valid) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> Circle(x, y)</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">null</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(x, y) &#123;</span><br><span class="line">    <span class="keyword">this</span>.x = x</span><br><span class="line">    <span class="keyword">this</span>.y = y</span><br><span class="line">    <span class="keyword">this</span>.r = <span class="number">1</span></span><br><span class="line">    <span class="keyword">this</span>.growing = <span class="literal">true</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  isColored() &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; colorCircles.length; i++) &#123;</span><br><span class="line">        <span class="keyword">const</span> other = colorCircles[i]</span><br><span class="line">        <span class="keyword">var</span> d = dist(<span class="keyword">this</span>.x, <span class="keyword">this</span>.y, other.x, other.y)</span><br><span class="line">        <span class="keyword">var</span> distance = <span class="keyword">this</span>.r + other.r</span><br><span class="line">        <span class="keyword">if</span> (d - <span class="number">4</span> &lt; distance) &#123;</span><br><span class="line">          <span class="keyword">this</span>.colorRange = random(<span class="number">0</span>, <span class="number">360</span>)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  grow() &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.growing) &#123;</span><br><span class="line">      <span class="keyword">this</span>.r += <span class="number">1</span></span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (<span class="keyword">this</span>.colorRange &gt; <span class="number">0</span>) <span class="keyword">return</span></span><br><span class="line">      <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; colorCircles.length; i++) &#123;</span><br><span class="line">        <span class="keyword">const</span> other = colorCircles[i]</span><br><span class="line">        <span class="keyword">var</span> d = dist(<span class="keyword">this</span>.x, <span class="keyword">this</span>.y, other.x, other.y);</span><br><span class="line">        <span class="keyword">var</span> distance = <span class="keyword">this</span>.r + other.r * <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">if</span> (d - <span class="number">4</span> &lt; distance) &#123;</span><br><span class="line">          <span class="keyword">this</span>.colorRange = random(<span class="number">0</span>, <span class="number">360</span>)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  show() &#123;</span><br><span class="line">    <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">    <span class="keyword">let</span> increment = <span class="number">0.2</span></span><br><span class="line"></span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="number">255</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> prev</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; <span class="keyword">this</span>.r; r += <span class="number">0.1</span>) &#123;</span><br><span class="line">      <span class="keyword">let</span> x = <span class="keyword">this</span>.x + cos(angle) * r</span><br><span class="line">      <span class="keyword">let</span> y = <span class="keyword">this</span>.y + sin(angle) * r</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (<span class="keyword">this</span>.colorRange === <span class="number">0</span>) &#123;</span><br><span class="line">        stroke(<span class="number">255</span>);</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        stroke(r * <span class="number">3</span> + <span class="keyword">this</span>.colorRange, height, height);</span><br><span class="line">      &#125;</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span> (prev) &#123;</span><br><span class="line">        line(prev.x, prev.y, x, y)</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        point(x, y)</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      prev = createVector(x, y)</span><br><span class="line">      angle += increment</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  edges() &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="keyword">this</span>.x + <span class="keyword">this</span>.r &gt;= width ||</span><br><span class="line">      <span class="keyword">this</span>.x - <span class="keyword">this</span>.r &lt;= <span class="number">0</span> ||</span><br><span class="line">      <span class="keyword">this</span>.y + <span class="keyword">this</span>.r &gt;= height ||</span><br><span class="line">      <span class="keyword">this</span>.y - <span class="keyword">this</span>.r &lt;= <span class="number">0</span></span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/09/04/creative-coding-experiments-5/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Rotação - Experimentos em Programação Criativa - 4</title>
      <link>https://cgreinhold.dev/2023/08/30/creative-coding-experiments-4/</link>
      <guid>https://cgreinhold.dev/2023/08/30/creative-coding-experiments-4/</guid>
      <pubDate>Wed, 30 Aug 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo.
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que tentei replicar através de código desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-4/cc-1.gif" alt="Semicírculos rotacionando"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-4/cc-2.gif" alt="Semicírculos rotacionando de forma parecida"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Começando pelo passo mais simples, desenhando um semicírculo. O próprio p5 possui uma função auxiliar para isso: <code>arc</code>, deixando esse passo bastante simples.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">255</span>)</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> x = width / <span class="number">2</span></span><br><span class="line">  <span class="keyword">const</span> y = height / <span class="number">2</span></span><br><span class="line">  </span><br><span class="line">  arc(x, y, <span class="number">50</span>, <span class="number">50</span>, <span class="number">0</span>, HALF_PI)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-4/cc-3.png" alt="Semicírculo estático no centro do quadro"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Na sequência adicionamos uma rotação para esse semicírculo. A forma mais simples é apenas incrementando a ponto de início e fim do com o valor do <code>frameCount</code>. Como os frames atualizam muito rápidos, podemos reduzir o valor para uma variável de velocidade.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">255</span>)</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> x = width / <span class="number">2</span></span><br><span class="line">  <span class="keyword">const</span> y = height / <span class="number">2</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> velocity = frameCount / <span class="number">10</span></span><br><span class="line">  <span class="keyword">const</span> arcStart = velocity</span><br><span class="line">  <span class="keyword">const</span> arcEnd = HALF_PI + velocity</span><br><span class="line">  </span><br><span class="line">  arc(x, y, <span class="number">50</span>, <span class="number">50</span>, arcStart, arcEnd)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-4/cc-4.gif" alt="Semicírculo rodando"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Último passo é adicionarmos mais arcos. Faremos isso dentro de um loop simples</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">255</span>)</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> x = width / <span class="number">2</span></span><br><span class="line">  <span class="keyword">const</span> y = height / <span class="number">2</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> velocity = frameCount / <span class="number">10</span></span><br><span class="line">  <span class="keyword">const</span> arcStart = velocity</span><br><span class="line">  <span class="keyword">const</span> arcEnd = HALF_PI + velocity</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">150</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> radius = <span class="number">50</span> + i * <span class="number">5</span></span><br><span class="line">    arc(x, y, radius, radius, arcStart, arcEnd)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-4/cc-5.gif" alt="Semicírculos rodando na mesma direção"></p><p>Adicionando diferentes pontos de início e velocidades para cada arco, conseguimos fazer um efeito semelhante ao desejado</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">255</span>)</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> x = width / <span class="number">2</span></span><br><span class="line">  <span class="keyword">const</span> y = height / <span class="number">2</span></span><br><span class="line">    </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">150</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> radius = <span class="number">50</span> + i * <span class="number">5</span></span><br><span class="line">    <span class="keyword">const</span> offsetPositions = <span class="number">8</span></span><br><span class="line">    <span class="keyword">const</span> offset = i % offsetPositions * (HALF_PI / (offsetPositions / <span class="number">2</span>))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> velocity = frameCount / (<span class="number">10</span> * (i % <span class="number">3</span>) + <span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> arcStart = velocity + offset</span><br><span class="line">    <span class="keyword">const</span> arcEnd = HALF_PI + velocity + offset</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (i % <span class="number">2</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      arc(x, y, radius, radius, -arcEnd, -arcStart)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      arc(x, y, radius, radius, arcStart, arcEnd)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-4/cc-2.gif" alt="Semicírculos rodando em várias direções"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Esse código foi bastante simples, mas ainda tem várias formas de brincar com ele, como mudando a largura e distancias entre os arcos, ou até adicionando cores.</p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  stroke(<span class="number">255</span>)</span><br><span class="line">  background(<span class="number">0</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> x = width / <span class="number">2</span></span><br><span class="line">  <span class="keyword">const</span> y = height / <span class="number">2</span></span><br><span class="line">    </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">150</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> radius = <span class="number">50</span> + i * <span class="number">5</span></span><br><span class="line">    <span class="keyword">const</span> offsetPositions = <span class="number">8</span></span><br><span class="line">    <span class="keyword">const</span> offset = i % offsetPositions * (HALF_PI / (offsetPositions / <span class="number">2</span>))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> velocity = frameCount / (<span class="number">10</span> * (i % <span class="number">3</span>) + <span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> arcStart = velocity + offset</span><br><span class="line">    <span class="keyword">const</span> arcEnd = HALF_PI + velocity + offset</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (i % <span class="number">2</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      arc(x, y, radius, radius, -arcEnd, -arcStart)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      arc(x, y, radius, radius, arcStart, arcEnd)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/08/30/creative-coding-experiments-4/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Movimento - Experimentos em Programação Criativa - 3</title>
      <link>https://cgreinhold.dev/2023/08/22/creative-coding-experiments-3/</link>
      <guid>https://cgreinhold.dev/2023/08/22/creative-coding-experiments-3/</guid>
      <pubDate>Tue, 22 Aug 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo.
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que tentei replicar através de código desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-3/cc-1.gif" alt="Várias linhas conectadas se movendo, gerando um desenho ao fundo"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-3/cc-2.gif" alt="Um parecido canvas com várias linhas conectadas se movendo, gerando um desenho ao fundo"></p><p>Um pouco longe do resultado desejado, mas já foi muito bom para utilizar algoritmos e estruturas de dados diferentes e praticar um pouquinho com o loop de desenho do p5.</p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Começando por um passo que parece simples mas já precisará de um pouco e matemática, vamos tentar primeiro desenhar a linha central que fica estática. Basicamente temos um ponto no centro da imagem, com uma barra em 45º.</p><p>Como todas as barras serão movimentadas com base no seu ponto central, e terão um ângulo e comprimento diferentes, podemos criar uma função que receba a coordenada central, um ângulo e um comprimento para definir quais são as coordenadas das extremidades da linha. Assim só precisamos desenhar a linha entre os dois pontos.</p><p>Conseguimos fazer isso com a seguinte função:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">calculateLinePoints</span>(<span class="params">center, angle, lineSize</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// Converter o ângulo de graus para radianos</span></span><br><span class="line">  <span class="keyword">const</span> angleInRadians = (angle * <span class="built_in">Math</span>.PI) / <span class="number">180</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calcular a metade da linha</span></span><br><span class="line">  <span class="keyword">const</span> halfLineSize = lineSize / <span class="number">2</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calcular os componentes x e y da linha</span></span><br><span class="line">  <span class="keyword">const</span> xComponent = <span class="built_in">Math</span>.cos(angleInRadians) * halfLineSize</span><br><span class="line">  <span class="keyword">const</span> yComponent = <span class="built_in">Math</span>.sin(angleInRadians) * halfLineSize</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calcular os outros dois pontos da linha</span></span><br><span class="line">  <span class="keyword">const</span> point1 = &#123;</span><br><span class="line">    x: center.x - xComponent,</span><br><span class="line">    y: center.y - yComponent</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> point2 = &#123;</span><br><span class="line">    x: center.x + xComponent,</span><br><span class="line">    y: center.y + yComponent</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> [point1, point2]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E desenhar na tela com o método <code>draw</code> do p5:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> SIZE = <span class="number">500</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(SIZE, SIZE)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line">  </span><br><span class="line">  stroke(<span class="string">'green'</span>)</span><br><span class="line">  strokeWeight(<span class="number">10</span>)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> coord = &#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;</span><br><span class="line"></span><br><span class="line">  point(coord.x, coord.y)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> [point1, point2] = <span class="keyword">this</span>.calculateLinePoints(coord, <span class="number">45</span>, <span class="number">300</span>)</span><br><span class="line"></span><br><span class="line">  strokeWeight(<span class="number">2</span>)</span><br><span class="line">  line(point1.x, point1.y, point2.x, point2.y)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Assim temos nossa primeira linha</p><p><img src="/images/creative-coding/part-3/cc-3.png" alt="Canvas com linha central em 45 graus"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>Como as linhas terão conexão umas com as outras decidi usar classes para esse projeto. Para isso criarei uma classe para desenhar as linhas, para facilitar o trabalho.<br>Com um pouco de refatoração, podemos atualizar o código anterior para:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> r = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">45</span>, <span class="number">300</span>)</span><br><span class="line">  r.draw()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length) &#123;</span><br><span class="line">    <span class="keyword">this</span>.coord = coord</span><br><span class="line">    <span class="keyword">this</span>.angle = angle</span><br><span class="line">    <span class="keyword">this</span>.length = length</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  draw() &#123;</span><br><span class="line">    stroke(<span class="string">'green'</span>)</span><br><span class="line">    strokeWeight(<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    point(<span class="keyword">this</span>.coord.x, <span class="keyword">this</span>.coord.y)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> [point1, point2] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.coord, <span class="keyword">this</span>.angle, <span class="keyword">this</span>.length)</span><br><span class="line"></span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line">    line(point1.x, point1.y, point2.x, point2.y)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  calculateLinePoints(center, angle, lineSize) &#123;</span><br><span class="line">    <span class="comment">// Converter o angulo de graus para radianos</span></span><br><span class="line">    <span class="keyword">const</span> angleInRadians = (angle * <span class="built_in">Math</span>.PI) / <span class="number">180</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular a metade da linha</span></span><br><span class="line">    <span class="keyword">const</span> halfLineSize = lineSize / <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular os componentes x e y da linha</span></span><br><span class="line">    <span class="keyword">const</span> xComponent = <span class="built_in">Math</span>.cos(angleInRadians) * halfLineSize</span><br><span class="line">    <span class="keyword">const</span> yComponent = <span class="built_in">Math</span>.sin(angleInRadians) * halfLineSize</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular os outros dois pontos da linha</span></span><br><span class="line">    <span class="keyword">const</span> point1 = &#123;</span><br><span class="line">      x: center.x - xComponent,</span><br><span class="line">      y: center.y - yComponent</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> point2 = &#123;</span><br><span class="line">      x: center.x + xComponent,</span><br><span class="line">      y: center.y + yComponent</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> [point1, point2]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>Podemos então adicionar um novo parâmetros para a nossa classe, para desenharmos as linhas seguintes: a linha pai.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> r2 = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">0</span>, <span class="number">300</span>, r)</span><br><span class="line">  r2.draw()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length, parent) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">this</span>.parent = parent</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Como vamos precisar que a linha ande, não podemos sempre redesenhá-la na mesma coordenada. Para isso decidi mudar nosso código para criar as réguas no método <code>setup</code> (que só é executado uma vez), e somente desenhá-los no método <code>draw</code>.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> RULERS = []</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(SIZE, SIZE)</span><br><span class="line">    </span><br><span class="line">  <span class="keyword">const</span> r = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">45</span>, <span class="number">300</span>)  </span><br><span class="line">  <span class="keyword">const</span> r2 = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">0</span>, <span class="number">300</span>, r)</span><br><span class="line">  </span><br><span class="line">  RULERS.push(r)</span><br><span class="line">  RULERS.push(r2)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line"></span><br><span class="line">  RULERS.forEach(<span class="function"><span class="params">ruler</span> =&gt;</span> &#123;</span><br><span class="line">    ruler.draw()</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-3/cc-4.png" alt="Canvas com duas linhas"></p><h2 id="Passo-4"><a href="#Passo-4" class="headerlink" title="Passo 4"></a>Passo 4</h2><p>Agora podemos começar com a parte de movimentação. Podemos criar uma função <code>walk</code> em nossa classe de linha, para movimentá-la dentro do loop de desenho. Para encontrar o próximo ponto da linha </p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  walk() &#123;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="keyword">this</span>.parent) <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Selecionar as extremidades da linha pai</span></span><br><span class="line">    <span class="keyword">const</span> [point1, point2] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.parent.coord, <span class="keyword">this</span>.parent.angle, <span class="keyword">this</span>.parent.length)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular qual percentual da linha pai será o próximo ponto a seguir. Utilizamos o resto da divisão entre o número de loops e o dobro do tamanho do pai, e mapeamos para que a linha ande nas duas direções</span></span><br><span class="line">    <span class="keyword">const</span> percent = map(frameCount % <span class="keyword">this</span>.parent.length * <span class="number">2</span>, <span class="number">0</span>, <span class="keyword">this</span>.parent.length, <span class="number">-100</span>, <span class="number">0</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Atualizar a coordenada</span></span><br><span class="line">    <span class="keyword">this</span>.coord = <span class="keyword">this</span>.getPointOnLine(point1, point2, <span class="built_in">Math</span>.abs(percent))</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  getPointOnLine(coordinate1, coordinate2, percent) &#123;</span><br><span class="line">    <span class="comment">// Calcular diferença entre coordenadas x e y</span></span><br><span class="line">    <span class="keyword">const</span> dx = coordinate2.x - coordinate1.x;</span><br><span class="line">    <span class="keyword">const</span> dy = coordinate2.y - coordinate1.y;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular o ponto na linha com base no percentual</span></span><br><span class="line">    <span class="keyword">const</span> point = &#123;</span><br><span class="line">      x: coordinate1.x + (dx * percent) / <span class="number">100</span>,</span><br><span class="line">      y: coordinate1.y + (dy * percent) / <span class="number">100</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> point;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E por fim chamamos o método de desenho dentro do loop:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line"></span><br><span class="line">  RULERS.forEach(<span class="function"><span class="params">ruler</span> =&gt;</span> &#123;</span><br><span class="line">    ruler.draw()</span><br><span class="line">    ruler.walk()</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-3/cc-5.gif" alt="Linha em movimento"></p><h2 id="Passo-5"><a href="#Passo-5" class="headerlink" title="Passo 5"></a>Passo 5</h2><p>Um novo incremento que podemos fazer em nossa linha é configurar também a velocidade em que ela se move, já que cada linha terá uma velocidade diferente.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length, parent, velocity = 1) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">this</span>.velocity = velocity</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  walk() &#123;</span><br><span class="line">    ...</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> v = frameCount * <span class="keyword">this</span>.velocity</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Calcular qual percentual da linha pai será o próximo ponto a seguir. Utilizamos o resto da divisão entre o número de loops e o dobro do tamanho do pai, e mapeamos para que a linha ande nas duas direções</span></span><br><span class="line">    <span class="keyword">const</span> percent = map(v % <span class="keyword">this</span>.parent.length * <span class="number">2</span>, <span class="number">0</span>, <span class="keyword">this</span>.parent.length, <span class="number">-100</span>, <span class="number">0</span>)</span><br><span class="line">    </span><br><span class="line">    ...</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E então podemos atualizar o o método <code>setup</code> para criar várias linhas</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> RULERS = []</span><br><span class="line"><span class="keyword">const</span> RULER_COUNT = <span class="number">6</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(SIZE, SIZE)</span><br><span class="line">    </span><br><span class="line">  <span class="keyword">const</span> base = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">45</span>, <span class="number">300</span>)  </span><br><span class="line">  RULERS.push(base)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; RULER_COUNT - <span class="number">1</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> parent = RULERS[RULERS.length - <span class="number">1</span>]</span><br><span class="line">    <span class="keyword">const</span> angle = random(<span class="number">0</span>, <span class="number">180</span>)</span><br><span class="line">    <span class="keyword">const</span> length = random(<span class="number">50</span>, SIZE / <span class="number">2</span>)</span><br><span class="line">    <span class="keyword">const</span> velocity = random(<span class="number">0.3</span>, <span class="number">1.5</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> r = <span class="keyword">new</span> Regua(base.coord, angle, length, parent, velocity)</span><br><span class="line"></span><br><span class="line">    RULERS.push(r)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-3/cc-6.gif" alt="Várias linhas em movimento"></p><h2 id="Passo-6"><a href="#Passo-6" class="headerlink" title="Passo 6"></a>Passo 6</h2><p>A última linha será a responsável por adicionar o desenho na tela. Podemos ter uma propriedade para indentificarmos a linha que ela deve também desenhar a curva:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; RULER_COUNT - <span class="number">1</span>; i++) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">const</span> shouldDrawCurve = i === RULER_COUNT - <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> r = <span class="keyword">new</span> Regua(base.coord, angle, length, parent, velocity, shouldDrawCurve)</span><br><span class="line">    ...</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length, parent, velocity = 1, shouldDrawCurve = false) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">this</span>.shouldDrawCurve = shouldDrawCurve</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Na sequência criamos uma lista para os pontos da curva em que preenchemos a cada passo da régua, e chamamos uma função para desenhar a curva após desenharmos a linha:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length, parent, velocity = 1, shouldDrawCurve = false) &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">this</span>.curvePath = []</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  draw() &#123;</span><br><span class="line">    ...</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.shouldDrawCurve) &#123;</span><br><span class="line">      <span class="keyword">this</span>.drawCurve()</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  walk() &#123;</span><br><span class="line">    ...</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.shouldDrawCurve) &#123;</span><br><span class="line">      <span class="keyword">const</span> [point1] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.coord, <span class="keyword">this</span>.angle, <span class="keyword">this</span>.length)</span><br><span class="line"></span><br><span class="line">      <span class="keyword">this</span>.curvePath.push(point1)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  drawCurve() &#123;</span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="string">'black'</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">this</span>.curvePath.forEach(<span class="function">(<span class="params">coord</span>) =&gt;</span> &#123;</span><br><span class="line">      curveVertex(coord.x, coord.y)</span><br><span class="line">    &#125;)</span><br><span class="line">    endShape()</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Quase lá. A curva não parece tanto com uma curva. </p><p><img src="/images/creative-coding/part-3/cc-7.gif" alt="Várias linhas em movimento desenhando uma &quot;curva&quot;"></p><h2 id="Passo-7"><a href="#Passo-7" class="headerlink" title="Passo 7"></a>Passo 7</h2><p>Assistindo a <a href="https://www.youtube.com/watch?v=X_ocxmXeczk" target="_blank" rel="noopener">esse vídeo</a> de <a href="https://www.davepagurek.com/" target="_blank" rel="noopener">Dave Pagurek</a>, uma forma que é apresentada para resolver esse problema é não adicionar em nossa lista de pontos da curva a extremidade atual da linha, e sim um percentual de distância entre a extremidade e o ponto anterior.</p><p>O vídeo faz um papel muito melhor em explicar esse algoritmo, mas o código simples:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  walk() &#123;</span><br><span class="line">    ...</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.shouldDrawCurve) &#123;</span><br><span class="line">      <span class="keyword">const</span> [point1] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.coord, <span class="keyword">this</span>.angle, <span class="keyword">this</span>.length)</span><br><span class="line">      <span class="keyword">const</span> lastPoint = <span class="keyword">this</span>.curvePath[<span class="keyword">this</span>.curvePath.length - <span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (!lastPoint) &#123;</span><br><span class="line">        <span class="keyword">this</span>.curvePath.push(point1)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">      &#125;</span><br><span class="line">        </span><br><span class="line">      <span class="keyword">const</span> point = createVector(lastPoint.x, lastPoint.y).lerp(createVector(point1.x, point1.y), <span class="number">0.1</span>)</span><br><span class="line">      <span class="keyword">this</span>.curvePath.push(&#123; <span class="attr">x</span>: point.x, <span class="attr">y</span>: point.y &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-3/cc-8.gif" alt="Várias linhas em movimento desenhando uma curva de verdade"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Algumas outras ideias para evoluir essa brincadeira seriam:</p><ul><li>Alterar a grossura da curva, quando a velocidade de desenho diminui</li><li>Conectar a curva com a extremidade da linha, para que o desenho seja mais suave (sugestões de como implementar ambas ideias são também no vídeo mencionado acima)</li></ul><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> SIZE = <span class="number">500</span></span><br><span class="line"><span class="keyword">const</span> RULERS = []</span><br><span class="line"><span class="keyword">const</span> RULER_COUNT = <span class="number">6</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(SIZE, SIZE)</span><br><span class="line">    </span><br><span class="line">  <span class="keyword">const</span> base = <span class="keyword">new</span> Regua(&#123; <span class="attr">x</span>: width / <span class="number">2</span>, <span class="attr">y</span>: height / <span class="number">2</span>, &#125;, <span class="number">45</span>, <span class="number">300</span>)  </span><br><span class="line">  RULERS.push(base)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; RULER_COUNT - <span class="number">1</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> parent = RULERS[RULERS.length - <span class="number">1</span>]</span><br><span class="line">    <span class="keyword">const</span> angle = random(<span class="number">0</span>,<span class="number">180</span>)</span><br><span class="line">    <span class="keyword">const</span> length = random(<span class="number">50</span>, SIZE/<span class="number">2</span>)</span><br><span class="line">    <span class="keyword">const</span> velocity = random(<span class="number">0.3</span>, <span class="number">1.5</span>)</span><br><span class="line">    <span class="keyword">const</span> shouldDrawCurve = i === RULER_COUNT - <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> r = <span class="keyword">new</span> Regua(base.coord, angle, length, parent, velocity, shouldDrawCurve)</span><br><span class="line"></span><br><span class="line">    RULERS.push(r)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>)</span><br><span class="line"></span><br><span class="line">  RULERS.forEach(<span class="function"><span class="params">ruler</span> =&gt;</span> &#123;</span><br><span class="line">    ruler.draw()</span><br><span class="line">    ruler.walk()</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Regua</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(coord, angle, length, parent, velocity = 1, shouldDrawCurve = false) &#123;</span><br><span class="line">    <span class="keyword">this</span>.coord = coord</span><br><span class="line">    <span class="keyword">this</span>.angle = angle</span><br><span class="line">    <span class="keyword">this</span>.length = length</span><br><span class="line">    <span class="keyword">this</span>.parent = parent</span><br><span class="line">    <span class="keyword">this</span>.velocity = velocity</span><br><span class="line">    <span class="keyword">this</span>.shouldDrawCurve = shouldDrawCurve</span><br><span class="line">    <span class="keyword">this</span>.curvePath = []</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  draw() &#123;</span><br><span class="line">    stroke(<span class="string">'green'</span>)</span><br><span class="line">    strokeWeight(<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    point(<span class="keyword">this</span>.coord.x, <span class="keyword">this</span>.coord.y)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> [point1, point2] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.coord, <span class="keyword">this</span>.angle, <span class="keyword">this</span>.length)</span><br><span class="line"></span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line">    line(point1.x, point1.y, point2.x, point2.y)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.shouldDrawCurve) &#123;</span><br><span class="line">      <span class="keyword">this</span>.drawCurve()</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  walk() &#123;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="keyword">this</span>.parent) <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Selecionar as extremidades da linha pai</span></span><br><span class="line">    <span class="keyword">const</span> [point1, point2] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.parent.coord, <span class="keyword">this</span>.parent.angle, <span class="keyword">this</span>.parent.length)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> v = frameCount * <span class="keyword">this</span>.velocity</span><br><span class="line">    <span class="comment">// Calcular qual percentual da linha pai será o próximo ponto a seguir. Utilizamos o resto da divisão entre o número de loops e o dobro do tamanho do pai, e mapeamos para que a linha ande nas duas direções</span></span><br><span class="line">    <span class="keyword">const</span> percent = map(v % <span class="keyword">this</span>.parent.length * <span class="number">2</span>, <span class="number">0</span>, <span class="keyword">this</span>.parent.length, <span class="number">-100</span>, <span class="number">0</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Atualizar a coordenada</span></span><br><span class="line">    <span class="keyword">this</span>.coord = <span class="keyword">this</span>.getPointOnLine(point1, point2, <span class="built_in">Math</span>.abs(percent))</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.shouldDrawCurve) &#123;</span><br><span class="line">      <span class="keyword">const</span> [point1] = <span class="keyword">this</span>.calculateLinePoints(<span class="keyword">this</span>.coord, <span class="keyword">this</span>.angle, <span class="keyword">this</span>.length)</span><br><span class="line">      <span class="keyword">const</span> lastPoint = <span class="keyword">this</span>.curvePath[<span class="keyword">this</span>.curvePath.length - <span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (!lastPoint) &#123;</span><br><span class="line">        <span class="keyword">this</span>.curvePath.push(point1)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">      &#125;</span><br><span class="line">        </span><br><span class="line">      <span class="keyword">const</span> point = createVector(lastPoint.x, lastPoint.y).lerp(createVector(point1.x, point1.y), <span class="number">0.1</span>)</span><br><span class="line">      <span class="keyword">this</span>.curvePath.push(&#123; <span class="attr">x</span>: point.x, <span class="attr">y</span>: point.y &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  drawCurve() &#123;</span><br><span class="line">    noFill()</span><br><span class="line">    stroke(<span class="string">'black'</span>)</span><br><span class="line">    strokeWeight(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">this</span>.curvePath.forEach(<span class="function">(<span class="params">coord</span>) =&gt;</span> &#123;</span><br><span class="line">      curveVertex(coord.x, coord.y)</span><br><span class="line">    &#125;)</span><br><span class="line">    endShape()</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  calculateLinePoints(center, angle, lineSize) &#123;</span><br><span class="line">    <span class="comment">// Converter o angulo de graus para radianos</span></span><br><span class="line">    <span class="keyword">const</span> angleInRadians = (angle * <span class="built_in">Math</span>.PI) / <span class="number">180</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular a metade da linha</span></span><br><span class="line">    <span class="keyword">const</span> halfLineSize = lineSize / <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular os componentes x e y da linha</span></span><br><span class="line">    <span class="keyword">const</span> xComponent = <span class="built_in">Math</span>.cos(angleInRadians) * halfLineSize</span><br><span class="line">    <span class="keyword">const</span> yComponent = <span class="built_in">Math</span>.sin(angleInRadians) * halfLineSize</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular os outros dois pontos da linha</span></span><br><span class="line">    <span class="keyword">const</span> point1 = &#123;</span><br><span class="line">      x: center.x - xComponent,</span><br><span class="line">      y: center.y - yComponent</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> point2 = &#123;</span><br><span class="line">      x: center.x + xComponent,</span><br><span class="line">      y: center.y + yComponent</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> [point1, point2]</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  getPointOnLine(coordinate1, coordinate2, percent) &#123;</span><br><span class="line">    <span class="comment">// Calcular diferença entre coordenadas x e y</span></span><br><span class="line">    <span class="keyword">const</span> dx = coordinate2.x - coordinate1.x;</span><br><span class="line">    <span class="keyword">const</span> dy = coordinate2.y - coordinate1.y;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Calcular o ponto na linha com base no percentual</span></span><br><span class="line">    <span class="keyword">const</span> point = &#123;</span><br><span class="line">      x: coordinate1.x + (dx * percent) / <span class="number">100</span>,</span><br><span class="line">      y: coordinate1.y + (dy * percent) / <span class="number">100</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> point;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/08/22/creative-coding-experiments-3/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Gráfico - Experimentos em Programação Criativa - 2</title>
      <link>https://cgreinhold.dev/2023/08/17/creative-coding-experiments-2/</link>
      <guid>https://cgreinhold.dev/2023/08/17/creative-coding-experiments-2/</guid>
      <pubDate>Thu, 17 Aug 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo.
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Essa é mais uma tentativa de reproduzir uma imagem utilizando computação criativa, puramente para aprender coisas novas e passar o tempo. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A imagem que tentei replicar através de código desta vez é a seguinte:</p><p><img src="/images/creative-coding/part-2/cc-1.png" alt="Grid de pontos com uma linha ligando "></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-2/cc-2.png" alt="Um parecido nonagono com pontos conectando as extremidades"></p><p>Bastante diferente do original, minha ideia era de fazer algo que a cada atualização mudasse o estilo, com quadrados e pontos maiores ou menores aleatóriamente.</p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Usarei novamento o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a> para essa implementação.</p><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Começando de forma simples, vamos apenas adicionar a borda. Adicionei um cógigo boilerplate de início, definindo as corees do fundo e stroke, o tamanho da margem.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> strokeColor = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> backgroundColor = <span class="number">245</span></span><br><span class="line"><span class="keyword">let</span> frameMargin <span class="comment">// distância entre o quadro e a borda do canvas</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(windowWidth, windowHeight)</span><br><span class="line">  frameMargin = round(random(<span class="number">50</span>, <span class="number">150</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(backgroundColor)</span><br><span class="line">  drawFrame()</span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawFrame</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  strokeWeight(<span class="number">4</span>)</span><br><span class="line">  stroke(strokeColor)</span><br><span class="line">  <span class="keyword">const</span> startAt = [frameMargin, frameMargin]</span><br><span class="line">  <span class="keyword">const</span> size = [windowWidth - frameMargin * <span class="number">2</span>, windowHeight - frameMargin * <span class="number">2</span>]</span><br><span class="line"></span><br><span class="line">  rect(...startAt, ...size)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> [startAt, size]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-2/cc-3.png" alt="Canvas com apenas um quadrado"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>O segundo passo foi adicionar os pontos dentro do quadro. Criei primeiro uma função para gerar os pontos, utilizando alguns parâmetros para configurar os posicionamentos e tamanho dos pontos.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> padding <span class="comment">// distância entre o quadro e os pontos</span></span><br><span class="line"><span class="keyword">let</span> dotRadius <span class="comment">// tamanho dos pontos</span></span><br><span class="line"><span class="keyword">let</span> dotPadding <span class="comment">// distância entre os ponto</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  padding = round(random(<span class="number">-100</span>, <span class="number">100</span>))</span><br><span class="line">  dotRadius = random(<span class="number">0.1</span>, <span class="number">10</span>)</span><br><span class="line">  dotPadding = round(random(<span class="number">15</span>, <span class="number">30</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getDots</span>(<span class="params">frameBorders</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> startAt = [</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">0</span>] + padding,</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">1</span>] + padding</span><br><span class="line">  ]</span><br><span class="line">  <span class="keyword">const</span> endAt = [</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">0</span>] + frameBorders[<span class="number">1</span>][<span class="number">0</span>] - padding,</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">1</span>] + frameBorders[<span class="number">1</span>][<span class="number">1</span>] - padding</span><br><span class="line">  ]</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> curLine = startAt[<span class="number">0</span>]</span><br><span class="line">  <span class="keyword">let</span> col = startAt[<span class="number">1</span>]</span><br><span class="line">  <span class="keyword">const</span> dots = []</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">while</span> (curLine &lt; endAt[<span class="number">0</span>]) &#123;</span><br><span class="line">    <span class="keyword">const</span> columns = []</span><br><span class="line">    <span class="keyword">while</span> (col &lt; endAt[<span class="number">1</span>]) &#123;</span><br><span class="line">      <span class="keyword">const</span> x = curLine + dotRadius / <span class="number">2</span></span><br><span class="line">      <span class="keyword">const</span> y = col + dotRadius / <span class="number">2</span></span><br><span class="line">      columns.push(createVector(x, y))</span><br><span class="line">      col += dotPadding</span><br><span class="line">    &#125;</span><br><span class="line">    curLine += dotPadding</span><br><span class="line">    col = startAt[<span class="number">1</span>]</span><br><span class="line">    dots.push(columns)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> dots</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E com esses pontos, podemos fácilmente desenhá-los na tela. Adicionei também um parâmetro para definir se os círculos devem ser preenchidos ou não.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> shouldFill <span class="comment">// os pontos devem ser preenchidos?</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  shouldFill = random() &gt; <span class="number">0.5</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="keyword">const</span> dots = getDots(frameBorders)</span><br><span class="line">  drawDots(dots)</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawDots</span>(<span class="params">dots</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (shouldFill) fill(strokeColor)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; dots[i].length; j++) &#123;</span><br><span class="line">      circle(dots[i][j].x, dots[i][j].y, dotRadius)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Assim podemos ter alguns resultados diferentes, como os seguintes</p><p><img src="/images/creative-coding/part-2/cc-4.png" alt="Canvas pontos variante 1"><br><img src="/images/creative-coding/part-2/cc-5.png" alt="Canvas pontos variante 2"><br><img src="/images/creative-coding/part-2/cc-6.png" alt="Canvas pontos variante 3"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>O terceiro e último passo é desenhar a linha que atravessa o centro do quadro. O algoritmo para esse foi algo bem simples:</p><ol><li>Primeiro encontramos o centro da tela e selecionamos o ponto da primeira coluna;</li><li>Enquanto tiver uma coluna a direita, escolhemos aleatóriamente um ponto acima ou abaixo;</li><li>Desenhamos uma linha entre os dois pontos</li></ol><p>O código para isso pode ser visto abaixo</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">let lineRadius &#x2F;&#x2F; largura da linha</span><br><span class="line"></span><br><span class="line">function setup() &#123;</span><br><span class="line">  ...</span><br><span class="line">  lineRadius &#x3D; random(1, 20)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function draw() &#123;</span><br><span class="line">  ...</span><br><span class="line">  drawWalker(dots)</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function drawWalker(dots, startAtLine) &#123;</span><br><span class="line">  stroke(strokeColor)</span><br><span class="line">  noFill()</span><br><span class="line">  strokeWeight(lineRadius)</span><br><span class="line">  strokeCap(ROUND) &#x2F;&#x2F; para evitar que a linha fique com as pontas quadradas</span><br><span class="line">  strokeJoin(ROUND) &#x2F;&#x2F; para evitar que a linha fique com as juntas quadradas</span><br><span class="line">  </span><br><span class="line">  const middle &#x3D; Math.round(dots[0].length &#x2F; 2)</span><br><span class="line">  let selectedLine &#x3D; middle</span><br><span class="line">  let selectedCol &#x3D; 0</span><br><span class="line">  let previousLine &#x3D; middle</span><br><span class="line">    </span><br><span class="line">  beginShape()</span><br><span class="line">  while (selectedCol &lt; dots.length) &#123;</span><br><span class="line">    if (!dots[selectedCol] || !dots[selectedCol][selectedLine]) break</span><br><span class="line">    const dot &#x3D; dots[selectedCol][selectedLine]</span><br><span class="line">    </span><br><span class="line">    if (previousLine !&#x3D;&#x3D; selectedLine) &#123;</span><br><span class="line">      const prevDot &#x3D; dots[selectedCol][previousLine]</span><br><span class="line">      vertex(prevDot.x, prevDot.y) &#x2F;&#x2F; precisamos disso para que os pontos não sejam conectados diretamente, mas em 90º</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    vertex(dot.x, dot.y)</span><br><span class="line"></span><br><span class="line">    previousLine &#x3D; selectedLine</span><br><span class="line">    const next &#x3D; Math.round(random(-3, 3))</span><br><span class="line">    selectedLine +&#x3D; next</span><br><span class="line"></span><br><span class="line">    </span><br><span class="line">    if (selectedLine &lt; 0) selectedLine &#x3D; 0</span><br><span class="line">    if (selectedLine &#x3D;&#x3D;&#x3D; dots[0].length) selectedLine &#x3D; dots[0].length -1</span><br><span class="line"></span><br><span class="line">    selectedCol++</span><br><span class="line">  &#125;</span><br><span class="line">  endShape()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-2/cc-7.png" alt="Canvas com linha"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Algumas outras ideias para evoluir essa brincadeira seriam:</p><ul><li>Adicionar fendas ou laços como na imagem original, onde aleatóriamente poderiams quebrar a linha</li><li>Usar uma biblioteca, como o <a href="https://github.com/dataarts/dat.gui" target="_blank" rel="noopener">dat.gui</a> para configurar as variáveis em tempo real, sem precisar executar o algoritmo múltiplas vezes para novos resultados</li></ul><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> strokeColor = <span class="number">10</span></span><br><span class="line"><span class="keyword">let</span> backgroundColor = <span class="number">245</span></span><br><span class="line"><span class="keyword">let</span> frameMargin <span class="comment">// distância entre o quadro e a borda do canvas</span></span><br><span class="line"><span class="keyword">let</span> padding <span class="comment">// distância entre o quadro e os pontos</span></span><br><span class="line"><span class="keyword">let</span> dotRadius <span class="comment">// tamanho dos pontos</span></span><br><span class="line"><span class="keyword">let</span> dotPadding <span class="comment">// distância entre os ponto</span></span><br><span class="line"><span class="keyword">let</span> shouldFill <span class="comment">// os pontos devem ser vazados?</span></span><br><span class="line"><span class="keyword">let</span> lineRadius <span class="comment">// largura da linha</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(windowWidth, windowHeight)</span><br><span class="line">  frameMargin = round(random(<span class="number">50</span>, <span class="number">150</span>))</span><br><span class="line">  padding = round(random(<span class="number">-100</span>, <span class="number">100</span>))</span><br><span class="line">  dotRadius = random(<span class="number">0.1</span>, <span class="number">10</span>)</span><br><span class="line">  dotPadding = round(random(<span class="number">15</span>, <span class="number">30</span>))</span><br><span class="line">  shouldFill = random() &gt; <span class="number">0.5</span></span><br><span class="line">  lineRadius = random(<span class="number">1</span>, <span class="number">20</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(backgroundColor)</span><br><span class="line">  <span class="keyword">const</span> frameBorders = drawFrame()</span><br><span class="line">  <span class="keyword">const</span> dots = getDots(frameBorders)</span><br><span class="line">  drawDots(dots)</span><br><span class="line">  drawWalker(dots)</span><br><span class="line">  noLoop()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawFrame</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noFill()</span><br><span class="line">  strokeWeight(<span class="number">4</span>)</span><br><span class="line">  stroke(strokeColor)</span><br><span class="line">  <span class="keyword">const</span> startAt = [frameMargin, frameMargin]</span><br><span class="line">  <span class="keyword">const</span> size = [windowWidth - frameMargin * <span class="number">2</span>, windowHeight - frameMargin * <span class="number">2</span>]</span><br><span class="line"></span><br><span class="line">  rect(...startAt, ...size)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> [startAt, size]</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getDots</span>(<span class="params">frameBorders</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> startAt = [</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">0</span>] + padding,</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">1</span>] + padding</span><br><span class="line">  ]</span><br><span class="line">  <span class="keyword">const</span> endAt = [</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">0</span>] + frameBorders[<span class="number">1</span>][<span class="number">0</span>] - padding,</span><br><span class="line">    frameBorders[<span class="number">0</span>][<span class="number">1</span>] + frameBorders[<span class="number">1</span>][<span class="number">1</span>] - padding</span><br><span class="line">  ]</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">let</span> curLine = startAt[<span class="number">0</span>]</span><br><span class="line">  <span class="keyword">let</span> col = startAt[<span class="number">1</span>]</span><br><span class="line">  <span class="keyword">const</span> dots = []</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">while</span> (curLine &lt; endAt[<span class="number">0</span>]) &#123;</span><br><span class="line">    <span class="keyword">const</span> columns = []</span><br><span class="line">    <span class="keyword">while</span> (col &lt; endAt[<span class="number">1</span>]) &#123;</span><br><span class="line">      <span class="keyword">const</span> x = curLine + dotRadius / <span class="number">2</span></span><br><span class="line">      <span class="keyword">const</span> y = col + dotRadius / <span class="number">2</span></span><br><span class="line">      columns.push(createVector(x, y))</span><br><span class="line">      col += dotPadding</span><br><span class="line">    &#125;</span><br><span class="line">    curLine += dotPadding</span><br><span class="line">    col = startAt[<span class="number">1</span>]</span><br><span class="line">    dots.push(columns)</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> dots</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawDots</span>(<span class="params">dots</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (shouldFill) fill(strokeColor)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; dots[i].length; j++) &#123;</span><br><span class="line">      circle(dots[i][j].x, dots[i][j].y, dotRadius)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawWalker</span>(<span class="params">dots, startAtLine</span>) </span>&#123;</span><br><span class="line">  stroke(strokeColor)</span><br><span class="line">  noFill()</span><br><span class="line">  strokeWeight(lineRadius)</span><br><span class="line">  strokeCap(ROUND) <span class="comment">// para evitar que a linha fique com as pontas quadradas</span></span><br><span class="line">  strokeJoin(ROUND) <span class="comment">// para evitar que a linha fique com as juntas quadradas</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> middle = <span class="built_in">Math</span>.round(dots[<span class="number">0</span>].length / <span class="number">2</span>)</span><br><span class="line">  <span class="keyword">let</span> selectedLine = middle</span><br><span class="line">  <span class="keyword">let</span> selectedCol = <span class="number">0</span></span><br><span class="line">  <span class="keyword">let</span> previousLine = middle</span><br><span class="line">    </span><br><span class="line">  beginShape()</span><br><span class="line">  <span class="keyword">while</span> (selectedCol &lt; dots.length) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!dots[selectedCol] || !dots[selectedCol][selectedLine]) <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">const</span> dot = dots[selectedCol][selectedLine]</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (previousLine !== selectedLine) &#123;</span><br><span class="line">      <span class="keyword">const</span> prevDot = dots[selectedCol][previousLine]</span><br><span class="line">      vertex(prevDot.x, prevDot.y)</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    vertex(dot.x, dot.y)</span><br><span class="line"></span><br><span class="line">    previousLine = selectedLine</span><br><span class="line">    <span class="keyword">const</span> next = <span class="built_in">Math</span>.round(random(<span class="number">-3</span>, <span class="number">3</span>))</span><br><span class="line">    selectedLine += next</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (selectedLine &lt; <span class="number">0</span>) selectedLine = <span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span> (selectedLine === dots[<span class="number">0</span>].length) selectedLine = dots[<span class="number">0</span>].length <span class="number">-1</span></span><br><span class="line"></span><br><span class="line">    selectedCol++</span><br><span class="line">  &#125;</span><br><span class="line">  endShape()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/08/17/creative-coding-experiments-2/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Bactéria - Experimentos em Programação Criativa</title>
      <link>https://cgreinhold.dev/2023/08/01/creative-coding-experiments/</link>
      <guid>https://cgreinhold.dev/2023/08/01/creative-coding-experiments/</guid>
      <pubDate>Tue, 01 Aug 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Há alguns anos passei a ter um interesse por programação criativa, e apesar de consumir bastante conteúdo sobre o tema, foram poucas as v
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Há alguns anos passei a ter um interesse por programação criativa, e apesar de consumir bastante conteúdo sobre o tema, foram poucas as vezes que de fato implementei algo.</p><p>Com várias imagens e gifs de inspiração salvas nesse tempo, quero começar a tentar implementar cada uma dessas ideias. Esses artigos são principalmente criados como uma forma de catalogar o processo de implementação para referencia futura quando eu estiver desenvolvendo novas coisas.</p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>A primeira imagem que tentei replicar através de código é essa:</p><p><img src="/images/creative-coding/part-1/cc-1.png" alt="Nonagono com pontos conectando as extremidades"></p><p>E o meu resultado é o seguinte:</p><p><img src="/images/creative-coding/part-1/cc-2.png" alt="Um parecido nonagono com pontos conectando as extremidades"></p><h2 id="Implementacao"><a href="#Implementacao" class="headerlink" title="Implementação"></a>Implementação</h2><p>Para implementação dos algoritmos, tenho usado o <a href="https://editor.p5js.org" target="_blank" rel="noopener">editor do p5</a>.</p><p>Este editor utiliza a própria biblioteca do p5.js, e já conta com um código boilerplate com duas funções: <code>setup</code>, que é disparado antes que qualquer coisa seja desenhada no canvas, e <code>draw</code> que é o loop onde atualizamos o canvas.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  background(<span class="number">220</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Passo-1"><a href="#Passo-1" class="headerlink" title="Passo 1"></a>Passo 1</h2><p>Decidi começar de forma simples, apenas adicionando um polígono no centro da imagem. O p5.js possui algumas funções auxiliares para circulos e quadrados, mas para polígonos o mais fácil é começar adicionando pontos na tela e depois conectá-los.</p><p>Como queremos fazer polígonos regulares, onde todos os lados sejam iguais, podemos calcular os pontos com base no seno e coseno de um ângulo, e incrementar esse angulo com base na quantidade de lados</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noLoop() <span class="comment">// para evitar que a tela atualize muitas vezes</span></span><br><span class="line">  background(<span class="number">255</span>)</span><br><span class="line">  strokeWeight(<span class="number">5</span>) <span class="comment">// grossura dos pontos/linhas</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> sides = <span class="number">8</span></span><br><span class="line">  <span class="keyword">const</span> radius = <span class="number">100</span></span><br><span class="line">  <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; sides; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> pointX = radius * sin(angle)</span><br><span class="line">    <span class="keyword">const</span> pointY = radius * cos(angle)</span><br><span class="line">    </span><br><span class="line">    point(pointX + width/<span class="number">2</span>, pointY + height/<span class="number">2</span>)</span><br><span class="line">    </span><br><span class="line">    angle = angle + TWO_PI / sides</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-1/cc-3.png" alt="Pontos no canvas"></p><p>Para conectar os pontos, podemos ao invés de usar a função <code>point(x, y)</code>, usarmos o <code>vertex(x, y)</code> em conjunto com <code>beginShape()</code> e <code>endShape(CLOSE)</code>.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noLoop()</span><br><span class="line">  background(<span class="number">255</span>)</span><br><span class="line">  strokeWeight(<span class="number">5</span>)</span><br><span class="line">  noFill() <span class="comment">// Para que o polígono não seja preenchido</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> vertexes = getPoligonVertexes()</span><br><span class="line">  </span><br><span class="line">  beginShape()</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; vertexes.length; i++) &#123;</span><br><span class="line">    vertex(vertexes[i].x, vertexes[i].y)</span><br><span class="line">  &#125;</span><br><span class="line">  endShape(CLOSE)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getPoligonVertexes</span>(<span class="params">radius = <span class="number">100</span>, sides = <span class="number">8</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> vertexes = []</span><br><span class="line">  <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; sides; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> pointX = radius * sin(angle)</span><br><span class="line">    <span class="keyword">const</span> pointY = radius * cos(angle)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> vector = createVector(pointX + width / <span class="number">2</span>, pointY + height / <span class="number">2</span>)</span><br><span class="line">    vertexes.push(vector)</span><br><span class="line">    </span><br><span class="line">    angle = angle + TWO_PI / sides</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> vertexes</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-1/cc-4.png" alt="Polígono completo"></p><h2 id="Passo-2"><a href="#Passo-2" class="headerlink" title="Passo 2"></a>Passo 2</h2><p>O próximo passo foi adicionar os tentáculos saindo do polígono. Pensei em duas formas que isso poderia ser feito: 1. selecionar pontos aleatórios ao redor do polígono e conectá-los à extremidade mais próxima, ou 2. selecionar pontos aleatórios nas extremidades e caminhar até algum ponto mais distante.</p><p>Em minha implementação escolhei a primeira opção. Para isso criei uma função que gera pontos a partir de um ângulo aleatório, e posiciono ele em um raio próximo ao raio de nosso polígono.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> dots = getDots()</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    point(dots[i].x, dots[i].y)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getDots</span>(<span class="params">count = <span class="number">100</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> minRadius = width / <span class="number">5</span></span><br><span class="line">  <span class="keyword">const</span> maxRadius = width / <span class="number">3</span></span><br><span class="line">  <span class="keyword">const</span> dots = []</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; count; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> angle = <span class="built_in">Math</span>.random() * TWO_PI</span><br><span class="line">    <span class="keyword">const</span> x = <span class="built_in">Math</span>.cos(angle) * random(minRadius, maxRadius) + width / <span class="number">2</span></span><br><span class="line">    <span class="keyword">const</span> y = <span class="built_in">Math</span>.sin(angle) * random(minRadius, maxRadius) + height / <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> vector = createVector(x, y)</span><br><span class="line">    dots.push(vector)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> dots</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-1/cc-5.png" alt="Polígono e pontos"></p><p>Para conectar esses pontos ao polígono pedi ajuda para o ChatGPT. Aparentemente a forma mais simples é encontrar o ponto de menor distância entre um vértice e um segmento de linha, e fazer isso para todas as arestas de um polígono. Assim conseguimos encontrar qual o ponto mais próximo do vértice e do polígono. O próprio ChatGPT me ajudou criando o código para essa etapa:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getClosestPolygonVertex</span>(<span class="params">vertex, polygonVertexes = []</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> closest</span><br><span class="line">  <span class="keyword">let</span> closestDistance = <span class="literal">Infinity</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; polygonVertexes.length; i++) &#123;</span><br><span class="line">    <span class="comment">// Loop entre os vertices do polígonos, pegando o atual e o seguinte, que formam a linha</span></span><br><span class="line">    <span class="keyword">const</span> isLast = (i+<span class="number">1</span>) === polygonVertexes.length</span><br><span class="line">    <span class="keyword">const</span> v1 = polygonVertexes[i]</span><br><span class="line">    <span class="keyword">const</span> v2 = polygonVertexes[isLast ? <span class="number">0</span> : i+<span class="number">1</span>]</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> closestPoint = getClosestPointFromVertexToLine(vertex, v1, v2)</span><br><span class="line">    <span class="keyword">const</span> distance = distanceFromVertexes(vertex, closestPoint)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (distance &lt; closestDistance) &#123;</span><br><span class="line">      closestDistance = distance</span><br><span class="line">      closest = closestPoint</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> closest</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getClosestPointFromVertexToLine</span>(<span class="params">vertex, lineStart, lineEnd</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// Calculate the vector representing the line segment</span></span><br><span class="line">  <span class="keyword">const</span> lineSegmentVector = createVector(lineEnd.x - lineStart.x, lineEnd.y - lineStart.y)</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Calculate the vector from the line segment start to the vertex</span></span><br><span class="line">  <span class="keyword">const</span> vertexVector = createVector(vertex.x - lineStart.x, vertex.y - lineStart.y)</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the dot product of the line segment vector and the vertex vector</span></span><br><span class="line">  <span class="keyword">const</span> dotProduct = lineSegmentVector.x * vertexVector.x + lineSegmentVector.y * vertexVector.y;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the squared length of the line segment vector</span></span><br><span class="line">  <span class="keyword">const</span> squaredLength = lineSegmentVector.x * lineSegmentVector.x + lineSegmentVector.y * lineSegmentVector.y;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the parameter value of the closest point on the line segment to the vertex</span></span><br><span class="line">  <span class="keyword">const</span> t = <span class="built_in">Math</span>.max(<span class="number">0</span>, <span class="built_in">Math</span>.min(<span class="number">1</span>, dotProduct / squaredLength));</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the coordinates of the closest point on the line segment</span></span><br><span class="line">  <span class="keyword">const</span> closestPoint = createVector(lineStart.x + t * lineSegmentVector.x, lineStart.y + t * lineSegmentVector.y)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> closestPoint</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">distanceFromVertexes</span>(<span class="params">vertex1, vertex2</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">Math</span>.sqrt(</span><br><span class="line">    (vertex1.x - vertex2.x) * (vertex1.x - vertex2.x) +</span><br><span class="line">    (vertex1.y - vertex2.y) * (vertex1.y - vertex2.y)</span><br><span class="line">  )</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Com essas funções, podemos atualizar o método <code>draw</code> para desenhar a linha entre os pontos e o polígono:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> dots = getDots()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    <span class="comment">// Desenhando o ponto</span></span><br><span class="line">    strokeWeight(<span class="number">10</span>)</span><br><span class="line">    point(dots[i].x, dots[i].y)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Desenhando a linha</span></span><br><span class="line">    strokeWeight(<span class="number">2</span>) <span class="comment">// Alterando a largura entre o ponto e a linha</span></span><br><span class="line">    beginShape()</span><br><span class="line">    vertex(dots[i].x, dots[i].y)</span><br><span class="line">    <span class="keyword">const</span> closestPolygonVertex = getClosestPolygonVertex(dots[i], vertexes)</span><br><span class="line">    vertex(closestPolygonVertex.x, closestPolygonVertex.y)</span><br><span class="line">    endShape(CLOSE) </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/images/creative-coding/part-1/cc-6.png" alt="Polígono e pontos conectados"></p><h2 id="Passo-3"><a href="#Passo-3" class="headerlink" title="Passo 3"></a>Passo 3</h2><p>O terceiro e último passo de minha implementação foi deixas os tentáculos curvados, ao invés de simples linhas retas. Para isso, uma forma fácil é segmentar a reta em <code>n</code> pontos e movê-los de forma aleatória para uma direção próxima.</p><p><img src="/images/creative-coding/part-1/cc-7.png" alt="Segmentos do tentáculo"><br><img src="/images/creative-coding/part-1/cc-8.png" alt="Segmentos do tentáculo com movimento"></p><p>Para segmentar a linha, pedi uma nova ajuda ao ChatGPT:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">segmentizeLine</span>(<span class="params">lineSegmentStart, lineSegmentEnd, segmentCount = <span class="number">10</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> points = [];</span><br><span class="line">  <span class="keyword">const</span> dx = (lineSegmentEnd.x - lineSegmentStart.x) / (segmentCount - <span class="number">1</span>);</span><br><span class="line">  <span class="keyword">const</span> dy = (lineSegmentEnd.y - lineSegmentStart.y) / (segmentCount - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; segmentCount; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = lineSegmentStart.x + dx * i;</span><br><span class="line">    <span class="keyword">let</span> y = lineSegmentStart.y + dy * i;</span><br><span class="line"></span><br><span class="line">    points.push(&#123; x, y &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> points;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Fiz uma leve alteração para mover os segmentos centrais:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">segmentizeLine</span>(<span class="params">lineSegmentStart, lineSegmentEnd, segmentCount = <span class="number">10</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> points = [];</span><br><span class="line">  <span class="keyword">const</span> dx = (lineSegmentEnd.x - lineSegmentStart.x) / (segmentCount - <span class="number">1</span>);</span><br><span class="line">  <span class="keyword">const</span> dy = (lineSegmentEnd.y - lineSegmentStart.y) / (segmentCount - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; segmentCount; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = lineSegmentStart.x + dx * i;</span><br><span class="line">    <span class="keyword">let</span> y = lineSegmentStart.y + dy * i;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Não queremos mover a posição do primeiro vértice e do vértice que encosta no polígono</span></span><br><span class="line">    <span class="keyword">if</span> (i &gt; <span class="number">0</span> &amp;&amp; i &lt; segmentCount<span class="number">-1</span>) &#123;</span><br><span class="line">      x += random(<span class="number">0</span>, <span class="number">15</span>)</span><br><span class="line">      y += random(<span class="number">0</span>, <span class="number">15</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Para utilizar a função `curveVertex` precisamos do primeiro e último vértices duplicados</span></span><br><span class="line">    <span class="keyword">if</span> (i === <span class="number">0</span> || i === segmentCount<span class="number">-1</span>) &#123;</span><br><span class="line">      points.push(createVector(x, y));  </span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    points.push(createVector(x, y));</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> points;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>E utilizando essa função junto com o <code>curveVertex</code>, conseguimos ter os tentáculos curvos:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  ...</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> dots = getDots()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    stroke(<span class="string">'black'</span>)</span><br><span class="line">    strokeWeight(<span class="number">10</span>)</span><br><span class="line">    point(dots[i].x, dots[i].y)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Desenhando a linha</span></span><br><span class="line">    strokeWeight(<span class="number">2</span>) <span class="comment">// Alterando a largura entre o ponto e a linha</span></span><br><span class="line">    <span class="keyword">const</span> closestPolygonVertex = getClosestPolygonVertex(dots[i], vertexes)</span><br><span class="line">    <span class="keyword">const</span> segments = segmentizeLine(dots[i], closestPolygonVertex, <span class="number">6</span>)</span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; segments.length; j++) &#123;</span><br><span class="line">      curveVertex(segments[j].x, segments[j].y)</span><br><span class="line">    &#125;</span><br><span class="line">    endShape() </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Assim tempos o resultado final:</p><p><img src="/images/creative-coding/part-1/cc-9.png" alt="Resultado final"></p><h2 id="Proximos-passos"><a href="#Proximos-passos" class="headerlink" title="Próximos passos"></a>Próximos passos</h2><p>Para chegar mais próximo do original, algumas possível mudanças seriam:</p><ul><li>Alterar a forma como adicionamos aleatóriedade nos segmentos do tentáculo para ficarem menos distantes, talvez utilizando <code>noise</code> ao invés de <code>random</code></li><li>Alterar a aleatóriedade dos pontos para que não sejam gerados pontos tão próximos do polígono</li></ul><p>Por mais que ainda possa ser melhorado, fiquei satisfeito com esse resultado e empolgado para começar um próximo. </p><details>  <summary>    Código completo  </summary>  <p>    <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">setup</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  createCanvas(<span class="number">400</span>, <span class="number">400</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  noLoop()</span><br><span class="line">  background(<span class="number">255</span>)</span><br><span class="line">  strokeWeight(<span class="number">5</span>)</span><br><span class="line">  noFill() <span class="comment">// Para que o polígono não seja preenchido</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> vertexes = getPoligonVertexes()</span><br><span class="line">  </span><br><span class="line">  beginShape()</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; vertexes.length; i++) &#123;</span><br><span class="line">    vertex(vertexes[i].x, vertexes[i].y)</span><br><span class="line">  &#125;</span><br><span class="line">  endShape(CLOSE)</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> dots = getDots()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dots.length; i++) &#123;</span><br><span class="line">    stroke(<span class="string">'black'</span>)</span><br><span class="line">    strokeWeight(<span class="number">10</span>)</span><br><span class="line">    point(dots[i].x, dots[i].y)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Desenhando a linha</span></span><br><span class="line">    strokeWeight(<span class="number">2</span>) <span class="comment">// Alterando a largura entre o ponto e a linha</span></span><br><span class="line">    <span class="keyword">const</span> closestPolygonVertex = getClosestPolygonVertex(dots[i], vertexes)</span><br><span class="line">    <span class="keyword">const</span> segments = segmentizeLine(dots[i], closestPolygonVertex, <span class="number">6</span>)</span><br><span class="line">    beginShape()</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; segments.length; j++) &#123;</span><br><span class="line">      curveVertex(segments[j].x, segments[j].y)</span><br><span class="line">    &#125;</span><br><span class="line">    endShape() </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getPoligonVertexes</span>(<span class="params">radius = <span class="number">100</span>, sides = <span class="number">8</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> vertexes = []</span><br><span class="line">  <span class="keyword">let</span> angle = <span class="number">0</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; sides; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> pointX = radius * sin(angle)</span><br><span class="line">    <span class="keyword">const</span> pointY = radius * cos(angle)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> vector = createVector(pointX + width/<span class="number">2</span>, pointY + height/<span class="number">2</span>)</span><br><span class="line">    vertexes.push(vector)</span><br><span class="line">    </span><br><span class="line">    angle = angle + TWO_PI / sides</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> vertexes</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getDots</span>(<span class="params">count = <span class="number">100</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> minRadius = width / <span class="number">6</span></span><br><span class="line">  <span class="keyword">const</span> maxRadius = width / <span class="number">2.5</span></span><br><span class="line">  <span class="keyword">const</span> dots = []</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; count; i++) &#123;</span><br><span class="line">    <span class="keyword">const</span> angle = <span class="built_in">Math</span>.random() * TWO_PI</span><br><span class="line">    <span class="keyword">const</span> x = <span class="built_in">Math</span>.cos(angle) * random(minRadius, maxRadius) + width / <span class="number">2</span></span><br><span class="line">    <span class="keyword">const</span> y = <span class="built_in">Math</span>.sin(angle) * random(minRadius, maxRadius) + height / <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> vector = createVector(x, y)</span><br><span class="line">    dots.push(vector)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> dots</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getClosestPolygonVertex</span>(<span class="params">vertex, polygonVertexes = []</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> closest</span><br><span class="line">  <span class="keyword">let</span> closestDistance = <span class="literal">Infinity</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; polygonVertexes.length; i++) &#123;</span><br><span class="line">    <span class="comment">// Loop entre os vertices do polígonos, pegando o atual e o seguinte, que formam a linha</span></span><br><span class="line">    <span class="keyword">const</span> isLast = (i+<span class="number">1</span>) === polygonVertexes.length</span><br><span class="line">    <span class="keyword">const</span> v1 = polygonVertexes[i]</span><br><span class="line">    <span class="keyword">const</span> v2 = polygonVertexes[isLast ? <span class="number">0</span> : i+<span class="number">1</span>]</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> closestPoint = getClosestPointFromVertexToLine(vertex, v1, v2)</span><br><span class="line">    <span class="keyword">const</span> distance = distanceFromVertexes(vertex, closestPoint)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (distance &lt; closestDistance) &#123;</span><br><span class="line">      closestDistance = distance</span><br><span class="line">      closest = closestPoint</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> closest</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getClosestPointFromVertexToLine</span>(<span class="params">vertex, lineStart, lineEnd</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// Calculate the vector representing the line segment</span></span><br><span class="line">  <span class="keyword">const</span> lineSegmentVector = createVector(lineEnd.x - lineStart.x, lineEnd.y - lineStart.y)</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Calculate the vector from the line segment start to the vertex</span></span><br><span class="line">  <span class="keyword">const</span> vertexVector = createVector(vertex.x - lineStart.x, vertex.y - lineStart.y)</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the dot product of the line segment vector and the vertex vector</span></span><br><span class="line">  <span class="keyword">const</span> dotProduct = lineSegmentVector.x * vertexVector.x + lineSegmentVector.y * vertexVector.y;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the squared length of the line segment vector</span></span><br><span class="line">  <span class="keyword">const</span> squaredLength = lineSegmentVector.x * lineSegmentVector.x + lineSegmentVector.y * lineSegmentVector.y;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the parameter value of the closest point on the line segment to the vertex</span></span><br><span class="line">  <span class="keyword">const</span> t = <span class="built_in">Math</span>.max(<span class="number">0</span>, <span class="built_in">Math</span>.min(<span class="number">1</span>, dotProduct / squaredLength));</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Calculate the coordinates of the closest point on the line segment</span></span><br><span class="line">  <span class="keyword">const</span> closestPoint = createVector(lineStart.x + t * lineSegmentVector.x, lineStart.y + t * lineSegmentVector.y)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> closestPoint</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">distanceFromVertexes</span>(<span class="params">vertex1, vertex2</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">Math</span>.sqrt(</span><br><span class="line">    (vertex1.x - vertex2.x) * (vertex1.x - vertex2.x) +</span><br><span class="line">    (vertex1.y - vertex2.y) * (vertex1.y - vertex2.y)</span><br><span class="line">  )</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">segmentizeLine</span>(<span class="params">lineSegmentStart, lineSegmentEnd, segmentCount = <span class="number">10</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> points = [];</span><br><span class="line">  <span class="keyword">const</span> dx = (lineSegmentEnd.x - lineSegmentStart.x) / (segmentCount - <span class="number">1</span>);</span><br><span class="line">  <span class="keyword">const</span> dy = (lineSegmentEnd.y - lineSegmentStart.y) / (segmentCount - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; segmentCount; i++) &#123;</span><br><span class="line">    <span class="keyword">let</span> x = lineSegmentStart.x + dx * i;</span><br><span class="line">    <span class="keyword">let</span> y = lineSegmentStart.y + dy * i;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Não queremos mover a posição do primeiro vértice e do vértice que encosta no polígono</span></span><br><span class="line">    <span class="keyword">if</span> (i &gt; <span class="number">0</span> &amp;&amp; i &lt; segmentCount<span class="number">-1</span>) &#123;</span><br><span class="line">      x += random(<span class="number">0</span>, <span class="number">15</span>)</span><br><span class="line">      y += random(<span class="number">0</span>, <span class="number">15</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Para utilizar a função `curveVertex` precisamos do primeiro e último vértices duplicados</span></span><br><span class="line">    <span class="keyword">if</span> (i === <span class="number">0</span> || i === segmentCount<span class="number">-1</span>) &#123;</span><br><span class="line">      points.push(createVector(x, y));  </span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    points.push(createVector(x, y));</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> points;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>  </p></details>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/08/01/creative-coding-experiments/#disqus_thread</comments>
    </item>
    
    <item>
      <title>QRCode Playground</title>
      <link>https://cgreinhold.dev/2023/05/23/qrcode/</link>
      <guid>https://cgreinhold.dev/2023/05/23/qrcode/</guid>
      <pubDate>Tue, 23 May 2023 22:00:00 GMT</pubDate>
      <description>
      
        
        
          
&lt;script&gt;
  window.location.replace(&quot;https://qrcode.cgreinhold.dev&quot;)
&lt;/script&gt;


        
      
      </description>
      
      
      <content:encoded><![CDATA[<script>  window.location.replace("https://qrcode.cgreinhold.dev")</script>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2023/05/23/qrcode/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Circles</title>
      <link>https://cgreinhold.dev/2021/07/29/circles/</link>
      <guid>https://cgreinhold.dev/2021/07/29/circles/</guid>
      <pubDate>Thu, 29 Jul 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Esta é uma biblioteca de círclos. Você pode usá-la para encontrar qual círculo serve melhor para sua vontade.&lt;/p&gt;
&lt;p&gt;Obs.: Ao contrário d
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Esta é uma biblioteca de círclos. Você pode usá-la para encontrar qual círculo serve melhor para sua vontade.</p><p>Obs.: Ao contrário do esperado, alguns círculos podem não girar corretamente.</p><style>.container {  display: flex;  flex-wrap: wrap;}.box {  border: 1px solid #383838;  padding: 6px;  margin: 6px;  position: relative;  width: 10em;  height: 10em;  display: flex;  flex-direction: column;  align-items: center;  text-align: center;  cursor: pointer;}.box:hover {  border-width: 3px;}.char {  animation: spin 4s linear infinite;  position: absolute;  font-size: 5em;  flex: 1;  text-align: center;}.code {  margin-top: 7em;  text-align: center;}@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }</style><script>const circles = [  { char: '0', code: 'U+0030' },  { char: 'O', code: 'U+004F' },  { char: 'o', code: 'U+006F' },  { char: '®', code: 'U+00AE' },  { char: '©', code: 'U+00A9' },  { char: '֯', code: 'U+05AF' },  { char: '⃝', code: 'U+20DD' },  { char: '⃠', code: 'U+20E0' },  { char: '⌽', code: 'U+233D' },  { char: '⌾', code: 'U+233E' },  { char: '⍉', code: 'U+2349' },  { char: '⍟', code: 'U+235F' },  { char: '❂', code: 'U+2742' },  { char: '⍜', code: 'U+235C' },  { char: '⍥', code: 'U+2365' },  { char: '⏺', code: 'U+23FA' },  { char: '⏣', code: 'U+23E3' },  { char: '◍', code: 'U+25CD' },  { char: '●', code: 'U+25CB' },  { char: '◌', code: 'U+25CC' },  { char: '●', code: 'U+25CF' },  { char: '◐', code: 'U+25D0' },  { char: '◑', code: 'U+25D1' },  { char: '◒', code: 'U+25D2' },  { char: '◓', code: 'U+25D3' },  { char: '◔', code: 'U+25D4' },  { char: '◕', code: 'U+25D5' },  { char: '◯', code: 'U+25EF' },  { char: '◴', code: 'U+25F4' },  { char: '◵', code: 'U+25F5' },  { char: '◶', code: 'U+25F6' },  { char: '◷', code: 'U+25F7' },  { char: '⚆', code: 'U+2686' },  { char: '⚇', code: 'U+2687' },  { char: '⚈', code: 'U+2688' },  { char: '⚉', code: 'U+2689' },  { char: '⚪', code: 'U+26AA' },  { char: '⚫', code: 'U+26AB' },  { char: '⚬', code: 'U+26AC' },  { char: '⛞', code: 'U+26DE' },  { char: '⛣', code: 'U+26E3' },  { char: '❍', code: 'U+274D' },  { char: '⦵', code: 'U+29B5' },  { char: '⦺', code: 'U+29BA' },  { char: '⦹', code: 'U+29B9' },  { char: '⨀', code: 'U+2A00' },  { char: '⦻', code: 'U+29BB' },  { char: '⦽', code: 'U+29BD' },  { char: '⧂', code: 'U+29C2' },  { char: '⧃', code: 'U+29C3' },  { char: '⬤', code: 'U+2B24' },  { char: '⭗', code: 'U+2B57' },  { char: '⭘', code: 'U+2B58' },  { char: '￮', code: 'U+FFEE' },  { char: '𐩑', code: 'U+10A51' },  { char: '𐩒', code: 'U+10A52' },  { char: '🔾', code: 'U+1F53E' },  { char: '🔿', code: 'U+1F53F' },  { char: '🞄', code: 'U+1F784' },  { char: '🞅', code: 'U+1F785' },  { char: '🞇', code: 'U+1F787' },  { char: '🞉', code: 'U+1F789' },  { char: '⊕', code: 'U+2295' },  { char: '⊖', code: 'U+2296' },  { char: '⊗', code: 'U+2297' },  { char: '⊘', code: 'U+2298' },  { char: '⊙', code: 'U+2299' },  { char: '⊚', code: 'U+229A' },  { char: '⊛', code: 'U+229B' },  { char: '⊜', code: 'U+229C' },  { char: '⊝', code: 'U+229D' },  { char: '⌼', code: 'U+233C' },  { char: '⎉', code: 'U+2389' },  { char: '⎊', code: 'U+238A' },  { char: '◉', code: 'U+25C9' },  { char: '◎', code: 'U+25CE' },  { char: 'ꙮ', code: 'U+A66E' },  { char: 'Ꙩ', code: 'U+A668' },  { char: 'ꙩ', code: 'U+A669' },  { char: 'Ꙫ', code: 'U+A66A' },  { char: 'ꙫ', code: 'U+A66B' },  { char: '⧲', code: 'U+29F2' },  { char: '⧳', code: 'U+29F3' },  { char: '⦼', code: 'U+29BC' },  { char: '⧀', code: 'U+29C0' },  { char: '⧁', code: 'U+29C1' },  { char: '☀', code: 'U+2600' },  { char: '☢', code: 'U+2622' },  { char: '☮', code: 'U+262E' },  { char: '☯', code: 'U+263F' },  { char: '☸', code: 'U+2638' },  { char: '⛭', code: 'U+26ED' },  { char: '⛮', code: 'U+26EE' },  { char: '⛯', code: 'U+26EF' },  { char: '⦁', code: 'U+2981' },  { char: '⦂', code: 'U+2982' },  { char: '⨷', code: 'U+2A37' },  { char: '⚲', code: 'U+26B2' },  { char: '◖', code: 'U+25D6' },  { char: '◗', code: 'U+25D7' },  { char: '⏲', code: 'U+23F2' },  { char: 'ↀ', code: 'U+2180' },  { char: 'ↂ', code: 'U+2182' },  { char: 'ↈ', code: 'U+2188' },  { char: 'Ɵ', code: 'U+019F' },  { char: 'Ơ', code: 'U+01A0' },  { char: '˚', code: 'U+02DA' },  { char: 'Ο', code: 'U+039F' },  { char: 'Θ', code: 'U+0398' },  { char: 'Φ', code: 'U+03A6' },  { char: ' ҈', code: 'U+0488' },  { char: ' ҉', code: 'U+0489' },  { char: '•', code: 'U+0489' },  { char: 'ₒ', code: 'U+2092' },];const container = document.createElement('div');container.className = 'container';const parent = document.querySelector('div[itemprop="articleBody"]');parent.appendChild(container);circles.sort((a,b) => a.char>b.char ? 1 : 0).forEach(circle => {  const div = document.createElement('div');  div.className = 'box';  div.addEventListener('click', () => {    navigator.clipboard.writeText(circle.char).then(function() {      console.log('Copying to clipboard was successful!');    }, function(err) {      console.error('Could not copy text: ', err);    });  });  const char = document.createElement('div');  char.className = 'char';  char.innerText = circle.char;  div.appendChild(char);  const code = document.createElement('div');  code.className = 'code';  code.innerText = circle.code;  div.appendChild(code);  container.appendChild(div);});</script>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/07/29/circles/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Ideias bobas funcionam</title>
      <link>https://cgreinhold.dev/2021/06/28/fool/</link>
      <guid>https://cgreinhold.dev/2021/06/28/fool/</guid>
      <pubDate>Mon, 28 Jun 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Por bastante tempo eu evitei fazer atividades no meu tempo livre por achar que não serviriam de nada, ou não trariam nenhum ganho. A gran
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Por bastante tempo eu evitei fazer atividades no meu tempo livre por achar que não serviriam de nada, ou não trariam nenhum ganho. A grande maioria dessas atividades era relacionada a programação. </p><p>Programar no tempo livre sempre foi um dilema para mim. Por mais que eu goste de programar, já faço isso por mais de oito horas todos os dias, e fazer isso no tempo livre só me deixava com mais desgosto pela atividade.</p><p>A criação desse site foi o que mudou essa mentalidade para mim. Com o site criei a ideia de que não iria usar meu tempo livre para “aprender uma tecnologia nova” e sim para “experimentar ideias que passaram pela minha cabeça”.</p><p>Com isso, ao invés de eu tentar fazer um <em>aplicativo para agendamentos</em>, um <em>gerenciador de finanças</em> ou um <em>clone do Netflix</em>, passei a fazer as ideias mais toscas que tinha simplesmente para verificar se era possível ou viável.</p><p>Com isso acabei fazendo muita coisa no último ano, desde pequenos experimentos de arte generativa até uma <a href="https://mariachi.cgreinhold.dev/" target="_blank" rel="noopener">banda de mariachis</a>.</p><p>Esses pequenos projetos não só me ensinaram bastante coisa como serviram para continuar praticando e sendo um passatempo que me diverte.</p><p>Não acho que fazer clones de sites famosos, ou passar seu tempo livre estudando uma tecnologia seja algo inútil, mas com certeza você estará gastando seu tempo de uma forma melhor se fizer algo porque tem vontade e não por uma “obrigação pessoal” de continuar aprendendo.</p>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/06/28/fool/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Font Challenge</title>
      <link>https://cgreinhold.dev/2021/06/16/font-challenge/</link>
      <guid>https://cgreinhold.dev/2021/06/16/font-challenge/</guid>
      <pubDate>Wed, 16 Jun 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;CSS é uma linguagem que está sempre em evolução, e a cada vez que pesquiso encontro novas propriedades e atributos que não fazia ideia ex
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>CSS é uma linguagem que está sempre em evolução, e a cada vez que pesquiso encontro novas propriedades e atributos que não fazia ideia existir.</p><p>Alguns dos que fiquei mais surpreso foi em relação a fontes, que podem auxiliar bastante e evitar a utilização de JavaScript de forma desnecessária.</p><p>Conhecendo essas novas propriedades, criei então o <a href="https://font-challenge.cgreinhold.dev/" target="_blank" rel="noopener">Font Challenge</a>, um pequeno jogo para me desafiar a relembrar cada uma dessas propriedades.</p><p><img src="/images/challenge.PNG" alt="Font challenge"></p><p>Neste desafio, cada nível apresentará uma atualização para o texto e o seu objetivo é tentar encontrar qual o atributo CSS necessário para essa atualização.</p><p>No começo parecerá fácil, mas quero ver você conseguir chegar até o final sem pedir ajuda.</p>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/06/16/font-challenge/#disqus_thread</comments>
    </item>
    
    <item>
      <title>CSS Star Wars</title>
      <link>https://cgreinhold.dev/2021/05/20/star-wars/</link>
      <guid>https://cgreinhold.dev/2021/05/20/star-wars/</guid>
      <pubDate>Thu, 20 May 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Todos sabem que Star Wars foi um filme revolucionário para a sua época. Já em sua abertura o filme chama atenção com uma introdução em le
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Todos sabem que Star Wars foi um filme revolucionário para a sua época. Já em sua abertura o filme chama atenção com uma introdução em letras amarelas e uma perspectiva que faz com que o texto se perca no espaço.</p><p>Apesar de já replicada infinitas vezes, o objetivo desse artigo também é tentar replicar essa instrodução utilizando apenas CSS e HTML, sem a utilização de Javascript.</p><h2 id="Cor-de-fundo"><a href="#Cor-de-fundo" class="headerlink" title="Cor de fundo"></a>Cor de fundo</h2><p>Para replicarmos a introdução do Star Wars vamos começar com pequenos passos.</p><p>Primeiro, simplesmente mudamos o background da nossa página para preto. Vamos nessa etapa mudar temporariamente a fonte para branco para evitar que o texto suma no nosso espaço.</p><p>Essas alterações podem ser feitas apenas com a seguinte classe:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.black-sky</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: black;</span><br><span class="line">  <span class="attribute">color</span>: white;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Estrelas"><a href="#Estrelas" class="headerlink" title="Estrelas"></a>Estrelas</h2><p>Na sequência adicionamos as estrelas do nosso espaço.</p><p>Para as estrelas, vamos utilizar um truque famoso do CSS utilizando o box-shadow. O truque consiste em basicamente criar uma div de um pixel de largura e altura (o tamanho de nossas estrelas), posicionado de forma absoluta na nossa tela.</p><p>Essa div terá diversas sombras de cor branca em posições espalhadas da tela, que terão o mesmo tamanho da nossa div. Dessa forma temos o efeito de várias estrelas brancas. <a href="https://css-tricks.com/fun-times-css-pixel-art/" target="_blank" rel="noopener">Este artigo</a> explica mais profundamente como esse truque funciona.</p><p>Esse truque pode ser expandido, adicionando outras divs com tamanhos maiores de estrelas, ou com efeitos de brilho.</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.stars</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">100px</span>;</span><br><span class="line">  <span class="attribute">left</span>: -<span class="number">700px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">1px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1px</span>;</span><br><span class="line">  <span class="attribute">background</span>: transparent;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">970px</span> <span class="number">909px</span> <span class="number">#FFF</span> , <span class="number">1px</span> <span class="number">149px</span> <span class="number">#FFF</span> , <span class="number">736px</span> <span class="number">348px</span> <span class="number">#FFF</span> , <span class="number">1352px</span> <span class="number">1333px</span> <span class="number">#FFF</span> , <span class="number">57px</span> <span class="number">1598px</span> <span class="number">#FFF</span> , <span class="number">1007px</span> <span class="number">332px</span> <span class="number">#FFF</span> , <span class="number">1474px</span> <span class="number">782px</span> <span class="number">#FFF</span> , <span class="number">726px</span> <span class="number">826px</span> <span class="number">#FFF</span> , <span class="number">768px</span> <span class="number">344px</span> <span class="number">#FFF</span> , <span class="number">1673px</span> <span class="number">1878px</span> <span class="number">#FFF</span> , <span class="number">1970px</span> <span class="number">722px</span> <span class="number">#FFF</span> , <span class="number">123px</span> <span class="number">79px</span> <span class="number">#FFF</span> , <span class="number">1137px</span> <span class="number">1554px</span> <span class="number">#FFF</span> , <span class="number">490px</span> <span class="number">521px</span> <span class="number">#FFF</span> , <span class="number">1277px</span> <span class="number">1346px</span> <span class="number">#FFF</span> , <span class="number">14px</span> <span class="number">1701px</span> <span class="number">#FFF</span> , <span class="number">114px</span> <span class="number">1127px</span> <span class="number">#FFF</span> , <span class="number">849px</span> <span class="number">20px</span> <span class="number">#FFF</span> , <span class="number">1697px</span> <span class="number">199px</span> <span class="number">#FFF</span> , <span class="number">1013px</span> <span class="number">741px</span> <span class="number">#FFF</span> , <span class="number">1643px</span> <span class="number">1821px</span> <span class="number">#FFF</span> , <span class="number">1335px</span> <span class="number">1355px</span> <span class="number">#FFF</span> , <span class="number">825px</span> <span class="number">290px</span> <span class="number">#FFF</span> , <span class="number">1670px</span> <span class="number">1346px</span> <span class="number">#FFF</span> , <span class="number">345px</span> <span class="number">1925px</span> <span class="number">#FFF</span> , <span class="number">1063px</span> <span class="number">1880px</span> <span class="number">#FFF</span> , <span class="number">265px</span> <span class="number">1203px</span> <span class="number">#FFF</span> , <span class="number">1328px</span> <span class="number">493px</span> <span class="number">#FFF</span> , <span class="number">1152px</span> <span class="number">806px</span> <span class="number">#FFF</span> , <span class="number">661px</span> <span class="number">602px</span> <span class="number">#FFF</span> , <span class="number">520px</span> <span class="number">1515px</span> <span class="number">#FFF</span> , <span class="number">1256px</span> <span class="number">1907px</span> <span class="number">#FFF</span> , <span class="number">1882px</span> <span class="number">1525px</span> <span class="number">#FFF</span> , <span class="number">1024px</span> <span class="number">239px</span> <span class="number">#FFF</span> , <span class="number">1959px</span> <span class="number">1343px</span> <span class="number">#FFF</span> , <span class="number">623px</span> <span class="number">1380px</span> <span class="number">#FFF</span> , <span class="number">1717px</span> <span class="number">1542px</span> <span class="number">#FFF</span> , <span class="number">1318px</span> <span class="number">660px</span> <span class="number">#FFF</span> , <span class="number">1586px</span> <span class="number">1581px</span> <span class="number">#FFF</span> , <span class="number">340px</span> <span class="number">284px</span> <span class="number">#FFF</span> , <span class="number">553px</span> <span class="number">1556px</span> <span class="number">#FFF</span> , <span class="number">609px</span> <span class="number">800px</span> <span class="number">#FFF</span> , <span class="number">613px</span> <span class="number">244px</span> <span class="number">#FFF</span> , <span class="number">927px</span> <span class="number">1327px</span> <span class="number">#FFF</span> , <span class="number">957px</span> <span class="number">1869px</span> <span class="number">#FFF</span> , <span class="number">1029px</span> <span class="number">575px</span> <span class="number">#FFF</span> , <span class="number">1851px</span> <span class="number">1438px</span> <span class="number">#FFF</span> , <span class="number">1043px</span> <span class="number">819px</span> <span class="number">#FFF</span> , <span class="number">1297px</span> <span class="number">1312px</span> <span class="number">#FFF</span> , <span class="number">1361px</span> <span class="number">1224px</span> <span class="number">#FFF</span> , <span class="number">974px</span> <span class="number">344px</span> <span class="number">#FFF</span> , <span class="number">715px</span> <span class="number">1931px</span> <span class="number">#FFF</span> , <span class="number">1583px</span> <span class="number">1370px</span> <span class="number">#FFF</span> , <span class="number">1359px</span> <span class="number">1395px</span> <span class="number">#FFF</span> , <span class="number">433px</span> <span class="number">1356px</span> <span class="number">#FFF</span> , <span class="number">1818px</span> <span class="number">197px</span> <span class="number">#FFF</span> , <span class="number">973px</span> <span class="number">1115px</span> <span class="number">#FFF</span> , <span class="number">353px</span> <span class="number">1356px</span> <span class="number">#FFF</span> , <span class="number">558px</span> <span class="number">1060px</span> <span class="number">#FFF</span> , <span class="number">1584px</span> <span class="number">414px</span> <span class="number">#FFF</span> , <span class="number">1272px</span> <span class="number">1404px</span> <span class="number">#FFF</span> , <span class="number">1792px</span> <span class="number">22px</span> <span class="number">#FFF</span> , <span class="number">147px</span> <span class="number">1524px</span> <span class="number">#FFF</span> , <span class="number">751px</span> <span class="number">1032px</span> <span class="number">#FFF</span> , <span class="number">1945px</span> <span class="number">700px</span> <span class="number">#FFF</span> , <span class="number">366px</span> <span class="number">241px</span> <span class="number">#FFF</span> , <span class="number">1119px</span> <span class="number">532px</span> <span class="number">#FFF</span> , <span class="number">1029px</span> <span class="number">703px</span> <span class="number">#FFF</span> , <span class="number">575px</span> <span class="number">888px</span> <span class="number">#FFF</span> , <span class="number">1568px</span> <span class="number">1488px</span> <span class="number">#FFF</span> , <span class="number">1527px</span> <span class="number">1002px</span> <span class="number">#FFF</span> , <span class="number">471px</span> <span class="number">783px</span> <span class="number">#FFF</span> , <span class="number">90px</span> <span class="number">1160px</span> <span class="number">#FFF</span> , <span class="number">1646px</span> <span class="number">1805px</span> <span class="number">#FFF</span> , <span class="number">714px</span> <span class="number">667px</span> <span class="number">#FFF</span> , <span class="number">644px</span> <span class="number">1716px</span> <span class="number">#FFF</span> , <span class="number">1917px</span> <span class="number">1700px</span> <span class="number">#FFF</span> , <span class="number">1241px</span> <span class="number">1645px</span> <span class="number">#FFF</span> , <span class="number">1285px</span> <span class="number">1327px</span> <span class="number">#FFF</span> , <span class="number">1560px</span> <span class="number">132px</span> <span class="number">#FFF</span> , <span class="number">1645px</span> <span class="number">1753px</span> <span class="number">#FFF</span> , <span class="number">1703px</span> <span class="number">466px</span> <span class="number">#FFF</span> , <span class="number">1099px</span> <span class="number">929px</span> <span class="number">#FFF</span> , <span class="number">1629px</span> <span class="number">1954px</span> <span class="number">#FFF</span> , <span class="number">1103px</span> <span class="number">338px</span> <span class="number">#FFF</span> , <span class="number">1427px</span> <span class="number">1660px</span> <span class="number">#FFF</span> , <span class="number">652px</span> <span class="number">1031px</span> <span class="number">#FFF</span> , <span class="number">958px</span> <span class="number">1744px</span> <span class="number">#FFF</span> , <span class="number">1015px</span> <span class="number">1712px</span> <span class="number">#FFF</span> , <span class="number">1452px</span> <span class="number">1076px</span> <span class="number">#FFF</span> , <span class="number">229px</span> <span class="number">1483px</span> <span class="number">#FFF</span> , <span class="number">84px</span> <span class="number">1847px</span> <span class="number">#FFF</span> , <span class="number">1671px</span> <span class="number">1333px</span> <span class="number">#FFF</span> , <span class="number">1600px</span> <span class="number">345px</span> <span class="number">#FFF</span> , <span class="number">1307px</span> <span class="number">168px</span> <span class="number">#FFF</span> , <span class="number">915px</span> <span class="number">921px</span> <span class="number">#FFF</span> , <span class="number">1367px</span> <span class="number">1826px</span> <span class="number">#FFF</span> , <span class="number">1085px</span> <span class="number">1685px</span> <span class="number">#FFF</span> , <span class="number">1514px</span> <span class="number">753px</span> <span class="number">#FFF</span> , <span class="number">859px</span> <span class="number">1015px</span> <span class="number">#FFF</span> , <span class="number">1871px</span> <span class="number">1239px</span> <span class="number">#FFF</span> , <span class="number">1522px</span> <span class="number">381px</span> <span class="number">#FFF</span> , <span class="number">981px</span> <span class="number">906px</span> <span class="number">#FFF</span> , <span class="number">1207px</span> <span class="number">712px</span> <span class="number">#FFF</span> , <span class="number">1197px</span> <span class="number">820px</span> <span class="number">#FFF</span> , <span class="number">1573px</span> <span class="number">1186px</span> <span class="number">#FFF</span> , <span class="number">864px</span> <span class="number">1824px</span> <span class="number">#FFF</span> , <span class="number">1534px</span> <span class="number">1340px</span> <span class="number">#FFF</span> , <span class="number">629px</span> <span class="number">607px</span> <span class="number">#FFF</span> , <span class="number">1409px</span> <span class="number">997px</span> <span class="number">#FFF</span> , <span class="number">882px</span> <span class="number">1459px</span> <span class="number">#FFF</span> , <span class="number">150px</span> <span class="number">310px</span> <span class="number">#FFF</span> , <span class="number">785px</span> <span class="number">1231px</span> <span class="number">#FFF</span> , <span class="number">884px</span> <span class="number">523px</span> <span class="number">#FFF</span> , <span class="number">1963px</span> <span class="number">1004px</span> <span class="number">#FFF</span> , <span class="number">1529px</span> <span class="number">1395px</span> <span class="number">#FFF</span> , <span class="number">632px</span> <span class="number">665px</span> <span class="number">#FFF</span> , <span class="number">388px</span> <span class="number">1668px</span> <span class="number">#FFF</span> , <span class="number">1468px</span> <span class="number">810px</span> <span class="number">#FFF</span> , <span class="number">1165px</span> <span class="number">1575px</span> <span class="number">#FFF</span> , <span class="number">1498px</span> <span class="number">252px</span> <span class="number">#FFF</span> , <span class="number">275px</span> <span class="number">353px</span> <span class="number">#FFF</span> , <span class="number">1171px</span> <span class="number">350px</span> <span class="number">#FFF</span> , <span class="number">524px</span> <span class="number">1698px</span> <span class="number">#FFF</span> , <span class="number">1652px</span> <span class="number">1900px</span> <span class="number">#FFF</span> , <span class="number">1800px</span> <span class="number">1788px</span> <span class="number">#FFF</span> , <span class="number">1743px</span> <span class="number">695px</span> <span class="number">#FFF</span> , <span class="number">1806px</span> <span class="number">516px</span> <span class="number">#FFF</span> , <span class="number">537px</span> <span class="number">1528px</span> <span class="number">#FFF</span> , <span class="number">127px</span> <span class="number">763px</span> <span class="number">#FFF</span> , <span class="number">1643px</span> <span class="number">1043px</span> <span class="number">#FFF</span> , <span class="number">1717px</span> <span class="number">137px</span> <span class="number">#FFF</span> , <span class="number">1553px</span> <span class="number">952px</span> <span class="number">#FFF</span> , <span class="number">183px</span> <span class="number">1507px</span> <span class="number">#FFF</span> , <span class="number">770px</span> <span class="number">322px</span> <span class="number">#FFF</span> , <span class="number">241px</span> <span class="number">1999px</span> <span class="number">#FFF</span> , <span class="number">148px</span> <span class="number">244px</span> <span class="number">#FFF</span> , <span class="number">118px</span> <span class="number">1096px</span> <span class="number">#FFF</span> , <span class="number">1183px</span> <span class="number">100px</span> <span class="number">#FFF</span> , <span class="number">1158px</span> <span class="number">53px</span> <span class="number">#FFF</span> , <span class="number">371px</span> <span class="number">735px</span> <span class="number">#FFF</span> , <span class="number">1090px</span> <span class="number">1474px</span> <span class="number">#FFF</span> , <span class="number">1145px</span> <span class="number">616px</span> <span class="number">#FFF</span> , <span class="number">1300px</span> <span class="number">236px</span> <span class="number">#FFF</span> , <span class="number">407px</span> <span class="number">672px</span> <span class="number">#FFF</span> , <span class="number">1012px</span> <span class="number">142px</span> <span class="number">#FFF</span> , <span class="number">100px</span> <span class="number">329px</span> <span class="number">#FFF</span> , <span class="number">219px</span> <span class="number">506px</span> <span class="number">#FFF</span> , <span class="number">482px</span> <span class="number">349px</span> <span class="number">#FFF</span> , <span class="number">1397px</span> <span class="number">1560px</span> <span class="number">#FFF</span> , <span class="number">566px</span> <span class="number">750px</span> <span class="number">#FFF</span> , <span class="number">562px</span> <span class="number">1403px</span> <span class="number">#FFF</span> , <span class="number">1154px</span> <span class="number">961px</span> <span class="number">#FFF</span> , <span class="number">559px</span> <span class="number">169px</span> <span class="number">#FFF</span> , <span class="number">568px</span> <span class="number">503px</span> <span class="number">#FFF</span> , <span class="number">184px</span> <span class="number">1898px</span> <span class="number">#FFF</span> , <span class="number">256px</span> <span class="number">793px</span> <span class="number">#FFF</span> , <span class="number">668px</span> <span class="number">66px</span> <span class="number">#FFF</span> , <span class="number">38px</span> <span class="number">544px</span> <span class="number">#FFF</span> , <span class="number">832px</span> <span class="number">702px</span> <span class="number">#FFF</span> , <span class="number">1676px</span> <span class="number">1579px</span> <span class="number">#FFF</span> , <span class="number">1996px</span> <span class="number">910px</span> <span class="number">#FFF</span> , <span class="number">806px</span> <span class="number">1313px</span> <span class="number">#FFF</span> , <span class="number">1063px</span> <span class="number">79px</span> <span class="number">#FFF</span> , <span class="number">539px</span> <span class="number">1035px</span> <span class="number">#FFF</span> , <span class="number">552px</span> <span class="number">1740px</span> <span class="number">#FFF</span> , <span class="number">774px</span> <span class="number">632px</span> <span class="number">#FFF</span> , <span class="number">1453px</span> <span class="number">1152px</span> <span class="number">#FFF</span> , <span class="number">491px</span> <span class="number">1160px</span> <span class="number">#FFF</span> , <span class="number">1667px</span> <span class="number">793px</span> <span class="number">#FFF</span> , <span class="number">655px</span> <span class="number">316px</span> <span class="number">#FFF</span> , <span class="number">609px</span> <span class="number">470px</span> <span class="number">#FFF</span> , <span class="number">1330px</span> <span class="number">53px</span> <span class="number">#FFF</span> , <span class="number">420px</span> <span class="number">1814px</span> <span class="number">#FFF</span> , <span class="number">1155px</span> <span class="number">447px</span> <span class="number">#FFF</span> , <span class="number">1754px</span> <span class="number">360px</span> <span class="number">#FFF</span> , <span class="number">913px</span> <span class="number">1425px</span> <span class="number">#FFF</span> , <span class="number">1408px</span> <span class="number">1270px</span> <span class="number">#FFF</span> , <span class="number">414px</span> <span class="number">128px</span> <span class="number">#FFF</span> , <span class="number">31px</span> <span class="number">1664px</span> <span class="number">#FFF</span> , <span class="number">1671px</span> <span class="number">899px</span> <span class="number">#FFF</span> , <span class="number">125px</span> <span class="number">1133px</span> <span class="number">#FFF</span> , <span class="number">1942px</span> <span class="number">351px</span> <span class="number">#FFF</span> , <span class="number">1439px</span> <span class="number">466px</span> <span class="number">#FFF</span> , <span class="number">886px</span> <span class="number">1853px</span> <span class="number">#FFF</span> , <span class="number">1587px</span> <span class="number">677px</span> <span class="number">#FFF</span> , <span class="number">241px</span> <span class="number">570px</span> <span class="number">#FFF</span> , <span class="number">1886px</span> <span class="number">1293px</span> <span class="number">#FFF</span> , <span class="number">1526px</span> <span class="number">84px</span> <span class="number">#FFF</span> , <span class="number">508px</span> <span class="number">1419px</span> <span class="number">#FFF</span> , <span class="number">759px</span> <span class="number">634px</span> <span class="number">#FFF</span> , <span class="number">1314px</span> <span class="number">1121px</span> <span class="number">#FFF</span> , <span class="number">1127px</span> <span class="number">545px</span> <span class="number">#FFF</span> , <span class="number">993px</span> <span class="number">758px</span> <span class="number">#FFF</span> , <span class="number">1770px</span> <span class="number">795px</span> <span class="number">#FFF</span> , <span class="number">1629px</span> <span class="number">211px</span> <span class="number">#FFF</span> , <span class="number">824px</span> <span class="number">1656px</span> <span class="number">#FFF</span> , <span class="number">324px</span> <span class="number">1166px</span> <span class="number">#FFF</span> , <span class="number">27px</span> <span class="number">1316px</span> <span class="number">#FFF</span> , <span class="number">1258px</span> <span class="number">1468px</span> <span class="number">#FFF</span> , <span class="number">428px</span> <span class="number">1923px</span> <span class="number">#FFF</span> , <span class="number">661px</span> <span class="number">704px</span> <span class="number">#FFF</span> , <span class="number">1872px</span> <span class="number">1640px</span> <span class="number">#FFF</span> , <span class="number">1910px</span> <span class="number">1660px</span> <span class="number">#FFF</span> , <span class="number">117px</span> <span class="number">995px</span> <span class="number">#FFF</span> , <span class="number">253px</span> <span class="number">1792px</span> <span class="number">#FFF</span> , <span class="number">1403px</span> <span class="number">1433px</span> <span class="number">#FFF</span> , <span class="number">1441px</span> <span class="number">752px</span> <span class="number">#FFF</span> , <span class="number">1472px</span> <span class="number">547px</span> <span class="number">#FFF</span> , <span class="number">1715px</span> <span class="number">541px</span> <span class="number">#FFF</span> , <span class="number">272px</span> <span class="number">187px</span> <span class="number">#FFF</span> , <span class="number">881px</span> <span class="number">306px</span> <span class="number">#FFF</span> , <span class="number">19px</span> <span class="number">1209px</span> <span class="number">#FFF</span> , <span class="number">1807px</span> <span class="number">1423px</span> <span class="number">#FFF</span> , <span class="number">693px</span> <span class="number">1752px</span> <span class="number">#FFF</span> , <span class="number">160px</span> <span class="number">1252px</span> <span class="number">#FFF</span> , <span class="number">1710px</span> <span class="number">237px</span> <span class="number">#FFF</span> , <span class="number">32px</span> <span class="number">1786px</span> <span class="number">#FFF</span> , <span class="number">1440px</span> <span class="number">1452px</span> <span class="number">#FFF</span> , <span class="number">712px</span> <span class="number">1836px</span> <span class="number">#FFF</span> , <span class="number">1324px</span> <span class="number">1411px</span> <span class="number">#FFF</span> , <span class="number">728px</span> <span class="number">274px</span> <span class="number">#FFF</span> , <span class="number">59px</span> <span class="number">244px</span> <span class="number">#FFF</span> , <span class="number">1514px</span> <span class="number">16px</span> <span class="number">#FFF</span> , <span class="number">1472px</span> <span class="number">923px</span> <span class="number">#FFF</span> , <span class="number">1276px</span> <span class="number">1755px</span> <span class="number">#FFF</span> , <span class="number">1099px</span> <span class="number">1301px</span> <span class="number">#FFF</span> , <span class="number">1972px</span> <span class="number">1715px</span> <span class="number">#FFF</span> , <span class="number">511px</span> <span class="number">1297px</span> <span class="number">#FFF</span> , <span class="number">465px</span> <span class="number">1329px</span> <span class="number">#FFF</span> , <span class="number">129px</span> <span class="number">1422px</span> <span class="number">#FFF</span> , <span class="number">635px</span> <span class="number">959px</span> <span class="number">#FFF</span> , <span class="number">206px</span> <span class="number">1663px</span> <span class="number">#FFF</span> , <span class="number">1089px</span> <span class="number">150px</span> <span class="number">#FFF</span> , <span class="number">911px</span> <span class="number">365px</span> <span class="number">#FFF</span> , <span class="number">1520px</span> <span class="number">1828px</span> <span class="number">#FFF</span> , <span class="number">133px</span> <span class="number">560px</span> <span class="number">#FFF</span> , <span class="number">715px</span> <span class="number">1941px</span> <span class="number">#FFF</span> , <span class="number">818px</span> <span class="number">1332px</span> <span class="number">#FFF</span> , <span class="number">1407px</span> <span class="number">1564px</span> <span class="number">#FFF</span> , <span class="number">64px</span> <span class="number">788px</span> <span class="number">#FFF</span> , <span class="number">1048px</span> <span class="number">1656px</span> <span class="number">#FFF</span> , <span class="number">1290px</span> <span class="number">1205px</span> <span class="number">#FFF</span> , <span class="number">1230px</span> <span class="number">93px</span> <span class="number">#FFF</span> , <span class="number">532px</span> <span class="number">570px</span> <span class="number">#FFF</span> , <span class="number">170px</span> <span class="number">1545px</span> <span class="number">#FFF</span> , <span class="number">507px</span> <span class="number">1924px</span> <span class="number">#FFF</span> , <span class="number">197px</span> <span class="number">669px</span> <span class="number">#FFF</span> , <span class="number">1945px</span> <span class="number">1559px</span> <span class="number">#FFF</span> , <span class="number">400px</span> <span class="number">346px</span> <span class="number">#FFF</span> , <span class="number">610px</span> <span class="number">1596px</span> <span class="number">#FFF</span> , <span class="number">587px</span> <span class="number">245px</span> <span class="number">#FFF</span> , <span class="number">272px</span> <span class="number">661px</span> <span class="number">#FFF</span> , <span class="number">1889px</span> <span class="number">1419px</span> <span class="number">#FFF</span> , <span class="number">1831px</span> <span class="number">234px</span> <span class="number">#FFF</span> , <span class="number">1222px</span> <span class="number">840px</span> <span class="number">#FFF</span> , <span class="number">1849px</span> <span class="number">1366px</span> <span class="number">#FFF</span> , <span class="number">107px</span> <span class="number">1058px</span> <span class="number">#FFF</span> , <span class="number">1589px</span> <span class="number">1327px</span> <span class="number">#FFF</span> , <span class="number">1160px</span> <span class="number">324px</span> <span class="number">#FFF</span> , <span class="number">438px</span> <span class="number">768px</span> <span class="number">#FFF</span> , <span class="number">1225px</span> <span class="number">1707px</span> <span class="number">#FFF</span> , <span class="number">662px</span> <span class="number">384px</span> <span class="number">#FFF</span> , <span class="number">567px</span> <span class="number">786px</span> <span class="number">#FFF</span> , <span class="number">1115px</span> <span class="number">95px</span> <span class="number">#FFF</span> , <span class="number">195px</span> <span class="number">48px</span> <span class="number">#FFF</span> , <span class="number">1623px</span> <span class="number">470px</span> <span class="number">#FFF</span> , <span class="number">362px</span> <span class="number">746px</span> <span class="number">#FFF</span> , <span class="number">546px</span> <span class="number">270px</span> <span class="number">#FFF</span> , <span class="number">1120px</span> <span class="number">1542px</span> <span class="number">#FFF</span> , <span class="number">1925px</span> <span class="number">1770px</span> <span class="number">#FFF</span> , <span class="number">830px</span> <span class="number">1439px</span> <span class="number">#FFF</span> , <span class="number">1419px</span> <span class="number">1360px</span> <span class="number">#FFF</span> , <span class="number">128px</span> <span class="number">1049px</span> <span class="number">#FFF</span> , <span class="number">1684px</span> <span class="number">578px</span> <span class="number">#FFF</span> , <span class="number">714px</span> <span class="number">1156px</span> <span class="number">#FFF</span> , <span class="number">102px</span> <span class="number">81px</span> <span class="number">#FFF</span> , <span class="number">351px</span> <span class="number">1428px</span> <span class="number">#FFF</span> , <span class="number">982px</span> <span class="number">472px</span> <span class="number">#FFF</span> , <span class="number">1142px</span> <span class="number">1717px</span> <span class="number">#FFF</span> , <span class="number">1195px</span> <span class="number">1182px</span> <span class="number">#FFF</span> , <span class="number">337px</span> <span class="number">286px</span> <span class="number">#FFF</span> , <span class="number">1309px</span> <span class="number">1402px</span> <span class="number">#FFF</span> , <span class="number">1863px</span> <span class="number">1475px</span> <span class="number">#FFF</span> , <span class="number">623px</span> <span class="number">1518px</span> <span class="number">#FFF</span> , <span class="number">133px</span> <span class="number">1847px</span> <span class="number">#FFF</span> , <span class="number">927px</span> <span class="number">1120px</span> <span class="number">#FFF</span> , <span class="number">1439px</span> <span class="number">725px</span> <span class="number">#FFF</span> , <span class="number">1722px</span> <span class="number">1576px</span> <span class="number">#FFF</span> , <span class="number">706px</span> <span class="number">285px</span> <span class="number">#FFF</span> , <span class="number">637px</span> <span class="number">455px</span> <span class="number">#FFF</span> , <span class="number">574px</span> <span class="number">1498px</span> <span class="number">#FFF</span> , <span class="number">674px</span> <span class="number">1851px</span> <span class="number">#FFF</span> , <span class="number">1748px</span> <span class="number">683px</span> <span class="number">#FFF</span> , <span class="number">563px</span> <span class="number">1521px</span> <span class="number">#FFF</span> , <span class="number">1627px</span> <span class="number">1826px</span> <span class="number">#FFF</span> , <span class="number">1360px</span> <span class="number">901px</span> <span class="number">#FFF</span> , <span class="number">1551px</span> <span class="number">1458px</span> <span class="number">#FFF</span> , <span class="number">1995px</span> <span class="number">517px</span> <span class="number">#FFF</span> , <span class="number">1928px</span> <span class="number">303px</span> <span class="number">#FFF</span> , <span class="number">1256px</span> <span class="number">1241px</span> <span class="number">#FFF</span> , <span class="number">1283px</span> <span class="number">1911px</span> <span class="number">#FFF</span> , <span class="number">923px</span> <span class="number">1235px</span> <span class="number">#FFF</span> , <span class="number">758px</span> <span class="number">949px</span> <span class="number">#FFF</span> , <span class="number">1133px</span> <span class="number">1794px</span> <span class="number">#FFF</span> , <span class="number">1203px</span> <span class="number">623px</span> <span class="number">#FFF</span> , <span class="number">344px</span> <span class="number">103px</span> <span class="number">#FFF</span> , <span class="number">1032px</span> <span class="number">834px</span> <span class="number">#FFF</span> , <span class="number">714px</span> <span class="number">555px</span> <span class="number">#FFF</span> , <span class="number">702px</span> <span class="number">931px</span> <span class="number">#FFF</span> , <span class="number">1431px</span> <span class="number">1808px</span> <span class="number">#FFF</span> , <span class="number">1827px</span> <span class="number">1436px</span> <span class="number">#FFF</span> , <span class="number">750px</span> <span class="number">192px</span> <span class="number">#FFF</span> , <span class="number">1816px</span> <span class="number">769px</span> <span class="number">#FFF</span> , <span class="number">1537px</span> <span class="number">64px</span> <span class="number">#FFF</span> , <span class="number">670px</span> <span class="number">753px</span> <span class="number">#FFF</span> , <span class="number">1832px</span> <span class="number">783px</span> <span class="number">#FFF</span> , <span class="number">807px</span> <span class="number">1154px</span> <span class="number">#FFF</span> , <span class="number">641px</span> <span class="number">1749px</span> <span class="number">#FFF</span> , <span class="number">509px</span> <span class="number">399px</span> <span class="number">#FFF</span> , <span class="number">1308px</span> <span class="number">79px</span> <span class="number">#FFF</span> , <span class="number">319px</span> <span class="number">482px</span> <span class="number">#FFF</span> , <span class="number">662px</span> <span class="number">829px</span> <span class="number">#FFF</span> , <span class="number">1379px</span> <span class="number">1284px</span> <span class="number">#FFF</span> , <span class="number">1812px</span> <span class="number">1594px</span> <span class="number">#FFF</span> , <span class="number">359px</span> <span class="number">448px</span> <span class="number">#FFF</span> , <span class="number">277px</span> <span class="number">1027px</span> <span class="number">#FFF</span> , <span class="number">679px</span> <span class="number">795px</span> <span class="number">#FFF</span> , <span class="number">1854px</span> <span class="number">689px</span> <span class="number">#FFF</span> , <span class="number">275px</span> <span class="number">584px</span> <span class="number">#FFF</span> , <span class="number">1772px</span> <span class="number">217px</span> <span class="number">#FFF</span> , <span class="number">340px</span> <span class="number">920px</span> <span class="number">#FFF</span> , <span class="number">1483px</span> <span class="number">968px</span> <span class="number">#FFF</span> , <span class="number">567px</span> <span class="number">252px</span> <span class="number">#FFF</span> , <span class="number">658px</span> <span class="number">507px</span> <span class="number">#FFF</span> , <span class="number">1892px</span> <span class="number">860px</span> <span class="number">#FFF</span> , <span class="number">1800px</span> <span class="number">261px</span> <span class="number">#FFF</span> , <span class="number">1325px</span> <span class="number">1416px</span> <span class="number">#FFF</span> , <span class="number">1053px</span> <span class="number">1894px</span> <span class="number">#FFF</span> , <span class="number">459px</span> <span class="number">442px</span> <span class="number">#FFF</span> , <span class="number">1172px</span> <span class="number">1566px</span> <span class="number">#FFF</span> , <span class="number">1325px</span> <span class="number">695px</span> <span class="number">#FFF</span> , <span class="number">764px</span> <span class="number">851px</span> <span class="number">#FFF</span> , <span class="number">539px</span> <span class="number">582px</span> <span class="number">#FFF</span> , <span class="number">1439px</span> <span class="number">999px</span> <span class="number">#FFF</span> , <span class="number">67px</span> <span class="number">494px</span> <span class="number">#FFF</span> , <span class="number">1251px</span> <span class="number">1832px</span> <span class="number">#FFF</span> , <span class="number">731px</span> <span class="number">615px</span> <span class="number">#FFF</span> , <span class="number">1024px</span> <span class="number">1997px</span> <span class="number">#FFF</span> , <span class="number">1647px</span> <span class="number">365px</span> <span class="number">#FFF</span> , <span class="number">932px</span> <span class="number">34px</span> <span class="number">#FFF</span> , <span class="number">859px</span> <span class="number">247px</span> <span class="number">#FFF</span> , <span class="number">249px</span> <span class="number">1998px</span> <span class="number">#FFF</span> , <span class="number">555px</span> <span class="number">885px</span> <span class="number">#FFF</span> , <span class="number">1663px</span> <span class="number">1423px</span> <span class="number">#FFF</span> , <span class="number">1509px</span> <span class="number">381px</span> <span class="number">#FFF</span> , <span class="number">694px</span> <span class="number">308px</span> <span class="number">#FFF</span> , <span class="number">1430px</span> <span class="number">262px</span> <span class="number">#FFF</span> , <span class="number">1944px</span> <span class="number">1413px</span> <span class="number">#FFF</span> , <span class="number">1279px</span> <span class="number">1157px</span> <span class="number">#FFF</span> , <span class="number">1298px</span> <span class="number">508px</span> <span class="number">#FFF</span> , <span class="number">175px</span> <span class="number">967px</span> <span class="number">#FFF</span> , <span class="number">568px</span> <span class="number">799px</span> <span class="number">#FFF</span> , <span class="number">1417px</span> <span class="number">519px</span> <span class="number">#FFF</span> , <span class="number">459px</span> <span class="number">368px</span> <span class="number">#FFF</span> , <span class="number">681px</span> <span class="number">1629px</span> <span class="number">#FFF</span> , <span class="number">41px</span> <span class="number">449px</span> <span class="number">#FFF</span> , <span class="number">1630px</span> <span class="number">1507px</span> <span class="number">#FFF</span> , <span class="number">1834px</span> <span class="number">1214px</span> <span class="number">#FFF</span> , <span class="number">486px</span> <span class="number">1965px</span> <span class="number">#FFF</span> , <span class="number">1581px</span> <span class="number">1047px</span> <span class="number">#FFF</span> , <span class="number">995px</span> <span class="number">683px</span> <span class="number">#FFF</span> , <span class="number">721px</span> <span class="number">1985px</span> <span class="number">#FFF</span> , <span class="number">837px</span> <span class="number">624px</span> <span class="number">#FFF</span> , <span class="number">885px</span> <span class="number">188px</span> <span class="number">#FFF</span> , <span class="number">862px</span> <span class="number">1339px</span> <span class="number">#FFF</span> , <span class="number">908px</span> <span class="number">1594px</span> <span class="number">#FFF</span> , <span class="number">697px</span> <span class="number">267px</span> <span class="number">#FFF</span> , <span class="number">386px</span> <span class="number">293px</span> <span class="number">#FFF</span> , <span class="number">234px</span> <span class="number">1636px</span> <span class="number">#FFF</span> , <span class="number">1805px</span> <span class="number">855px</span> <span class="number">#FFF</span> , <span class="number">267px</span> <span class="number">350px</span> <span class="number">#FFF</span> , <span class="number">493px</span> <span class="number">207px</span> <span class="number">#FFF</span> , <span class="number">1541px</span> <span class="number">1176px</span> <span class="number">#FFF</span> , <span class="number">377px</span> <span class="number">982px</span> <span class="number">#FFF</span> , <span class="number">768px</span> <span class="number">878px</span> <span class="number">#FFF</span> , <span class="number">1263px</span> <span class="number">812px</span> <span class="number">#FFF</span> , <span class="number">175px</span> <span class="number">228px</span> <span class="number">#FFF</span> , <span class="number">1601px</span> <span class="number">571px</span> <span class="number">#FFF</span> , <span class="number">1696px</span> <span class="number">391px</span> <span class="number">#FFF</span> , <span class="number">38px</span> <span class="number">415px</span> <span class="number">#FFF</span> , <span class="number">1427px</span> <span class="number">1882px</span> <span class="number">#FFF</span> , <span class="number">1306px</span> <span class="number">628px</span> <span class="number">#FFF</span> , <span class="number">1257px</span> <span class="number">1933px</span> <span class="number">#FFF</span> , <span class="number">1690px</span> <span class="number">1370px</span> <span class="number">#FFF</span> , <span class="number">1812px</span> <span class="number">1778px</span> <span class="number">#FFF</span> , <span class="number">1124px</span> <span class="number">1557px</span> <span class="number">#FFF</span> , <span class="number">830px</span> <span class="number">567px</span> <span class="number">#FFF</span> , <span class="number">1124px</span> <span class="number">842px</span> <span class="number">#FFF</span> , <span class="number">1983px</span> <span class="number">1339px</span> <span class="number">#FFF</span> , <span class="number">1855px</span> <span class="number">195px</span> <span class="number">#FFF</span> , <span class="number">1545px</span> <span class="number">1092px</span> <span class="number">#FFF</span> , <span class="number">1861px</span> <span class="number">1448px</span> <span class="number">#FFF</span> , <span class="number">519px</span> <span class="number">1259px</span> <span class="number">#FFF</span> , <span class="number">1141px</span> <span class="number">1117px</span> <span class="number">#FFF</span> , <span class="number">1916px</span> <span class="number">1573px</span> <span class="number">#FFF</span> , <span class="number">1112px</span> <span class="number">1870px</span> <span class="number">#FFF</span> , <span class="number">1016px</span> <span class="number">1083px</span> <span class="number">#FFF</span> , <span class="number">935px</span> <span class="number">1575px</span> <span class="number">#FFF</span> , <span class="number">1275px</span> <span class="number">1355px</span> <span class="number">#FFF</span> , <span class="number">363px</span> <span class="number">465px</span> <span class="number">#FFF</span> , <span class="number">1085px</span> <span class="number">1388px</span> <span class="number">#FFF</span> , <span class="number">1918px</span> <span class="number">952px</span> <span class="number">#FFF</span> , <span class="number">104px</span> <span class="number">542px</span> <span class="number">#FFF</span> , <span class="number">1013px</span> <span class="number">1562px</span> <span class="number">#FFF</span> , <span class="number">1700px</span> <span class="number">1159px</span> <span class="number">#FFF</span> , <span class="number">908px</span> <span class="number">289px</span> <span class="number">#FFF</span> , <span class="number">1105px</span> <span class="number">1146px</span> <span class="number">#FFF</span> , <span class="number">1420px</span> <span class="number">1676px</span> <span class="number">#FFF</span> , <span class="number">1281px</span> <span class="number">457px</span> <span class="number">#FFF</span> , <span class="number">1749px</span> <span class="number">1537px</span> <span class="number">#FFF</span> , <span class="number">146px</span> <span class="number">45px</span> <span class="number">#FFF</span> , <span class="number">51px</span> <span class="number">809px</span> <span class="number">#FFF</span> , <span class="number">300px</span> <span class="number">991px</span> <span class="number">#FFF</span> , <span class="number">1019px</span> <span class="number">1985px</span> <span class="number">#FFF</span> , <span class="number">722px</span> <span class="number">216px</span> <span class="number">#FFF</span> , <span class="number">1752px</span> <span class="number">1874px</span> <span class="number">#FFF</span> , <span class="number">393px</span> <span class="number">798px</span> <span class="number">#FFF</span> , <span class="number">483px</span> <span class="number">1645px</span> <span class="number">#FFF</span> , <span class="number">324px</span> <span class="number">310px</span> <span class="number">#FFF</span> , <span class="number">1688px</span> <span class="number">644px</span> <span class="number">#FFF</span> , <span class="number">1848px</span> <span class="number">945px</span> <span class="number">#FFF</span> , <span class="number">805px</span> <span class="number">1663px</span> <span class="number">#FFF</span> , <span class="number">1927px</span> <span class="number">1468px</span> <span class="number">#FFF</span> , <span class="number">999px</span> <span class="number">1120px</span> <span class="number">#FFF</span> , <span class="number">1139px</span> <span class="number">677px</span> <span class="number">#FFF</span> , <span class="number">1011px</span> <span class="number">1034px</span> <span class="number">#FFF</span> , <span class="number">1123px</span> <span class="number">556px</span> <span class="number">#FFF</span> , <span class="number">585px</span> <span class="number">1660px</span> <span class="number">#FFF</span> , <span class="number">20px</span> <span class="number">67px</span> <span class="number">#FFF</span> , <span class="number">1460px</span> <span class="number">1071px</span> <span class="number">#FFF</span> , <span class="number">871px</span> <span class="number">726px</span> <span class="number">#FFF</span> , <span class="number">1270px</span> <span class="number">587px</span> <span class="number">#FFF</span> , <span class="number">814px</span> <span class="number">763px</span> <span class="number">#FFF</span> , <span class="number">671px</span> <span class="number">799px</span> <span class="number">#FFF</span> , <span class="number">1683px</span> <span class="number">1813px</span> <span class="number">#FFF</span> , <span class="number">516px</span> <span class="number">1113px</span> <span class="number">#FFF</span> , <span class="number">1490px</span> <span class="number">727px</span> <span class="number">#FFF</span> , <span class="number">1825px</span> <span class="number">329px</span> <span class="number">#FFF</span> , <span class="number">113px</span> <span class="number">1169px</span> <span class="number">#FFF</span> , <span class="number">759px</span> <span class="number">1790px</span> <span class="number">#FFF</span> , <span class="number">1195px</span> <span class="number">1933px</span> <span class="number">#FFF</span> , <span class="number">1389px</span> <span class="number">1047px</span> <span class="number">#FFF</span> , <span class="number">753px</span> <span class="number">1133px</span> <span class="number">#FFF</span> , <span class="number">1858px</span> <span class="number">532px</span> <span class="number">#FFF</span> , <span class="number">160px</span> <span class="number">83px</span> <span class="number">#FFF</span> , <span class="number">1928px</span> <span class="number">1030px</span> <span class="number">#FFF</span> , <span class="number">296px</span> <span class="number">351px</span> <span class="number">#FFF</span> , <span class="number">1227px</span> <span class="number">673px</span> <span class="number">#FFF</span> , <span class="number">1459px</span> <span class="number">397px</span> <span class="number">#FFF</span> , <span class="number">1407px</span> <span class="number">316px</span> <span class="number">#FFF</span> , <span class="number">1238px</span> <span class="number">1604px</span> <span class="number">#FFF</span> , <span class="number">1060px</span> <span class="number">973px</span> <span class="number">#FFF</span> , <span class="number">1579px</span> <span class="number">1000px</span> <span class="number">#FFF</span> , <span class="number">1950px</span> <span class="number">10px</span> <span class="number">#FFF</span> , <span class="number">1983px</span> <span class="number">462px</span> <span class="number">#FFF</span> , <span class="number">1071px</span> <span class="number">330px</span> <span class="number">#FFF</span> , <span class="number">1206px</span> <span class="number">343px</span> <span class="number">#FFF</span> , <span class="number">454px</span> <span class="number">806px</span> <span class="number">#FFF</span> , <span class="number">1404px</span> <span class="number">1721px</span> <span class="number">#FFF</span> , <span class="number">969px</span> <span class="number">1813px</span> <span class="number">#FFF</span> , <span class="number">1282px</span> <span class="number">1124px</span> <span class="number">#FFF</span> , <span class="number">363px</span> <span class="number">1735px</span> <span class="number">#FFF</span> , <span class="number">1688px</span> <span class="number">1952px</span> <span class="number">#FFF</span> , <span class="number">1472px</span> <span class="number">264px</span> <span class="number">#FFF</span> , <span class="number">762px</span> <span class="number">648px</span> <span class="number">#FFF</span> , <span class="number">62px</span> <span class="number">588px</span> <span class="number">#FFF</span> , <span class="number">1331px</span> <span class="number">1490px</span> <span class="number">#FFF</span> , <span class="number">1189px</span> <span class="number">622px</span> <span class="number">#FFF</span> , <span class="number">866px</span> <span class="number">320px</span> <span class="number">#FFF</span> , <span class="number">1343px</span> <span class="number">1514px</span> <span class="number">#FFF</span> , <span class="number">1201px</span> <span class="number">1297px</span> <span class="number">#FFF</span> , <span class="number">1148px</span> <span class="number">904px</span> <span class="number">#FFF</span> , <span class="number">1233px</span> <span class="number">1422px</span> <span class="number">#FFF</span> , <span class="number">1450px</span> <span class="number">942px</span> <span class="number">#FFF</span> , <span class="number">653px</span> <span class="number">1273px</span> <span class="number">#FFF</span> , <span class="number">95px</span> <span class="number">279px</span> <span class="number">#FFF</span> , <span class="number">853px</span> <span class="number">1428px</span> <span class="number">#FFF</span> , <span class="number">1743px</span> <span class="number">163px</span> <span class="number">#FFF</span> , <span class="number">1230px</span> <span class="number">737px</span> <span class="number">#FFF</span> , <span class="number">812px</span> <span class="number">1580px</span> <span class="number">#FFF</span> , <span class="number">1208px</span> <span class="number">33px</span> <span class="number">#FFF</span> , <span class="number">1839px</span> <span class="number">1996px</span> <span class="number">#FFF</span> , <span class="number">348px</span> <span class="number">1390px</span> <span class="number">#FFF</span> , <span class="number">420px</span> <span class="number">1762px</span> <span class="number">#FFF</span> , <span class="number">1915px</span> <span class="number">1121px</span> <span class="number">#FFF</span> , <span class="number">776px</span> <span class="number">1562px</span> <span class="number">#FFF</span> , <span class="number">1421px</span> <span class="number">1223px</span> <span class="number">#FFF</span> , <span class="number">502px</span> <span class="number">94px</span> <span class="number">#FFF</span> , <span class="number">1832px</span> <span class="number">1915px</span> <span class="number">#FFF</span> , <span class="number">175px</span> <span class="number">367px</span> <span class="number">#FFF</span> , <span class="number">592px</span> <span class="number">1593px</span> <span class="number">#FFF</span> , <span class="number">1966px</span> <span class="number">922px</span> <span class="number">#FFF</span> , <span class="number">365px</span> <span class="number">1586px</span> <span class="number">#FFF</span> , <span class="number">1889px</span> <span class="number">220px</span> <span class="number">#FFF</span> , <span class="number">1742px</span> <span class="number">1810px</span> <span class="number">#FFF</span> , <span class="number">1801px</span> <span class="number">371px</span> <span class="number">#FFF</span> , <span class="number">888px</span> <span class="number">1587px</span> <span class="number">#FFF</span> , <span class="number">1567px</span> <span class="number">1363px</span> <span class="number">#FFF</span> , <span class="number">26px</span> <span class="number">99px</span> <span class="number">#FFF</span> , <span class="number">1542px</span> <span class="number">14px</span> <span class="number">#FFF</span> , <span class="number">128px</span> <span class="number">461px</span> <span class="number">#FFF</span> , <span class="number">300px</span> <span class="number">454px</span> <span class="number">#FFF</span> , <span class="number">929px</span> <span class="number">502px</span> <span class="number">#FFF</span> , <span class="number">290px</span> <span class="number">433px</span> <span class="number">#FFF</span> , <span class="number">1856px</span> <span class="number">104px</span> <span class="number">#FFF</span> , <span class="number">1971px</span> <span class="number">1303px</span> <span class="number">#FFF</span> , <span class="number">1013px</span> <span class="number">1086px</span> <span class="number">#FFF</span> , <span class="number">842px</span> <span class="number">1535px</span> <span class="number">#FFF</span> , <span class="number">710px</span> <span class="number">1915px</span> <span class="number">#FFF</span> , <span class="number">1796px</span> <span class="number">308px</span> <span class="number">#FFF</span> , <span class="number">58px</span> <span class="number">501px</span> <span class="number">#FFF</span> , <span class="number">1010px</span> <span class="number">801px</span> <span class="number">#FFF</span> , <span class="number">405px</span> <span class="number">251px</span> <span class="number">#FFF</span> , <span class="number">892px</span> <span class="number">909px</span> <span class="number">#FFF</span> , <span class="number">1653px</span> <span class="number">1133px</span> <span class="number">#FFF</span> , <span class="number">355px</span> <span class="number">1729px</span> <span class="number">#FFF</span> , <span class="number">890px</span> <span class="number">1955px</span> <span class="number">#FFF</span> , <span class="number">182px</span> <span class="number">811px</span> <span class="number">#FFF</span> , <span class="number">1824px</span> <span class="number">365px</span> <span class="number">#FFF</span> , <span class="number">1992px</span> <span class="number">383px</span> <span class="number">#FFF</span> , <span class="number">1241px</span> <span class="number">1001px</span> <span class="number">#FFF</span> , <span class="number">1805px</span> <span class="number">164px</span> <span class="number">#FFF</span> , <span class="number">418px</span> <span class="number">1830px</span> <span class="number">#FFF</span> , <span class="number">1575px</span> <span class="number">1143px</span> <span class="number">#FFF</span> , <span class="number">1513px</span> <span class="number">1119px</span> <span class="number">#FFF</span> , <span class="number">1927px</span> <span class="number">242px</span> <span class="number">#FFF</span> , <span class="number">559px</span> <span class="number">48px</span> <span class="number">#FFF</span> , <span class="number">1129px</span> <span class="number">666px</span> <span class="number">#FFF</span> , <span class="number">643px</span> <span class="number">1716px</span> <span class="number">#FFF</span> , <span class="number">150px</span> <span class="number">744px</span> <span class="number">#FFF</span> , <span class="number">312px</span> <span class="number">136px</span> <span class="number">#FFF</span> , <span class="number">1777px</span> <span class="number">848px</span> <span class="number">#FFF</span> , <span class="number">1388px</span> <span class="number">1238px</span> <span class="number">#FFF</span> , <span class="number">910px</span> <span class="number">1209px</span> <span class="number">#FFF</span> , <span class="number">908px</span> <span class="number">1574px</span> <span class="number">#FFF</span> , <span class="number">1466px</span> <span class="number">425px</span> <span class="number">#FFF</span> , <span class="number">1903px</span> <span class="number">883px</span> <span class="number">#FFF</span> , <span class="number">598px</span> <span class="number">1541px</span> <span class="number">#FFF</span> , <span class="number">1743px</span> <span class="number">771px</span> <span class="number">#FFF</span> , <span class="number">884px</span> <span class="number">1281px</span> <span class="number">#FFF</span> , <span class="number">297px</span> <span class="number">1236px</span> <span class="number">#FFF</span> , <span class="number">1298px</span> <span class="number">1422px</span> <span class="number">#FFF</span> , <span class="number">636px</span> <span class="number">794px</span> <span class="number">#FFF</span> , <span class="number">1713px</span> <span class="number">1526px</span> <span class="number">#FFF</span> , <span class="number">1710px</span> <span class="number">785px</span> <span class="number">#FFF</span> , <span class="number">1975px</span> <span class="number">1910px</span> <span class="number">#FFF</span> , <span class="number">1890px</span> <span class="number">990px</span> <span class="number">#FFF</span> , <span class="number">1932px</span> <span class="number">869px</span> <span class="number">#FFF</span> , <span class="number">623px</span> <span class="number">1478px</span> <span class="number">#FFF</span> , <span class="number">241px</span> <span class="number">1400px</span> <span class="number">#FFF</span> , <span class="number">1345px</span> <span class="number">1866px</span> <span class="number">#FFF</span> , <span class="number">1513px</span> <span class="number">1537px</span> <span class="number">#FFF</span> , <span class="number">1642px</span> <span class="number">500px</span> <span class="number">#FFF</span> , <span class="number">200px</span> <span class="number">42px</span> <span class="number">#FFF</span> , <span class="number">1617px</span> <span class="number">1818px</span> <span class="number">#FFF</span> , <span class="number">182px</span> <span class="number">499px</span> <span class="number">#FFF</span> , <span class="number">1482px</span> <span class="number">216px</span> <span class="number">#FFF</span> , <span class="number">31px</span> <span class="number">338px</span> <span class="number">#FFF</span> , <span class="number">564px</span> <span class="number">805px</span> <span class="number">#FFF</span> , <span class="number">249px</span> <span class="number">636px</span> <span class="number">#FFF</span> , <span class="number">899px</span> <span class="number">694px</span> <span class="number">#FFF</span> , <span class="number">1461px</span> <span class="number">967px</span> <span class="number">#FFF</span> , <span class="number">1340px</span> <span class="number">195px</span> <span class="number">#FFF</span> , <span class="number">1755px</span> <span class="number">635px</span> <span class="number">#FFF</span> , <span class="number">1587px</span> <span class="number">1216px</span> <span class="number">#FFF</span> , <span class="number">1118px</span> <span class="number">1054px</span> <span class="number">#FFF</span> , <span class="number">279px</span> <span class="number">488px</span> <span class="number">#FFF</span> , <span class="number">908px</span> <span class="number">1196px</span> <span class="number">#FFF</span> , <span class="number">1156px</span> <span class="number">1995px</span> <span class="number">#FFF</span> , <span class="number">1207px</span> <span class="number">1572px</span> <span class="number">#FFF</span> , <span class="number">125px</span> <span class="number">1773px</span> <span class="number">#FFF</span> , <span class="number">380px</span> <span class="number">283px</span> <span class="number">#FFF</span> , <span class="number">1900px</span> <span class="number">184px</span> <span class="number">#FFF</span> , <span class="number">687px</span> <span class="number">743px</span> <span class="number">#FFF</span> , <span class="number">107px</span> <span class="number">246px</span> <span class="number">#FFF</span> , <span class="number">1613px</span> <span class="number">233px</span> <span class="number">#FFF</span> , <span class="number">125px</span> <span class="number">1491px</span> <span class="number">#FFF</span> , <span class="number">77px</span> <span class="number">1928px</span> <span class="number">#FFF</span> , <span class="number">788px</span> <span class="number">872px</span> <span class="number">#FFF</span> , <span class="number">1697px</span> <span class="number">448px</span> <span class="number">#FFF</span> , <span class="number">722px</span> <span class="number">1142px</span> <span class="number">#FFF</span> , <span class="number">1840px</span> <span class="number">1462px</span> <span class="number">#FFF</span> , <span class="number">413px</span> <span class="number">683px</span> <span class="number">#FFF</span> , <span class="number">335px</span> <span class="number">250px</span> <span class="number">#FFF</span> , <span class="number">340px</span> <span class="number">1869px</span> <span class="number">#FFF</span> , <span class="number">403px</span> <span class="number">1659px</span> <span class="number">#FFF</span> , <span class="number">495px</span> <span class="number">468px</span> <span class="number">#FFF</span> , <span class="number">1647px</span> <span class="number">156px</span> <span class="number">#FFF</span> , <span class="number">783px</span> <span class="number">594px</span> <span class="number">#FFF</span> , <span class="number">290px</span> <span class="number">221px</span> <span class="number">#FFF</span> , <span class="number">1304px</span> <span class="number">1035px</span> <span class="number">#FFF</span> , <span class="number">642px</span> <span class="number">1073px</span> <span class="number">#FFF</span> , <span class="number">1812px</span> <span class="number">619px</span> <span class="number">#FFF</span> , <span class="number">238px</span> <span class="number">900px</span> <span class="number">#FFF</span> , <span class="number">825px</span> <span class="number">680px</span> <span class="number">#FFF</span> , <span class="number">1802px</span> <span class="number">1182px</span> <span class="number">#FFF</span> , <span class="number">1054px</span> <span class="number">199px</span> <span class="number">#FFF</span> , <span class="number">1140px</span> <span class="number">160px</span> <span class="number">#FFF</span> , <span class="number">305px</span> <span class="number">1755px</span> <span class="number">#FFF</span> , <span class="number">1963px</span> <span class="number">748px</span> <span class="number">#FFF</span> , <span class="number">691px</span> <span class="number">192px</span> <span class="number">#FFF</span> , <span class="number">940px</span> <span class="number">113px</span> <span class="number">#FFF</span> , <span class="number">236px</span> <span class="number">44px</span> <span class="number">#FFF</span> , <span class="number">439px</span> <span class="number">390px</span> <span class="number">#FFF</span> , <span class="number">1293px</span> <span class="number">1402px</span> <span class="number">#FFF</span> , <span class="number">228px</span> <span class="number">151px</span> <span class="number">#FFF</span> , <span class="number">1022px</span> <span class="number">773px</span> <span class="number">#FFF</span> , <span class="number">822px</span> <span class="number">1245px</span> <span class="number">#FFF</span> , <span class="number">1591px</span> <span class="number">173px</span> <span class="number">#FFF</span> , <span class="number">705px</span> <span class="number">1307px</span> <span class="number">#FFF</span> , <span class="number">595px</span> <span class="number">1779px</span> <span class="number">#FFF</span> , <span class="number">1474px</span> <span class="number">116px</span> <span class="number">#FFF</span> , <span class="number">978px</span> <span class="number">690px</span> <span class="number">#FFF</span> , <span class="number">230px</span> <span class="number">1474px</span> <span class="number">#FFF</span> , <span class="number">1326px</span> <span class="number">229px</span> <span class="number">#FFF</span> , <span class="number">1989px</span> <span class="number">860px</span> <span class="number">#FFF</span> , <span class="number">1978px</span> <span class="number">536px</span> <span class="number">#FFF</span> , <span class="number">1417px</span> <span class="number">1742px</span> <span class="number">#FFF</span> , <span class="number">1929px</span> <span class="number">1914px</span> <span class="number">#FFF</span> , <span class="number">285px</span> <span class="number">704px</span> <span class="number">#FFF</span> , <span class="number">625px</span> <span class="number">945px</span> <span class="number">#FFF</span> , <span class="number">1588px</span> <span class="number">1337px</span> <span class="number">#FFF</span> , <span class="number">36px</span> <span class="number">1851px</span> <span class="number">#FFF</span> , <span class="number">98px</span> <span class="number">843px</span> <span class="number">#FFF</span> , <span class="number">1138px</span> <span class="number">995px</span> <span class="number">#FFF</span> , <span class="number">1568px</span> <span class="number">1183px</span> <span class="number">#FFF</span> , <span class="number">1935px</span> <span class="number">1297px</span> <span class="number">#FFF</span> , <span class="number">908px</span> <span class="number">1586px</span> <span class="number">#FFF</span> , <span class="number">64px</span> <span class="number">1182px</span> <span class="number">#FFF</span> , <span class="number">886px</span> <span class="number">212px</span> <span class="number">#FFF</span> , <span class="number">741px</span> <span class="number">1197px</span> <span class="number">#FFF</span> , <span class="number">1886px</span> <span class="number">264px</span> <span class="number">#FFF</span> , <span class="number">1202px</span> <span class="number">1926px</span> <span class="number">#FFF</span> , <span class="number">589px</span> <span class="number">908px</span> <span class="number">#FFF</span> , <span class="number">474px</span> <span class="number">1652px</span> <span class="number">#FFF</span> , <span class="number">989px</span> <span class="number">731px</span> <span class="number">#FFF</span> , <span class="number">1261px</span> <span class="number">1536px</span> <span class="number">#FFF</span> , <span class="number">1656px</span> <span class="number">1133px</span> <span class="number">#FFF</span> , <span class="number">611px</span> <span class="number">1597px</span> <span class="number">#FFF</span> , <span class="number">1703px</span> <span class="number">1904px</span> <span class="number">#FFF</span> , <span class="number">996px</span> <span class="number">1201px</span> <span class="number">#FFF</span> , <span class="number">1183px</span> <span class="number">1048px</span> <span class="number">#FFF</span> , <span class="number">777px</span> <span class="number">1968px</span> <span class="number">#FFF</span> , <span class="number">172px</span> <span class="number">29px</span> <span class="number">#FFF</span> , <span class="number">272px</span> <span class="number">1756px</span> <span class="number">#FFF</span> , <span class="number">1403px</span> <span class="number">802px</span> <span class="number">#FFF</span> , <span class="number">1533px</span> <span class="number">1211px</span> <span class="number">#FFF</span> , <span class="number">1106px</span> <span class="number">1800px</span> <span class="number">#FFF</span> , <span class="number">1322px</span> <span class="number">1794px</span> <span class="number">#FFF</span> , <span class="number">1839px</span> <span class="number">1411px</span> <span class="number">#FFF</span> , <span class="number">885px</span> <span class="number">1504px</span> <span class="number">#FFF</span> , <span class="number">1150px</span> <span class="number">1123px</span> <span class="number">#FFF</span> , <span class="number">202px</span> <span class="number">693px</span> <span class="number">#FFF</span> , <span class="number">184px</span> <span class="number">106px</span> <span class="number">#FFF</span> , <span class="number">778px</span> <span class="number">270px</span> <span class="number">#FFF</span> , <span class="number">1902px</span> <span class="number">623px</span> <span class="number">#FFF</span> , <span class="number">1844px</span> <span class="number">1445px</span> <span class="number">#FFF</span> , <span class="number">857px</span> <span class="number">138px</span> <span class="number">#FFF</span> , <span class="number">413px</span> <span class="number">1237px</span> <span class="number">#FFF</span> , <span class="number">73px</span> <span class="number">1526px</span> <span class="number">#FFF</span> , <span class="number">432px</span> <span class="number">1786px</span> <span class="number">#FFF</span> , <span class="number">355px</span> <span class="number">1293px</span> <span class="number">#FFF</span> , <span class="number">766px</span> <span class="number">1003px</span> <span class="number">#FFF</span> , <span class="number">1573px</span> <span class="number">1977px</span> <span class="number">#FFF</span> , <span class="number">834px</span> <span class="number">417px</span> <span class="number">#FFF</span> , <span class="number">126px</span> <span class="number">1290px</span> <span class="number">#FFF</span> , <span class="number">276px</span> <span class="number">254px</span> <span class="number">#FFF</span> , <span class="number">170px</span> <span class="number">1931px</span> <span class="number">#FFF</span> , <span class="number">158px</span> <span class="number">754px</span> <span class="number">#FFF</span> , <span class="number">326px</span> <span class="number">1698px</span> <span class="number">#FFF</span> , <span class="number">228px</span> <span class="number">714px</span> <span class="number">#FFF</span> , <span class="number">924px</span> <span class="number">813px</span> <span class="number">#FFF</span> , <span class="number">851px</span> <span class="number">1357px</span> <span class="number">#FFF</span> , <span class="number">1816px</span> <span class="number">686px</span> <span class="number">#FFF</span> , <span class="number">396px</span> <span class="number">967px</span> <span class="number">#FFF</span> , <span class="number">540px</span> <span class="number">136px</span> <span class="number">#FFF</span> , <span class="number">1598px</span> <span class="number">1738px</span> <span class="number">#FFF</span> , <span class="number">282px</span> <span class="number">717px</span> <span class="number">#FFF</span> , <span class="number">1985px</span> <span class="number">1776px</span> <span class="number">#FFF</span> , <span class="number">1208px</span> <span class="number">761px</span> <span class="number">#FFF</span> , <span class="number">1249px</span> <span class="number">1436px</span> <span class="number">#FFF</span> , <span class="number">667px</span> <span class="number">1797px</span> <span class="number">#FFF</span> , <span class="number">1563px</span> <span class="number">698px</span> <span class="number">#FFF</span> , <span class="number">1158px</span> <span class="number">1859px</span> <span class="number">#FFF</span> , <span class="number">242px</span> <span class="number">212px</span> <span class="number">#FFF</span> , <span class="number">445px</span> <span class="number">1286px</span> <span class="number">#FFF</span> , <span class="number">1943px</span> <span class="number">950px</span> <span class="number">#FFF</span> , <span class="number">268px</span> <span class="number">819px</span> <span class="number">#FFF</span> , <span class="number">729px</span> <span class="number">1755px</span> <span class="number">#FFF</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Fonte"><a href="#Fonte" class="headerlink" title="Fonte"></a>Fonte</h2><p>O próximo passo é exibir a fonte inicial da abertura, aquela que diz “A long time ago in a galaxy far, far away…”.</p><p>Este é também um passo bastante simples, basta adicionarmos uma cor azul e uma fonte um pouco mais parecida com a do filme. Vamos de <em>Arial</em> mesmo</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.blue-font</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#24b9dd</span>;</span><br><span class="line">  <span class="attribute">font-family</span>: Arial;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Logo"><a href="#Logo" class="headerlink" title="Logo"></a>Logo</h2><p>Logo após esse texto vemos a logo do filme diminuindo de tamanho e sumindo no espaço.</p><p>Essa animação é bastante simples de ser feita. Para isso, basta termos uma imagem em tela e adicionar uma animação para diminuirmos o tamanho dela ao longo de 5 segundos.</p><p>Veja no código abaixo como fazemos isso:</p><p><img src="/images/star-wars.png" alt="Star Wars logo"></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.fade</span> &#123;</span><br><span class="line">  <span class="attribute">animation-name</span>: fadeout;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">10s</span>;</span><br><span class="line">  <span class="attribute">animation-fill-mode</span>: forwards;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> fadeout &#123;</span><br><span class="line">  <span class="selector-tag">from</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-tag">to</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">0%</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Texto-com-perspectiva"><a href="#Texto-com-perspectiva" class="headerlink" title="Texto com perspectiva"></a>Texto com perspectiva</h2><div><p>Por fim, finalizamos com o nosso texto amarelo.</p><p>Por incrível que pareça, conseguimos aplicar uma perpectiva em elementos utilizando apenas CSS.</p><p>Para isso, utilizamos o propriedade `transform`, com um valor de perspectiva e uma rotação no eixo X. É importante notar que a perspectiva é aplicada apenas para os elementos filhos de quem estiver com essa propriedade.</p></div><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.perspective</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fed34f</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">300px</span>) <span class="built_in">rotateX</span>(<span class="number">25deg</span>);</span><br><span class="line">  <span class="attribute">text-align</span>: justify;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Um efeito que a alguns anos atrás era um efeito de câmera inovador, hoje pode ser feito utilizando as mais simples linguagens da WEB.</p><p>Mais uma vez o CSS nos mostra o quando essa tecnologia é poderosa e, quando explorada, capaz de possibilitar coisas incríveis como essa.</p><style>.stars {  width: 1px;  height: 1px;  background: transparent;  box-shadow: 970px 909px #FFF , 1px 149px #FFF , 736px 348px #FFF , 1352px 1333px #FFF , 57px 1598px #FFF , 1007px 332px #FFF , 1474px 782px #FFF , 726px 826px #FFF , 768px 344px #FFF , 1673px 1878px #FFF , 1970px 722px #FFF , 123px 79px #FFF , 1137px 1554px #FFF , 490px 521px #FFF , 1277px 1346px #FFF , 14px 1701px #FFF , 114px 1127px #FFF , 849px 20px #FFF , 1697px 199px #FFF , 1013px 741px #FFF , 1643px 1821px #FFF , 1335px 1355px #FFF , 825px 290px #FFF , 1670px 1346px #FFF , 345px 1925px #FFF , 1063px 1880px #FFF , 265px 1203px #FFF , 1328px 493px #FFF , 1152px 806px #FFF , 661px 602px #FFF , 520px 1515px #FFF , 1256px 1907px #FFF , 1882px 1525px #FFF , 1024px 239px #FFF , 1959px 1343px #FFF , 623px 1380px #FFF , 1717px 1542px #FFF , 1318px 660px #FFF , 1586px 1581px #FFF , 340px 284px #FFF , 553px 1556px #FFF , 609px 800px #FFF , 613px 244px #FFF , 927px 1327px #FFF , 957px 1869px #FFF , 1029px 575px #FFF , 1851px 1438px #FFF , 1043px 819px #FFF , 1297px 1312px #FFF , 1361px 1224px #FFF , 974px 344px #FFF , 715px 1931px #FFF , 1583px 1370px #FFF , 1359px 1395px #FFF , 433px 1356px #FFF , 1818px 197px #FFF , 973px 1115px #FFF , 353px 1356px #FFF , 558px 1060px #FFF , 1584px 414px #FFF , 1272px 1404px #FFF , 1792px 22px #FFF , 147px 1524px #FFF , 751px 1032px #FFF , 1945px 700px #FFF , 366px 241px #FFF , 1119px 532px #FFF , 1029px 703px #FFF , 575px 888px #FFF , 1568px 1488px #FFF , 1527px 1002px #FFF , 471px 783px #FFF , 90px 1160px #FFF , 1646px 1805px #FFF , 714px 667px #FFF , 644px 1716px #FFF , 1917px 1700px #FFF , 1241px 1645px #FFF , 1285px 1327px #FFF , 1560px 132px #FFF , 1645px 1753px #FFF , 1703px 466px #FFF , 1099px 929px #FFF , 1629px 1954px #FFF , 1103px 338px #FFF , 1427px 1660px #FFF , 652px 1031px #FFF , 958px 1744px #FFF , 1015px 1712px #FFF , 1452px 1076px #FFF , 229px 1483px #FFF , 84px 1847px #FFF , 1671px 1333px #FFF , 1600px 345px #FFF , 1307px 168px #FFF , 915px 921px #FFF , 1367px 1826px #FFF , 1085px 1685px #FFF , 1514px 753px #FFF , 859px 1015px #FFF , 1871px 1239px #FFF , 1522px 381px #FFF , 981px 906px #FFF , 1207px 712px #FFF , 1197px 820px #FFF , 1573px 1186px #FFF , 864px 1824px #FFF , 1534px 1340px #FFF , 629px 607px #FFF , 1409px 997px #FFF , 882px 1459px #FFF , 150px 310px #FFF , 785px 1231px #FFF , 884px 523px #FFF , 1963px 1004px #FFF , 1529px 1395px #FFF , 632px 665px #FFF , 388px 1668px #FFF , 1468px 810px #FFF , 1165px 1575px #FFF , 1498px 252px #FFF , 275px 353px #FFF , 1171px 350px #FFF , 524px 1698px #FFF , 1652px 1900px #FFF , 1800px 1788px #FFF , 1743px 695px #FFF , 1806px 516px #FFF , 537px 1528px #FFF , 127px 763px #FFF , 1643px 1043px #FFF , 1717px 137px #FFF , 1553px 952px #FFF , 183px 1507px #FFF , 770px 322px #FFF , 241px 1999px #FFF , 148px 244px #FFF , 118px 1096px #FFF , 1183px 100px #FFF , 1158px 53px #FFF , 371px 735px #FFF , 1090px 1474px #FFF , 1145px 616px #FFF , 1300px 236px #FFF , 407px 672px #FFF , 1012px 142px #FFF , 100px 329px #FFF , 219px 506px #FFF , 482px 349px #FFF , 1397px 1560px #FFF , 566px 750px #FFF , 562px 1403px #FFF , 1154px 961px #FFF , 559px 169px #FFF , 568px 503px #FFF , 184px 1898px #FFF , 256px 793px #FFF , 668px 66px #FFF , 38px 544px #FFF , 832px 702px #FFF , 1676px 1579px #FFF , 1996px 910px #FFF , 806px 1313px #FFF , 1063px 79px #FFF , 539px 1035px #FFF , 552px 1740px #FFF , 774px 632px #FFF , 1453px 1152px #FFF , 491px 1160px #FFF , 1667px 793px #FFF , 655px 316px #FFF , 609px 470px #FFF , 1330px 53px #FFF , 420px 1814px #FFF , 1155px 447px #FFF , 1754px 360px #FFF , 913px 1425px #FFF , 1408px 1270px #FFF , 414px 128px #FFF , 31px 1664px #FFF , 1671px 899px #FFF , 125px 1133px #FFF , 1942px 351px #FFF , 1439px 466px #FFF , 886px 1853px #FFF , 1587px 677px #FFF , 241px 570px #FFF , 1886px 1293px #FFF , 1526px 84px #FFF , 508px 1419px #FFF , 759px 634px #FFF , 1314px 1121px #FFF , 1127px 545px #FFF , 993px 758px #FFF , 1770px 795px #FFF , 1629px 211px #FFF , 824px 1656px #FFF , 324px 1166px #FFF , 27px 1316px #FFF , 1258px 1468px #FFF , 428px 1923px #FFF , 661px 704px #FFF , 1872px 1640px #FFF , 1910px 1660px #FFF , 117px 995px #FFF , 253px 1792px #FFF , 1403px 1433px #FFF , 1441px 752px #FFF , 1472px 547px #FFF , 1715px 541px #FFF , 272px 187px #FFF , 881px 306px #FFF , 19px 1209px #FFF , 1807px 1423px #FFF , 693px 1752px #FFF , 160px 1252px #FFF , 1710px 237px #FFF , 32px 1786px #FFF , 1440px 1452px #FFF , 712px 1836px #FFF , 1324px 1411px #FFF , 728px 274px #FFF , 59px 244px #FFF , 1514px 16px #FFF , 1472px 923px #FFF , 1276px 1755px #FFF , 1099px 1301px #FFF , 1972px 1715px #FFF , 511px 1297px #FFF , 465px 1329px #FFF , 129px 1422px #FFF , 635px 959px #FFF , 206px 1663px #FFF , 1089px 150px #FFF , 911px 365px #FFF , 1520px 1828px #FFF , 133px 560px #FFF , 715px 1941px #FFF , 818px 1332px #FFF , 1407px 1564px #FFF , 64px 788px #FFF , 1048px 1656px #FFF , 1290px 1205px #FFF , 1230px 93px #FFF , 532px 570px #FFF , 170px 1545px #FFF , 507px 1924px #FFF , 197px 669px #FFF , 1945px 1559px #FFF , 400px 346px #FFF , 610px 1596px #FFF , 587px 245px #FFF , 272px 661px #FFF , 1889px 1419px #FFF , 1831px 234px #FFF , 1222px 840px #FFF , 1849px 1366px #FFF , 107px 1058px #FFF , 1589px 1327px #FFF , 1160px 324px #FFF , 438px 768px #FFF , 1225px 1707px #FFF , 662px 384px #FFF , 567px 786px #FFF , 1115px 95px #FFF , 195px 48px #FFF , 1623px 470px #FFF , 362px 746px #FFF , 546px 270px #FFF , 1120px 1542px #FFF , 1925px 1770px #FFF , 830px 1439px #FFF , 1419px 1360px #FFF , 128px 1049px #FFF , 1684px 578px #FFF , 714px 1156px #FFF , 102px 81px #FFF , 351px 1428px #FFF , 982px 472px #FFF , 1142px 1717px #FFF , 1195px 1182px #FFF , 337px 286px #FFF , 1309px 1402px #FFF , 1863px 1475px #FFF , 623px 1518px #FFF , 133px 1847px #FFF , 927px 1120px #FFF , 1439px 725px #FFF , 1722px 1576px #FFF , 706px 285px #FFF , 637px 455px #FFF , 574px 1498px #FFF , 674px 1851px #FFF , 1748px 683px #FFF , 563px 1521px #FFF , 1627px 1826px #FFF , 1360px 901px #FFF , 1551px 1458px #FFF , 1995px 517px #FFF , 1928px 303px #FFF , 1256px 1241px #FFF , 1283px 1911px #FFF , 923px 1235px #FFF , 758px 949px #FFF , 1133px 1794px #FFF , 1203px 623px #FFF , 344px 103px #FFF , 1032px 834px #FFF , 714px 555px #FFF , 702px 931px #FFF , 1431px 1808px #FFF , 1827px 1436px #FFF , 750px 192px #FFF , 1816px 769px #FFF , 1537px 64px #FFF , 670px 753px #FFF , 1832px 783px #FFF , 807px 1154px #FFF , 641px 1749px #FFF , 509px 399px #FFF , 1308px 79px #FFF , 319px 482px #FFF , 662px 829px #FFF , 1379px 1284px #FFF , 1812px 1594px #FFF , 359px 448px #FFF , 277px 1027px #FFF , 679px 795px #FFF , 1854px 689px #FFF , 275px 584px #FFF , 1772px 217px #FFF , 340px 920px #FFF , 1483px 968px #FFF , 567px 252px #FFF , 658px 507px #FFF , 1892px 860px #FFF , 1800px 261px #FFF , 1325px 1416px #FFF , 1053px 1894px #FFF , 459px 442px #FFF , 1172px 1566px #FFF , 1325px 695px #FFF , 764px 851px #FFF , 539px 582px #FFF , 1439px 999px #FFF , 67px 494px #FFF , 1251px 1832px #FFF , 731px 615px #FFF , 1024px 1997px #FFF , 1647px 365px #FFF , 932px 34px #FFF , 859px 247px #FFF , 249px 1998px #FFF , 555px 885px #FFF , 1663px 1423px #FFF , 1509px 381px #FFF , 694px 308px #FFF , 1430px 262px #FFF , 1944px 1413px #FFF , 1279px 1157px #FFF , 1298px 508px #FFF , 175px 967px #FFF , 568px 799px #FFF , 1417px 519px #FFF , 459px 368px #FFF , 681px 1629px #FFF , 41px 449px #FFF , 1630px 1507px #FFF , 1834px 1214px #FFF , 486px 1965px #FFF , 1581px 1047px #FFF , 995px 683px #FFF , 721px 1985px #FFF , 837px 624px #FFF , 885px 188px #FFF , 862px 1339px #FFF , 908px 1594px #FFF , 697px 267px #FFF , 386px 293px #FFF , 234px 1636px #FFF , 1805px 855px #FFF , 267px 350px #FFF , 493px 207px #FFF , 1541px 1176px #FFF , 377px 982px #FFF , 768px 878px #FFF , 1263px 812px #FFF , 175px 228px #FFF , 1601px 571px #FFF , 1696px 391px #FFF , 38px 415px #FFF , 1427px 1882px #FFF , 1306px 628px #FFF , 1257px 1933px #FFF , 1690px 1370px #FFF , 1812px 1778px #FFF , 1124px 1557px #FFF , 830px 567px #FFF , 1124px 842px #FFF , 1983px 1339px #FFF , 1855px 195px #FFF , 1545px 1092px #FFF , 1861px 1448px #FFF , 519px 1259px #FFF , 1141px 1117px #FFF , 1916px 1573px #FFF , 1112px 1870px #FFF , 1016px 1083px #FFF , 935px 1575px #FFF , 1275px 1355px #FFF , 363px 465px #FFF , 1085px 1388px #FFF , 1918px 952px #FFF , 104px 542px #FFF , 1013px 1562px #FFF , 1700px 1159px #FFF , 908px 289px #FFF , 1105px 1146px #FFF , 1420px 1676px #FFF , 1281px 457px #FFF , 1749px 1537px #FFF , 146px 45px #FFF , 51px 809px #FFF , 300px 991px #FFF , 1019px 1985px #FFF , 722px 216px #FFF , 1752px 1874px #FFF , 393px 798px #FFF , 483px 1645px #FFF , 324px 310px #FFF , 1688px 644px #FFF , 1848px 945px #FFF , 805px 1663px #FFF , 1927px 1468px #FFF , 999px 1120px #FFF , 1139px 677px #FFF , 1011px 1034px #FFF , 1123px 556px #FFF , 585px 1660px #FFF , 20px 67px #FFF , 1460px 1071px #FFF , 871px 726px #FFF , 1270px 587px #FFF , 814px 763px #FFF , 671px 799px #FFF , 1683px 1813px #FFF , 516px 1113px #FFF , 1490px 727px #FFF , 1825px 329px #FFF , 113px 1169px #FFF , 759px 1790px #FFF , 1195px 1933px #FFF , 1389px 1047px #FFF , 753px 1133px #FFF , 1858px 532px #FFF , 160px 83px #FFF , 1928px 1030px #FFF , 296px 351px #FFF , 1227px 673px #FFF , 1459px 397px #FFF , 1407px 316px #FFF , 1238px 1604px #FFF , 1060px 973px #FFF , 1579px 1000px #FFF , 1950px 10px #FFF , 1983px 462px #FFF , 1071px 330px #FFF , 1206px 343px #FFF , 454px 806px #FFF , 1404px 1721px #FFF , 969px 1813px #FFF , 1282px 1124px #FFF , 363px 1735px #FFF , 1688px 1952px #FFF , 1472px 264px #FFF , 762px 648px #FFF , 62px 588px #FFF , 1331px 1490px #FFF , 1189px 622px #FFF , 866px 320px #FFF , 1343px 1514px #FFF , 1201px 1297px #FFF , 1148px 904px #FFF , 1233px 1422px #FFF , 1450px 942px #FFF , 653px 1273px #FFF , 95px 279px #FFF , 853px 1428px #FFF , 1743px 163px #FFF , 1230px 737px #FFF , 812px 1580px #FFF , 1208px 33px #FFF , 1839px 1996px #FFF , 348px 1390px #FFF , 420px 1762px #FFF , 1915px 1121px #FFF , 776px 1562px #FFF , 1421px 1223px #FFF , 502px 94px #FFF , 1832px 1915px #FFF , 175px 367px #FFF , 592px 1593px #FFF , 1966px 922px #FFF , 365px 1586px #FFF , 1889px 220px #FFF , 1742px 1810px #FFF , 1801px 371px #FFF , 888px 1587px #FFF , 1567px 1363px #FFF , 26px 99px #FFF , 1542px 14px #FFF , 128px 461px #FFF , 300px 454px #FFF , 929px 502px #FFF , 290px 433px #FFF , 1856px 104px #FFF , 1971px 1303px #FFF , 1013px 1086px #FFF , 842px 1535px #FFF , 710px 1915px #FFF , 1796px 308px #FFF , 58px 501px #FFF , 1010px 801px #FFF , 405px 251px #FFF , 892px 909px #FFF , 1653px 1133px #FFF , 355px 1729px #FFF , 890px 1955px #FFF , 182px 811px #FFF , 1824px 365px #FFF , 1992px 383px #FFF , 1241px 1001px #FFF , 1805px 164px #FFF , 418px 1830px #FFF , 1575px 1143px #FFF , 1513px 1119px #FFF , 1927px 242px #FFF , 559px 48px #FFF , 1129px 666px #FFF , 643px 1716px #FFF , 150px 744px #FFF , 312px 136px #FFF , 1777px 848px #FFF , 1388px 1238px #FFF , 910px 1209px #FFF , 908px 1574px #FFF , 1466px 425px #FFF , 1903px 883px #FFF , 598px 1541px #FFF , 1743px 771px #FFF , 884px 1281px #FFF , 297px 1236px #FFF , 1298px 1422px #FFF , 636px 794px #FFF , 1713px 1526px #FFF , 1710px 785px #FFF , 1975px 1910px #FFF , 1890px 990px #FFF , 1932px 869px #FFF , 623px 1478px #FFF , 241px 1400px #FFF , 1345px 1866px #FFF , 1513px 1537px #FFF , 1642px 500px #FFF , 200px 42px #FFF , 1617px 1818px #FFF , 182px 499px #FFF , 1482px 216px #FFF , 31px 338px #FFF , 564px 805px #FFF , 249px 636px #FFF , 899px 694px #FFF , 1461px 967px #FFF , 1340px 195px #FFF , 1755px 635px #FFF , 1587px 1216px #FFF , 1118px 1054px #FFF , 279px 488px #FFF , 908px 1196px #FFF , 1156px 1995px #FFF , 1207px 1572px #FFF , 125px 1773px #FFF , 380px 283px #FFF , 1900px 184px #FFF , 687px 743px #FFF , 107px 246px #FFF , 1613px 233px #FFF , 125px 1491px #FFF , 77px 1928px #FFF , 788px 872px #FFF , 1697px 448px #FFF , 722px 1142px #FFF , 1840px 1462px #FFF , 413px 683px #FFF , 335px 250px #FFF , 340px 1869px #FFF , 403px 1659px #FFF , 495px 468px #FFF , 1647px 156px #FFF , 783px 594px #FFF , 290px 221px #FFF , 1304px 1035px #FFF , 642px 1073px #FFF , 1812px 619px #FFF , 238px 900px #FFF , 825px 680px #FFF , 1802px 1182px #FFF , 1054px 199px #FFF , 1140px 160px #FFF , 305px 1755px #FFF , 1963px 748px #FFF , 691px 192px #FFF , 940px 113px #FFF , 236px 44px #FFF , 439px 390px #FFF , 1293px 1402px #FFF , 228px 151px #FFF , 1022px 773px #FFF , 822px 1245px #FFF , 1591px 173px #FFF , 705px 1307px #FFF , 595px 1779px #FFF , 1474px 116px #FFF , 978px 690px #FFF , 230px 1474px #FFF , 1326px 229px #FFF , 1989px 860px #FFF , 1978px 536px #FFF , 1417px 1742px #FFF , 1929px 1914px #FFF , 285px 704px #FFF , 625px 945px #FFF , 1588px 1337px #FFF , 36px 1851px #FFF , 98px 843px #FFF , 1138px 995px #FFF , 1568px 1183px #FFF , 1935px 1297px #FFF , 908px 1586px #FFF , 64px 1182px #FFF , 886px 212px #FFF , 741px 1197px #FFF , 1886px 264px #FFF , 1202px 1926px #FFF , 589px 908px #FFF , 474px 1652px #FFF , 989px 731px #FFF , 1261px 1536px #FFF , 1656px 1133px #FFF , 611px 1597px #FFF , 1703px 1904px #FFF , 996px 1201px #FFF , 1183px 1048px #FFF , 777px 1968px #FFF , 172px 29px #FFF , 272px 1756px #FFF , 1403px 802px #FFF , 1533px 1211px #FFF , 1106px 1800px #FFF , 1322px 1794px #FFF , 1839px 1411px #FFF , 885px 1504px #FFF , 1150px 1123px #FFF , 202px 693px #FFF , 184px 106px #FFF , 778px 270px #FFF , 1902px 623px #FFF , 1844px 1445px #FFF , 857px 138px #FFF , 413px 1237px #FFF , 73px 1526px #FFF , 432px 1786px #FFF , 355px 1293px #FFF , 766px 1003px #FFF , 1573px 1977px #FFF , 834px 417px #FFF , 126px 1290px #FFF , 276px 254px #FFF , 170px 1931px #FFF , 158px 754px #FFF , 326px 1698px #FFF , 228px 714px #FFF , 924px 813px #FFF , 851px 1357px #FFF , 1816px 686px #FFF , 396px 967px #FFF , 540px 136px #FFF , 1598px 1738px #FFF , 282px 717px #FFF , 1985px 1776px #FFF , 1208px 761px #FFF , 1249px 1436px #FFF , 667px 1797px #FFF , 1563px 698px #FFF , 1158px 1859px #FFF , 242px 212px #FFF , 445px 1286px #FFF , 1943px 950px #FFF , 268px 819px #FFF , 729px 1755px #FFF;}.black-sky {  background-color: black;  color: white !important;}.blue-font {  color: #24b9dd !important;  font-family: Arial;}.yellow-font {  color: #fed34f !important;}.size {  display: flex;  align-items: center;  justify-content: center;  height: 350px;}.fade {  animation-name: fadeout;  animation-duration: 10s;  animation-fill-mode: forwards;}@keyframes fadeout {  from {    width: 100%;  }  to {    width: 0%;  }}.perspective {  color: #fed34f !important;  transform: perspective(300px) rotateX(25deg);  text-align: justify;}</style><div id="stars" style="position: absolute; top: 0; left: -700px;"></div><script>const scrollEvents = [  {    offset: document.querySelector('#Cor-de-fundo').offsetTop,    event: () => {      document.querySelector('body').classList.add('black-sky');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.add('black-sky'));    },    undo: () => {      document.querySelector('body').classList.remove('black-sky');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.remove('black-sky'));    }  },  {    offset: document.querySelector('#Estrelas').offsetTop,    event: () => {      document.querySelector('#stars').classList.add('stars');    },    undo: () => {      document.querySelector('#stars').classList.remove('stars');    }  },  {    offset: document.querySelector('#Fonte').offsetTop,    event: () => {      document.querySelector('body').classList.add('blue-font');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.add('blue-font'));    },    undo: () => {      document.querySelector('body').classList.remove('blue-font');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.remove('blue-font'));    }  },  {    offset: document.querySelector('#Logo').offsetTop,    event: () => {      document.querySelector('[alt="Star Wars logo"]').classList.add('fade');      document.querySelector('[alt="Star Wars logo"]').parentElement.classList.add('size');    },    undo: () => {      document.querySelector('[alt="Star Wars logo"]').parentElement.classList.remove('size');    }  },  {    offset: document.querySelector('#Texto-com-perspectiva').offsetTop,    event: () => {      document.querySelector('#Texto-com-perspectiva+div').classList.add('perspective');      document.querySelector('body').classList.add('yellow-font');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.add('yellow-font'));    },    undo: () => {      document.querySelector('#Texto-com-perspectiva+div').classList.remove('perspective');      document.querySelector('body').classList.remove('yellow-font');      document.querySelectorAll('h1, h2, h3, h4, h5, a').forEach(e => e.classList.remove('yellow-font'));    }  },  ];const onScroll = (event) => {  scrollEvents.forEach((event) => {    if (window.scrollY + 200 > event.offset) {      event.event();    } else {      event.undo();    }  });}document.addEventListener('scroll', onScroll, { passive: true });</script>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/05/20/star-wars/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Porque não uso muitos apps</title>
      <link>https://cgreinhold.dev/2021/04/28/tools/</link>
      <guid>https://cgreinhold.dev/2021/04/28/tools/</guid>
      <pubDate>Wed, 28 Apr 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Hoje em dia é muito fácil encontrar apps e ferramentas de produtividade ou lazer por aí, seja na internet ou em lojas de aplicativos. Mui
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Hoje em dia é muito fácil encontrar apps e ferramentas de produtividade ou lazer por aí, seja na internet ou em lojas de aplicativos. Muitos desses apps funcionam com diversos tipos de integrações para que você possar ter toda informação que precisa em qualquer lugar de forma rápida.</p><p>Quando utilizo essas ferramentas para trabalho, percebo que realmente são muito eficientes, mas vinculá-las as seu celular pessoal, ou passar a utilizar para motivos pessoais acabam, por incrível que pareça, diminuindo minha produtividade.</p><p>Claro que essa é apenas a minha experiência, mas explico por que não funciona muito bem para mim.</p><h2 id="Excesso-de-informacao"><a href="#Excesso-de-informacao" class="headerlink" title="Excesso de informação"></a>Excesso de informação</h2><p>Quando adiciono aplicativos como Slack, Discord ou Twitter no meu celular, isso inconcientemente ativa em mim uma vontade frequente de ficar abrindo o app para ver as últimas atualizações e ficar antenado. Isso acontece com mais frequência ainda com as notificações habilitadas.</p><p>Não tenho a intenção de parar de usar essas aplicações, mas percebo que não me sinto muito necessitado quando não tenho acesso rápido a eles. Por isso, mantenho os apps apenas no meu computador. Caso eu realmente preciso verificar algo, preciso ter o trabalho de abrir o laptop para então verificar as atualizações.</p><h2 id="Facilidade-de-acesso"><a href="#Facilidade-de-acesso" class="headerlink" title="Facilidade de acesso"></a>Facilidade de acesso</h2><p>Outro motivo que me faz ser menos produtivo é a facilidade como posso acessar a maioria dos apps.</p><p>O Youtube por exemplo, é extremamente viciante, e ter o app instalado no meu celular, seguindo diversos canais diferentes é uma forma muito rápida de assistir vídeos.</p><p>Existem muitos canais que gosto de acompanhar, mas para evitar o vício constante de atualizar o feed de atividades, ou ficar abrindo o app constantemente, não tenho ele instalado e não sigo nenhum canal. Não preciso do Youtube me lembrando que o canal lançou um vídeo para eu ver. Simplesmente verei quando eu lembrar do canal e ir atrás verificar se existe algo novo de interessante.</p><p>Este é o mesmo motivo por eu ter parado de utilizar feeds RSS. Ao invés de ter a informação trazida para mim o tempo todo, só vou atrás dela quando lembro que quero saber algo.</p><h2 id="Excesso-de-integracoes"><a href="#Excesso-de-integracoes" class="headerlink" title="Excesso de integrações"></a>Excesso de integrações</h2><p>Outra coisa que me fazia manter menos produtivo (ou mais ansioso) era ter uma suíte de aplicativos integrados entre si, com acesso em diversos dispositivos. Eu sempre procurava a melhor ferramenta para eu manter listas, links ou arquivos que muitas vezes nunca eram utilizados de novo.</p><p>Excluí todos os meus apps de produtividade e hoje mantenho apenas um notepad com as coisas que preciso no meu computador. As importantes claro, mantenho na nuvem, mas as outras precisam de muito esforço para serem acessadas.</p><p>Com isso evito de ficar salvando coisas que não são realmente necessárias (se não me dou o esforço de salvar é porque não vale a pena) e só acessar essas coisas quando eu realmente preciso.</p><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Sem o acesso fácil a todo esse tipo de informação, fica muito mais difícil de eu passar muito tempo procrastinando. Claro que as vezes ainda paro pra verificar o twitter, ou assitir vídeos do youtube, mas somente o fato de ter que me esforçar para isso já me faz pensar duas vezes e talvez optar por uma volta de bicicleta, ou algo diferente.</p>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/04/28/tools/#disqus_thread</comments>
    </item>
    
    <item>
      <title>Regex Mistery</title>
      <link>https://cgreinhold.dev/2021/04/16/regex-mistery/</link>
      <guid>https://cgreinhold.dev/2021/04/16/regex-mistery/</guid>
      <pubDate>Fri, 16 Apr 2021 22:00:00 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;Após estudar um pouco sobre comportamentos do regex que eu não conhecia, decidi criar o &lt;strong&gt;Regex Mistery&lt;/strong&gt;, um jogo que busca
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>Após estudar um pouco sobre comportamentos do regex que eu não conhecia, decidi criar o <strong>Regex Mistery</strong>, um jogo que busca ensinar os diferentes conceitos de uma forma mais divertida.</p><p>O jogo é composto de diversos níveis, cada um com um desafio diferente que deve ser resolvido para avançar para as próximas fases.</p><p><img src="/images/regex-mistery.PNG" alt="Regex Mistery print"></p><p>Será que você consegue chegar até o fim desse desafio? Você pode jogá-lo através <a href="https://regex-mistery.cgreinhold.dev/" target="_blank" rel="noopener">desse link</a>.</p>]]></content:encoded>
      
      <comments>https://cgreinhold.dev/2021/04/16/regex-mistery/#disqus_thread</comments>
    </item>
    
  </channel>
</rss>
