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

<channel>
	<title>Introdução à Programação 1 e 2 (2009) &#187; aulas</title>
	<atom:link href="http://www.brunocampagnolo.com/2009ip/category/aulas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brunocampagnolo.com/2009ip</link>
	<description>PUCPR &#62; Design Digital &#62; 1o e 2o Períodos</description>
	<lastBuildDate>Fri, 18 Dec 2009 10:33:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bibliotecas no Processing</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/11/17/bibliotecas-no-processing/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/11/17/bibliotecas-no-processing/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 17:32:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=1031</guid>
		<description><![CDATA[Resumo da aula

]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brunocampagnolo.com/2009_2/processing/libs/">Resumo da aula</a></p>
<p><iframe src="http://www.brunocampagnolo.com/2009_2/processing/libs/" width="600" height="400"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/11/17/bibliotecas-no-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notas!</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/11/10/notas/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/11/10/notas/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 20:00:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[notas]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=1018</guid>
		<description><![CDATA[Pessoal,
Por favor confiram suas notas!
http://spreadsheets.google.com/ccc?key=0AqQ2GvdPZmGjcmFMU1NoM3phaUFQaVRualVIV2tkc0E&#38;amp;amp;hl=pt_BR
Farei o lançamento no iger na próxima sexta. Qualquer problema, por favor, avise!
&#160;
&#160;
]]></description>
			<content:encoded><![CDATA[<p>Pessoal,</p>
<p>Por favor confiram suas notas!</p>
<p><a href="http://spreadsheets.google.com/ccc?key=0AqQ2GvdPZmGjcmFMU1NoM3phaUFQaVRualVIV2tkc0E&amp;amp;amp;hl=pt_BR">http://spreadsheets.google.com/ccc?key=0AqQ2GvdPZmGjcmFMU1NoM3phaUFQaVRualVIV2tkc0E&amp;amp;amp;hl=pt_BR</a></p>
<p>Farei o lançamento no iger na próxima sexta. Qualquer problema, por favor, avise!</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/11/10/notas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exemplo de carregamento de modelo .obj</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/10/06/exemplo-de-carregamento-de-modelo-obj/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/10/06/exemplo-de-carregamento-de-modelo-obj/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 19:23:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[obj]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=1002</guid>
		<description><![CDATA[Exemplo de carregamento de modelo .obj
Para que funcione é necessário a instalação da biblioteca .obj loader.
Passo a passo 3d no Processing, ver seção 8.
&#160;
Links para arquivos .obj.
&#160;
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/10/carrega_obj.zip">Exemplo de carregamento de modelo .obj</a></p>
<p>Para que funcione é necessário a instalação da biblioteca <a href="http://code.google.com/p/saitoobjloader/">.obj loader.</a></p>
<p><a href="http://www.brunocampagnolo.com/2009_2/processing/p3d/">Passo a passo 3d no Processing, ver seção 8.</a></p>
<p>&nbsp;</p>
<p><a href="http://people.sc.fsu.edu/~burkardt/data/obj/obj.html">Links para arquivos .obj.</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/10/06/exemplo-de-carregamento-de-modelo-obj/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funções em Processing</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/09/29/funcoes-em-processing/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/09/29/funcoes-em-processing/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 20:22:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[funções]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=991</guid>
		<description><![CDATA[Em anexo
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brunocampagnolo.com/2009_2/processing/funcoes/">Em anexo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/09/29/funcoes-em-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3d no Processing</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/08/25/3d-no-processing/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/08/25/3d-no-processing/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 22:06:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=976</guid>
		<description><![CDATA[Resumo sobre 3d no Processing
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/08/3dProcessing1.zip">Resumo sobre 3d no Processing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/08/25/3d-no-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resumo sobre transformações 3d no Processing</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/08/18/resumo-sobre-transformacoes-3d-no-processing/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/08/18/resumo-sobre-transformacoes-3d-no-processing/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 19:34:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=968</guid>
		<description><![CDATA[3d no Processing
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/08/3dProcessing.zip">3d no Processing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/08/18/resumo-sobre-transformacoes-3d-no-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercício P07 (aquecimento) (retorno das férias!)</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/07/28/exercicio-p07-aquecimento-retorno-das-ferias/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/07/28/exercicio-p07-aquecimento-retorno-das-ferias/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 21:09:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=947</guid>
		<description><![CDATA[Sejam bem vindos de volta à nossa disciplina de Introdução à Programação. Neste semestre, continuaremos a trabalhar com a linguagem Processing e, principalmente, com mais fundamentos referentes à lógica de programação. Trabalhamemos neste semestre com:

Processamento de imagem;
Programação gráfica 3d;
Programação para dispositivos móveis;
Modularização de algoritmos;
Uso de bibliotecas em geral;
Bibliotecas de física e simulação;
Programação de som e [...]]]></description>
			<content:encoded><![CDATA[<p>Sejam bem vindos de volta à nossa disciplina de Introdução à Programação. Neste semestre, continuaremos a trabalhar com a linguagem Processing e, principalmente, com mais fundamentos referentes à lógica de programação. Trabalhamemos neste semestre com:</p>
<ul>
<li>Processamento de imagem;</li>
<li>Programação gráfica 3d;</li>
<li>Programação para dispositivos móveis;</li>
<li>Modularização de algoritmos;</li>
<li>Uso de bibliotecas em geral;</li>
<li>Bibliotecas de física e simulação;</li>
<li>Programação de som e video;</li>
<li>Realidade aumentada;</li>
<li>Desenvolvimento de projeto.</li>
</ul>
<p>Neste semestre, continua a <strong>diminuir o peso</strong> da prova e a crescer o peso dos trabalhos.</p>
<p>Os exercícios a seguir são um <strong>aquecimento</strong>, um preview do que está para vir e servem, também, para ilustrar alguns temas que passamos rapidamente no semestre anterior.</p>
<p>1) Por padrão, o eixo de coordenadas no Processing funciona como na imagem a seguir:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo.png"><img class="alignnone size-full wp-image-948" title="eixo" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo.png" alt="eixo" width="332" height="152" /></a></p>
<p>Na prática, podemos mover este sistema de coordenadas através de comandos de <strong>transformação de coordenadas</strong>. Principalmente quando formos trabalhar com coordenadas em 3d, muitas vezes é mais fácil mover o eixo.</p>
<p>A função translate (<a href="http://processing.org/reference/translate_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/translate_.html">pt</a>) move o eixo a partir da lateral superior esquerda. Esta função recebe dois parâmetros: o primeiro, é o deslocamento em relação ao eixo x e o segundo é o deslocamento em relação ao eixo y.</p>
<p>Complete o código a seguir com os comandos de transformação de forma a conseguir o resultado esperado. Observe que a letra a já está respondida.</p>
<p>a)&nbsp;</p>
<p>rect(10, 10, 30, 30);<br />
translate(50, 0);<br />
rect(10, 10, 30, 30);<br />
translate(__X1__, __X2__);<br />
rect(10, 10, 30, 30);<br />
translate(__X3__, __X4__);<br />
rect(10, 10, 30, 30);</p>
<p>Resultado esperado:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_a.png"><img class="alignnone size-full wp-image-949" title="exerctranslate_a" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_a.png" alt="exerctranslate_a" width="144" height="164" /></a></p>
<p>Resposta do exercício:</p>
<p>rect(10, 10, 30, 30);<br />
translate(50, 0);<br />
rect(10, 10, 30, 30);<br />
translate(<span style="text-decoration: underline;"><strong>0</strong></span>, <span style="text-decoration: underline;"><strong>50</strong></span>);<br />
rect(10, 10, 30, 30);<br />
translate(<span style="text-decoration: underline;"><strong>-50</strong></span>, <strong><span style="text-decoration: underline;">0</span></strong>);<br />
rect(10, 10, 30, 30);</p>
<p>b)</p>
<p>ellipse(50, 50, 10, 10);<br />
translate(10, 10);<br />
ellipse(50, 50, 10, 10);<br />
translate(__x1__, __x2__);<br />
ellipse(50, 50, 10, 10);<br />
translate(__x3__, __x4__);<br />
ellipse(50, 50, 10, 10);<br />
translate(__x5__, __x6__);<br />
ellipse(50, 50, 10, 10);</p>
<p>Resultado esperado:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_b.png"><img class="alignnone size-full wp-image-950" title="exerctranslate_b" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_b.png" alt="exerctranslate_b" width="144" height="164" /></a></p>
<p>c)</p>
<p>for(int i=0;i&lt;10;i++) {<br />
&nbsp; rect(0, 0, 10, 10);<br />
&nbsp; translate(__X1__, __X2__);<br />
}</p>
<p>Resultado esperado:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_c.png"><img class="alignnone size-full wp-image-951" title="exerctranslate_c" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exerctranslate_c.png" alt="exerctranslate_c" width="144" height="164" /></a></p>
<p>2) Outra transformação possível é a rotação, implementada através do comando rotate (<a href="http://processing.org/reference/rotate_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/rotate_.html">pt</a>). Tal função rotaciona&nbsp; o eixo em uma quantidade especificada pelo parâmetro. O ângulo é dado em radianos, ou seja, devem estar entre zero e 2PI. Se quiser converter de graus para radianos use a função radians (<a href="http://processing.org/reference/radians_.html">en</a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/radians_.html">pt</a>).</p>
<p>Complete o código a seguir de forma a conseguir o resultado esperado. Observe que a letra a já está respondida.</p>
<p>a)</p>
<p>noFill();<br />
stroke(__X1__,0,0);<br />
line(0,0, 100, 0);<br />
rect(20, 20, 50, 50);<br />
rotate(__X2__);<br />
stroke(0,255,0);<br />
line(0, 0, 100, 0);<br />
rect(20, 20, 50, 50);<br />
rotate(__X3__);<br />
stroke(0,0,255);<br />
line(0, 0, 100, 0);<br />
rect(20, 20, 50, 50);</p>
<p>Resultado esperado:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_a.png"><img class="alignnone size-full wp-image-952" title="exercrotate_a" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_a.png" alt="exercrotate_a" width="144" height="164" /></a></p>
<p>Resposta:</p>
<p>noFill();<br />
stroke(255,0,0);<br />
line(0,0, 100, 0);<br />
rect(20, 20, 50, 50);<br />
rotate(PI/12);<br />
stroke(0,255,0);<br />
line(0, 0, 100, 0);<br />
rect(20, 20, 50, 50);<br />
rotate(PI/12);<br />
stroke(0,0,255);<br />
line(0, 0, 100, 0);<br />
rect(20, 20, 50, 50);</p>
<p>b)</p>
<p>noFill();<br />
stroke(255,0,0);<br />
line(0, 0, 100, 0);<br />
line(0, 0, 0, 100);<br />
rect(-20, -20, 40, 40);<br />
translate(__X1__,__X2__);<br />
stroke(0,255,0);<br />
line(0, 0, 100, 0);<br />
line(0, 0, 0, 100);<br />
rect(-20, -20, 40, 40);<br />
rotate(__X3__);<br />
stroke(0,0,255);<br />
line(0, 0, 100, 0);<br />
line(0, 0, 0, 100);<br />
rect(-20, -20, 40, 40);<br />
rotate(__X4__);<br />
stroke(255,0,255);<br />
line(0, 0, 100, 0);<br />
line(0, 0, 0, 100);<br />
rect(-20, -20, 40, 40);</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_b.png"><img class="alignnone size-full wp-image-953" title="exercrotate_b" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_b.png" alt="exercrotate_b" width="144" height="164" /></a></p>
<p>c)</p>
<p>noFill();<br />
translate(50,50);<br />
for(int i=0;i&lt;10;i++) {<br />
&nbsp; rotate(__X__);<br />
&nbsp; rect(-25, -25, 50, 50);<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_c.png"><img class="alignnone size-full wp-image-954" title="exercrotate_c" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercrotate_c.png" alt="exercrotate_c" width="144" height="164" /></a></p>
<p>&nbsp;</p>
<p>3) Outros comandos disponíveis relacionados à transformações são os comandos scale (<a href="http://processing.org/reference/scale_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/scale_.html">pt</a>), pushMatrix (<a href="http://processing.org/reference/pushMatrix_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/pushMatrix_.html">pt</a>) e popMatrix (<a href="http://processing.org/reference/popMatrix_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/popMatrix_.html">pt</a>). A função scale aumenta/diminui o eixo de coordenadas. A função pushMatrix guarda em uma pilha o estado atual das transformações sendo feitas. A função popMatrix retorna ao estado colocado anteriormente na pilha.</p>
<p>Complete o código a seguir de forma a conseguir o resultado esperado.</p>
<p>a)</p>
<p>pushMatrix();<br />
translate(50,50);<br />
for(int i=0;i&lt;5;i++) {<br />
&nbsp; rotate(__X1__);<br />
&nbsp; scale(__X2__);<br />
&nbsp; rect(-30, -30, __X3__, __X4__);<br />
}<br />
popMatrix();<br />
noFill();<br />
rect(10, 10, 80, 80);</p>
<p>Resultado esperado:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercscale_a.png"><img class="alignnone size-full wp-image-956" title="exercscale_a" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/exercscale_a.png" alt="exercscale_a" width="144" height="164" /></a></p>
<p>&nbsp;</p>
<p>3) O comando size (<a href="http://processing.org/reference/size_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/size_.html">pt</a>) define o dimensionamento da janela de visualização. Até agora, usamos o comando size apenas com os parâmetros largura e altura. O 3o parâmetro do comando size permite que façamos a escolha do renderizador que o Processing vai usar. Os renderizadores disponíveis são:</p>
<ul>
<li><strong>JAVA2D</strong>: padrão, ideal para trabalhar com gráficos vetoriais 2d;</li>
<li><strong>P2D</strong>: destinado a gráficos simples e voltado para manipulação direta de pixels;</li>
<li><strong>P3D</strong>: gráficos em 3d simplificados, voltados para o trabalho com pixels diretamente;</li>
<li><strong>OPENGL</strong>: gráficos em 3d via JOGL;</li>
<li><strong>PDF</strong>: desenha em um arquivo PDF.</li>
</ul>
<p>Para usar esses renderizadores, use, por exemplo:</p>
<ul>
<li>size(400, 400, JAVA2D);</li>
<li>size(400, 400, P2P);</li>
<li>size(400, 400, P3D);</li>
<li>size(400, 400, OPENGL);</li>
<li>size(400, 400, PDF, &#8220;output.pdf&#8221;);</li>
</ul>
<p>Para usar o renderizador OPENGL é necessário selecionar o menu Sketch &gt; Import Library &gt; OpenGL.</p>
<p>Observe que para a visualização em 3d (P3D e OPENGL) o eixo z agora deve ser considerado.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo3d.png"><img class="alignnone size-full wp-image-957" title="eixo3d" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo3d.png" alt="eixo3d" width="537" height="396" /></a></p>
<p>Fonte das imagens: REAS &amp;amp;amp;amp; FRY (Processing).</p>
<p>Observe que agora é possível usar as funções rotateX, rotateY e rotateZ de maneira semelhante à função rotate.</p>
<p>&nbsp;</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo3dRotacao1.png"><img class="alignnone size-full wp-image-959" title="eixo3dRotacao" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/07/eixo3dRotacao1.png" alt="eixo3dRotacao" width="789" height="259" /></a></p>
<p>Fonte das imagens: REAS &amp;amp;amp;amp; FRY (Processing).</p>
<p><span style="text-decoration: underline;">Refaça qualquer um dos exercícios que entregou anteriormente utilizando o renderizador OpenGL e o renderizador P3D.</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/07/28/exercicio-p07-aquecimento-retorno-das-ferias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 12 &#8211; Vetores</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/06/16/aula-12-vetores/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/06/16/aula-12-vetores/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 19:26:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[vetores]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=864</guid>
		<description><![CDATA[Objetivo
As variáveis criadas até agora permitiram o armazenamento de apenas um valor de cada vez. Vetores permitem a definição de variáveis com o poder de armazenar múltiplos valores. Voltando à metáfora das gavetas, um vetor corresponde a uma gaveta com inúmeras subdivisões.
O objetivo deste capítulo é definir como podemos utilizar vetores em nossos programas e [...]]]></description>
			<content:encoded><![CDATA[<h2>Objetivo</h2>
<p>As variáveis criadas até agora permitiram o armazenamento de apenas um valor de cada vez. Vetores permitem a definição de variáveis com o poder de armazenar múltiplos valores. Voltando à metáfora das gavetas, um vetor corresponde a uma gaveta com inúmeras subdivisões.</p>
<p>O objetivo deste capítulo é definir como podemos utilizar vetores em nossos programas e descreve inúmeras situações nas quais os vetores são essenciais.</p>
<h2>Sintaxe introduzida</h2>
<ul>
<li>Funções de manipulação de vetor:
<ul>
<li><a href="http://www.processing.org/reference/append_.html">append</a>: Aumenta um vetor em um elemento colocando um novo elemento no fim do vetor;</li>
<li><a href="http://www.processing.org/reference/arrayCopy_.html">arrayCopy</a>: Copia um vetor ou parte deve em outro;</li>
<li><a href="http://www.processing.org/reference/concat_.html">concat</a>: Concatena (junta) dois vetores;</li>
<li><a href="http://www.processing.org/reference/expand_.html">expand</a>: Aumenta um vetor para o dobro de seu tamanho ou para um tamanho especificado;</li>
<li><a href="http://www.processing.org/reference/reverse_.html">reverse</a>: Inverte um vetor;</li>
<li><a href="http://www.processing.org/reference/shorten_.html">shorten</a>: Elimina o último elemento de um vetor;</li>
<li><a href="http://www.processing.org/reference/sort_.html">sort</a>: Ordena um vetor;</li>
<li><a href="http://www.processing.org/reference/splice_.html">splice</a>:&nbsp; Coloca um vetor ou elemento dentro de um outro;</li>
<li><a href="http://www.processing.org/reference/subset_.html">subset</a>: Retorna um vetor de elementos de dentro de um vetor já existente.</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<h2>Declarando e criando vetores</h2>
<p>Variáveis do tipo vetor podem ser declaradas da mesma maneira que se declara qualquer outro tipo de dado. A diferença é que após o nome do tipo de dado, deve-se colocar um sinal de abertura e de fechamento de colchetes ([ e ]).</p>
<p>Dessa forma, os seguintes códigos declaram vetores:</p>
<p>int[] posicao;</p>
<p>float[] tamanho;</p>
<p>color[] cor;</p>
<p>string[] nome;</p>
<p>Depois da declaração de uma variável como vetor, ele não pode ser utilizado ainda. É necessária a criação do vetor informando quantas posições ele disponibiliza para uso. Neste momento, parte da memória do computador é separada para cada posição do vetor. A palavra chave new é usada neste processo.</p>
<p>No código abaixo, por exemplo, o vetor posição é criado com 5 posições:</p>
<p>int[] posicao;</p>
<p>posicao = new int[5];</p>
<p>Também é possível declarar e criar um vetor em uma mesma linha. No exemplo abaixo, é criado um vetor cor com 10 posições.</p>
<p>color[] cor = new color[10];</p>
<p>Após o processo de criação de um vetor na memória cada uma de suas posições está vazia pode ter um valor indefinido ou um valor padrão. Visualmente pode-se representar cada uma das posições como se fosse uma variável independente.</p>
<p>Por exemplo, após a execução do código a seguir, a representação na memória do computador é a de 4 variáveis independentes nomeadas: tam[0], tam[1], tam[2], tam[3]. No Processing os vetores iniciam-se na posição zero.</p>
<h2>Atribuição de valores a uma posição de um vetor</h2>
<p>Para colocar um valor dentro de uma variável de vetor, ou seja, preencher cada posição com uma atribuição pode-se utilizar o nome do vetor e a posição desejada entre colchetes (&#8221;[" e "]&#8220;) seguida pelo sinal de recebe (&#8221;=&#8221;).</p>
<p>Por exemplo:</p>
<p>int[] dado = new int[3];</p>
<p>dado[0] = 5;</p>
<p>dado[1] = 3;</p>
<p>dado[2] = 2;</p>
<p><span style="color: #ff0000;"><br />
</span></p>
<p>Outra possibilidade é substituir a criação do vetor com o operador new por uma lista separada por vírgulas e delimitada por chaves:</p>
<p>int[] dado = {3, 1, 2};</p>
<h2>Limites de um vetor</h2>
<p>Já que um vetor começa na posição zero, a tentativa de acessá-lo fora desta posição levanta um erro de execução. Este erro é bastante comum para o programador iniciante.</p>
<p>Por exemplo, a execução do código abaixo, pára o programa e exibe o erro <strong>ArrayIndexOutOfBoundsException</strong>.</p>
<p>int[] val = new int[2];</p>
<p>val[0] = 1; // Tudo ok</p>
<p>val[1] = 2; // Tudo ok</p>
<p>val[2] = 3; // ERRO!</p>
<p>Para obter o tamanho de um vetor a qualquer momento pode-se utilizar a propriedade length, acessível através do operador ponto (&#8221;.&#8221;).</p>
<p>O fragmento demonstra o uso desta propriedade:</p>
<p>int[] x = {10, 20, 30};</p>
<p>int[] y = {30, 40, 50,60};</p>
<p>int[] z = new int[5];</p>
<p>int[] w;</p>
<p>println(x.length); // Exibe 3</p>
<p>println(y.length); // Exibe 4</p>
<p>println(z.length); // Exibe 5</p>
<p>// Se a linha a seguir for descomentada, um erro é levantado</p>
<p>// println(w.length);</p>
<h2>Percorrendo vetores</h2>
<p>Geralmente a estrutura for é utilizada para percorrer vetores. A inicialização se dá com o valor zero, o limite é até o tamanho do vetor e a iteração é feita item a item.</p>
<p>Vale, portanto, o esquema:</p>
<p>for(int variavel = 0; variavel &lt; vetor.length; variavel++)</p>
<p>{</p>
<p>&#8230;vetor[variavel]&#8230;</p>
<p>}</p>
<p>Observe que o atalho &#8220;variavel++&#8221; tem o mesmo resultado que variavel=variavel+1, ou seja, a cada iteração, uma posição diferente do vetor é acessada.</p>
<p>Abaixo, uma sequencia de linhas é desenhada com o vetor estabelecendo sua posição inicial.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_linhas.png"><img class="alignnone size-full wp-image-877" title="vetores_linhas" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_linhas.png" alt="vetores_linhas" width="522" height="306" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index8.html">Executar!</a></p>
<p>No exemplo a seguir uma série de elipses são desenhadas a partir das informações do vetor.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_diametro_elipse2.png"><img class="alignnone size-full wp-image-873" title="vetores_diametro_elipse2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_diametro_elipse2.png" alt="vetores_diametro_elipse2" width="545" height="626" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index7.html">Executar!</a></p>
<p>Os dados de um vetor também podem ser alterados com a utilização da estrutura for. Esta estratégia é útil para o armazenamento do resultado da execução de cálculos.</p>
<p>No exemplo abaixo, o vetor d é calculado ao carregar o programa no método setup e é utilizado apenas no método draw.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_aleatorios.png"><img class="alignnone size-full wp-image-881" title="vetores_aleatorios" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_aleatorios.png" alt="vetores_aleatorios" width="376" height="387" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index9.html">Executar!</a></p>
<p>Vetores também podem ser úteis para armazenar valores que representam a posição de objetos. O programa seguinte demonstra os objetos tendo sua posição alterada a partir da posição do mouse.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_aleatorios2.png"><img class="alignnone size-full wp-image-885" title="vetores_aleatorios2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_aleatorios2.png" alt="vetores_aleatorios2" width="609" height="742" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index10.html">Executar!</a></p>
<p>A posição ou estado do mouse também podem ser armazenados utilizando-se vetores.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse.png"><img class="alignnone size-full wp-image-889" title="vetores_mouse" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse.png" alt="vetores_mouse" width="640" height="576" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index11.html">Executar!</a></p>
<h2>Funções para manipulação de vetores</h2>
<p>A manipulação de vetores com o objetivo de aumentar, diminuir, ordenar e apagar um vetor pode ser feita diretamente através de estruturas de repetição e atribuições. Esta abordagem, porém, é trabalhosa e propensa a erros. Sugere-se, portanto, o uso das funções de manipulação de vetores disponibilizadas pela biblioteca padrão. As funções do Processing são listadas a seguir:</p>
<ul>
<li><a href="http://www.processing.org/reference/append_.html">append</a>: Aumenta um vetor em um elemento colocando um novo elemento no fim do vetor;</li>
<li><a href="http://www.processing.org/reference/arrayCopy_.html">arrayCopy</a>: Copia um vetor ou parte deve em outro;</li>
<li><a href="http://www.processing.org/reference/concat_.html">concat</a>: Concatena (junta) dois vetores;</li>
<li><a href="http://www.processing.org/reference/expand_.html">expand</a>: Aumenta um vetor para o dobro de seu tamanho ou para um tamanho especificado;</li>
<li><a href="http://www.processing.org/reference/reverse_.html">reverse</a>: Inverte um vetor;</li>
<li><a href="http://www.processing.org/reference/shorten_.html">shorten</a>: Elimina o último elemento de um vetor;</li>
<li><a href="http://www.processing.org/reference/sort_.html">sort</a>: Ordena um vetor;</li>
<li><a href="http://www.processing.org/reference/splice_.html">splice</a>:&nbsp; Coloca um vetor ou elemento dentro de um outro;</li>
<li><a href="http://www.processing.org/reference/subset_.html">subset</a>: Retorna um vetor de elementos de dentro de um vetor já existente.</li>
</ul>
<h3>Função append: Aumentar um vetor em um elemento</h3>
<p>int[] x = { 1, 2, 3};<br />
println(x); // Exibe 1, 2, 3<br />
x = append(x, 4);<br />
println(x); // Exibe 1, 2, 3, 4</p>
<h3>Função arrayCopy: Copiar um vetor em outro</h3>
<p>int[] x = {1, 2, 0, 0, 5};<br />
int[] y = {3, 4};<br />
arrayCopy(y, 0, x, 2, 2);<br />
println(x); // Exibe 1, 2, 3, 4, 5</p>
<h3>Função concat: Concatenar vetores</h3>
<p>int[] x = {1, 2, 3};<br />
int[] y = {4, 5, 6};<br />
int[] z;<br />
z = concat(x,y);<br />
println(z);</p>
<h3>Função expand: Aumentar um vetor</h3>
<p>int[] x = {1, 2, 3};<br />
// Descomentar essa linha para exibir erro!<br />
// println(x[3]);<br />
println(x.length); // Exibe 1, 2, 3<br />
x = expand(x, 4);<br />
println(x[3]);</p>
<h3>Função reverse: Inverter um vetor</h3>
<p>int[] x = {1, 2, 3, 4, 5, 6};<br />
println(x); // Exibe 1, 2, 3, 4, 5, 6<br />
x = reverse(x);<br />
println(x); // Exibe 6, 5, 4, 3, 2, 1</p>
<h3>Função shorten: Eliminar o último elemento</h3>
<p>int[] x = {1, 2, 3, 4, 5};<br />
println(x); // Exibe 1, 2, 3, 4, 5<br />
x = shorten(x);<br />
println(x); // Exibe 1, 2, 3, 4</p>
<h3>Função sort: Ordenar um vetor</h3>
<p>int[] x = {5, 4, 1, 3, 2};<br />
println(x); // Exibe 5, 4, 1, 3, 2<br />
x = sort(x);<br />
println(x); // Exibe 1, 2, 3, 4, 5</p>
<h3>Função splice: Colocar vetor dentro de outro</h3>
<p>int[] x = {1, 2, 5};<br />
int[] y = {3, 4};<br />
int[] z;<br />
z = splice(x, y, 2);<br />
println(z); // Exibe 1, 2, 3, 4, 5</p>
<h3>Função subset: Retorna um vetor de elementos de dentro de um vetor já existente</h3>
<p>int[] x = {1, 2, 3, 4, 5, 6};<br />
int[] y = subset(x, 2, 3);<br />
println(y); // Exibe 3, 4, 5</p>
<h3>Exemplos de uso das funções de manipulação de vetores</h3>
<p>A função append pode ser usada para armazenar a posição do mouse. No programa abaixo, o fragmento <strong>x = append(x, mouseX) </strong>vai armazenando no fim do vetor a posição em x do mouse.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse2.png"><img class="alignnone size-full wp-image-894" title="vetores_mouse2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse2.png" alt="vetores_mouse2" width="629" height="706" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index12.html">Executar!</a></p>
<p>Em mais um exemplo, o vetor armazena as posições do mouse e, a cada iteração a instrução x = subset(x, 1);&nbsp; elimina o primeiro elemento do vetor. Desta forma, o elemento que na iteração anterior estava na posição 2, na seguinte vai para a 1 e assim sucessivamente.</p>
<p>Esta estratégia implementa uma trilha atrás do cursor.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse3.png"><img class="alignnone size-full wp-image-899" title="vetores_mouse3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/vetores_mouse3.png" alt="vetores_mouse3" width="578" height="597" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index13.html">Executar!</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/06/16/aula-12-vetores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aula 10 &#8211; Cores</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/06/02/aula-10-cores/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/06/02/aula-10-cores/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 18:30:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[aula10]]></category>
		<category><![CDATA[cores]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=812</guid>
		<description><![CDATA[Objetivo
Nas últimas semanas, trabalhamos com a estrutura de repetição. Tal estrutura, permite a execução de diversas linhas de código mais de uma vez. O capítulo atual retorna o trabalho com as estruturas da programação gráfica.
Agora, vamos aplicar a estrutura de repetição com diversas funções da programação gráfica. Desta forma, a maior parte dos exemplos dos [...]]]></description>
			<content:encoded><![CDATA[<h1>Objetivo</h1>
<p>Nas últimas semanas, trabalhamos com a estrutura de repetição. Tal estrutura, permite a execução de diversas linhas de código mais de uma vez. O capítulo atual retorna o trabalho com as estruturas da programação gráfica.</p>
<p>Agora, vamos aplicar a estrutura de repetição com diversas funções da programação gráfica. Desta forma, a maior parte dos exemplos dos próximos capítulos utiliza a estrutura de repetição misturada com diversos conceitos da programação gráfica. Iniciaremos hoje com a representação de cores para o Processing.</p>
<h1>Sintaxe</h1>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. Pule este tópico se for sua primeira leitura.</p>
<ul>
<li>background (<a href="http://processing.org/reference/background_.html">en</a>/<a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/background_.html">pt</a>): define a cor de fundo da tela;</li>
<li>fill (<a href="http://processing.org/reference/fill_.html">en</a>/<a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/fill_.html">pt</a>): define a cor de preenchimento das formas geométricas;</li>
<li>stroke (<a href="http://processing.org/reference/stroke_.html">en </a>/ <a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/stroke_.html">pt</a>): define a cor de desenho de linhas e bordas;</li>
<li>color (<a href="http://processing.org/reference/color_datatype.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/color.html">pt</a>): tipo de dado usado para armazenar cores;</li>
<li>colorMode (<a href="http://processing.org/reference/colorMode_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/colorMode_.html">pt</a>): altera a maneira que o Processing interpreta as cores: RGB ou HSB;</li>
<li>get (<a href="http://processing.org/reference/get_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/get_.html">pt</a>): retorna a cor de um pixel, ou retorna um pedaço de uma imagem;</li>
<li>set (<a href="http://processing.org/reference/set_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/set_.html">pt</a>): altera a cor de um pixel, ou escreve uma imagem diretamente na tela;</li>
<li> save (<a href="http://processing.org/reference/save_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/save_.html">pt</a>): salva em disco o que está sendo mostrado na tela;</li>
<li>saveFrame (<a href="http://processing.org/reference/saveFrame_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/saveFrame_.html">pt</a>): salva em disco uma seqüencia de imagens.</li>
</ul>
<h1>Cores</h1>
<p>No Processing as cores são definidas através de parâmetros das funções background, fill e stroke:</p>
<ul>
<li>background (<a href="http://processing.org/reference/background_.html">en</a>/<a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/background_.html">pt</a>): define a cor de fundo da tela;</li>
<li>fill (<a href="http://processing.org/reference/fill_.html">en</a>/<a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/fill_.html">pt</a>): define a cor de preenchimento das formas geométricas;</li>
<li>stroke (<a href="http://processing.org/reference/stroke_.html">en </a>/ <a href="http://www.dainf.ct.utfpr.edu.br/~merkle/processing/reference/ptBR/stroke_.html">pt</a>): define a cor de desenho de linhas e bordas;</li>
</ul>
<p>Quando as funções acima são chamadas com apenas um parâmetro, a cor escolhida é uma tonalidade de cinza, sendo o valor zero igual ao preto e o branco correspondente ao valor 255.</p>
<p>No exemplo abaixo, a cor do desenho da linha é variado de 0 até 255. Desta forma, é desenhada uma linha a cada iteração e a alteração da cor da linha cria um efeito de degradê.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor01.jpg"><img class="alignnone size-full wp-image-817" title="cor01" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor01.jpg" alt="cor01" width="326" height="402" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index.html">Executar!</a></p>
<p>O valor da cor, porém, também pode ser representado por três parâmetros. Neste caso, por padrão o Processing utiliza a especificação de cores RGB. Nesta especificação, uma cor é representada pela mistura aditiva das cores vermelho (<span style="color: #ff0000;">R</span>ED), verde (<span style="color: #008000;">G</span>REEN) e azul (<span style="color: #0000ff;">B</span>LUE).</p>
<p>A seguir, três círculos são desenhados um ao lado do outro com as cores vermelho, verde e azul como preenchimentos respectivos.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor02.png"><img class="alignnone size-full wp-image-822" title="cor02" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor02.png" alt="cor02" width="456" height="395" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index1.html">Executar!</a></p>
<h2>Transparência</h2>
<p>Observa-se que as cores especificadas são opacas. Com o uso de dois ou quatro parâmetros é possível definir a transparência de uma cor. O valor zero indica que a cor é completamente transparente e o valor 255 é o padrão que indica a completa opacidade.</p>
<p>No exemplo abaixo, o parâmetro de transparência permite que se crie novas cores dependendo da combinação entre formas com transparência.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor03.png"><img class="alignnone size-full wp-image-823" title="cor03" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor03.png" alt="cor03" width="461" height="454" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index2.html">Executar!</a></p>
<p>As informações sobre uma cor podem ser armazenadas em variáveis através do tipo de dado color.</p>
<p>Por exemplo, a linha color amarelo = color(230, 237, 30), cria uma variável chamada amarelo que representa esta cor.</p>
<p>&nbsp;</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor04.png"><img class="alignnone size-full wp-image-827" title="cor04" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor04.png" alt="cor04" width="394" height="290" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index3.html">Executar!</a></p>
<h2>Notação HSB</h2>
<p>Embora o padrão de cores no Processing seja o RGB também é possível trabalhar com cores nas notações hexadecimal e HSB. A primeira, popular entre os desenvolvedores web codifica os números entre zero e 255 como dois dígitos de zero a FF. Nesta base, os números de zero até quinze são representados de zero a nove e de A até F.</p>
<p>Por exemplo, a cor RGB com vermelho igual a 255, verde igual a 255 e azul igual a 255 é representada em hexadecimal por #FFFFFF.</p>
<p>A notação HSB (Hue, Saturation, Brightness) define as cores em termos de tonalidade, saturação e brilho. O valor de tonalidade (hue) vai de zero até 360 abrangendo todas as cores do espectro. A saturação vai de zero até 100% e indica a pureza de uma cor. Quanto menor a pureza, mais com tons de cinza a cor aparecerá. O brilho indica a relação entre o claro e o escuro e vai de zero a 100%, sendo o 100% representando o maior brilho.</p>
<p>Para selecionar o uso da notação HSB é necessária a chamada à função colorMode (<a href="http://processing.org/reference/colorMode_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/colorMode_.html">pt</a>). Tal função pode aceitar como parâmetros: o tipo de modelo de cor, a escala utilizada para a tonalidade, a escala usada para a saturação e a escala do brilho.</p>
<p>No exemplo abaixo, a saturação e o brilho são constantes mas a tonalidade varia.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor05.png"><img class="alignnone size-full wp-image-831" title="cor05" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor05.png" alt="cor05" width="435" height="528" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index4.html">Executar!</a></p>
<p>A escolha de uma cor pode ser facilitada através do uso da ferramenta seletor de cor, acessível pelo menu Tools &gt; Color Selector.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/colorselector.png"><img class="alignnone size-full wp-image-836" title="colorselector" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/colorselector.png" alt="colorselector" width="433" height="330" /></a></p>
<h2>Cor de um pixel</h2>
<p>Também é possível obter a cor de um pixel contido em uma posição específica da tela, ou trocar esta cor. Para obter a cor de um pixel através da sua posição em x e y, pode-se utilizar a função get (<a href="http://processing.org/reference/get_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/get_.html">pt</a>) .</p>
<p>O caminho contrário, ou seja, a alteração de um pixel em um local específico da tela pode ser feito através da função set  (<a href="http://processing.org/reference/set_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/set_.html">pt</a>).</p>
<p>Abaixo, um exemplo de uso da função set para geração de uma textura procedural.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor06.png"><img class="alignnone size-full wp-image-837" title="cor06" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor06.png" alt="cor06" width="589" height="510" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index5.html">Executar!</a></p>
<p>No fragmento a seguir, a cor de um retângulo é escolhida a partir do seletor também de maneira procedural.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor07.png"><img class="alignnone size-full wp-image-841" title="cor07" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor07.png" alt="cor07" width="589" height="551" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/index6.html">Executar!</a></p>
<h2>Salvando o resultado</h2>
<p>O resultado de nossos programas fica cada vez mais interessante. É possível salvar este resultado em um arquivo diretamente no Processing. Para salvar a imagem sendo exibida na janela de visualização em um momento exato pode-se utilizar a função save (<a href="http://processing.org/reference/save_.html">en </a>/ <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/save_.html">pt</a>).</p>
<p>A imagem será armazenada na pasta do projeto, acessível através do menu Sketch &gt; Show Sketch Folder (CTRL + K). Os formatos possíveis são: TIF, TARGA, JPEG, PNG, dependendo da extensão escolhida. Por questões de segurança esta função não pode ser usada em ambiente Web.</p>
<p>No exemplo abaixo, a imagem &#8220;imagem.png&#8221; é criado quando o usuário clica com o botão do mouse.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor08.png"><img class="alignnone size-full wp-image-845" title="cor08" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/06/cor08.png" alt="cor08" width="523" height="631" /></a></p>
<p>Deve-se ter cuidado na chamada da função save dentro da função draw.&nbsp; Neste caso, o arquivo é constantemente atualizado e sobrescrito a cada frame.</p>
<p>Outra função que pode ser usada para salvar imagens de um programa é a saveFrame (<a href="http://processing.org/reference/saveFrame_.html">en</a> / <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/saveFrame_.html">pt</a>). A cada chamada a esta função, uma sequência numerada de imagens é salva na pasta do projeto. Se a função for chamada sem parâmetro, o nome dos arquivos vai de screen-0000.tif até screen-9999.tif, sendo numerado a partir da variável frameCount.</p>
<p>No caso da parametrização, por exemplo: saveFrame(&#8221;teste###.tif&#8221;), o número de # indica o número de dígitos utilizados para armazenar a sequencia.</p>
<h2>Para Saber Mais</h2>
<p><span style="color: #000000;">Reas, Casey. Fry, Ben. Processing: A Programming Handbook for Visual Designers and Artists. p. 85-93.<br />
</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/06/02/aula-10-cores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aula 08 &#8211; Estrutura de repetição</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/05/19/aula-08-estrutura-de-repeticao/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/05/19/aula-08-estrutura-de-repeticao/#comments</comments>
		<pubDate>Tue, 19 May 2009 19:36:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[do while]]></category>
		<category><![CDATA[estrutura de repetição]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[repetição]]></category>
		<category><![CDATA[while]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=765</guid>
		<description><![CDATA[Objetivo
Trabalhamos até agora com estruturas que permitiram a execução de nossos códigos linha a linha e apenas uma vez. A execução de um conjunto de linhas poderia ser controlada única e exclusivamente através da estrutura condicional (if). Para que se executasse um conjunto de linhas diversas vezes, a cada frame, utilizamos o bloco draw.
Entretanto, muitas [...]]]></description>
			<content:encoded><![CDATA[<h2>Objetivo</h2>
<p>Trabalhamos até agora com estruturas que permitiram a execução de nossos códigos linha a linha e apenas uma vez. A execução de um conjunto de linhas poderia ser controlada única e exclusivamente através da estrutura condicional (if). Para que se executasse um conjunto de linhas diversas vezes, a cada frame, utilizamos o bloco draw.</p>
<p>Entretanto, muitas vezes será necessário executar um conjunto de linhas dentro de um mesmo frame. Para isto, podemos utilizar a estrutura de repetição.</p>
<h3>Estrutura de Repetição</h3>
<p>É a estrutura de controle do fluxo lógico que permite executar diversas vezes um mesmo trecho do algoritmo até que uma certa condição seja satisfeita. Existem diversos tipos de estruturas de repetição, o que as diferencia é o local no qual a condição é tratada. Assim, existem os tipos de estrutura de repetição:</p>
<ul>
<li>Estrutura de Repetição com teste no início;</li>
<li>Estrutura de Repetição com teste no final;</li>
<li>Estrutura de Repetição com variável de controle;</li>
<li>Estrutura de Repetição com teste no meio.</li>
</ul>
<h3>Estrutura de Repetição com teste no início</h3>
<p>Nessa estrutura, um fluxo de execução será repetido <strong>enquanto uma certa condição e</strong>steja sendo satisfeita.</p>
<pre style="padding-left: 30px;">while (condição)</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; comando a ser executado</pre>
<p>Caso haja mais de um comando a ser executado, eles devem ser separados linha a linha ou por ponto e vírgulas. Para delimitar o bloco, todos os comandos a serem executados devem estar entre colchetes ({}).</p>
<pre style="padding-left: 30px;">while (condição)</pre>
<pre style="padding-left: 30px;">{</pre>
<pre style="padding-left: 30px;">    primeiro comando a ser executado</pre>
<pre style="padding-left: 30px;">    segundo comando a ser executado</pre>
<pre style="padding-left: 30px;">    ...</pre>
<pre style="padding-left: 30px;">    comando n a ser executado</pre>
<pre style="padding-left: 30px;">}</pre>
<p>Dessa forma, a condição é testada antes de executar o trecho de código. Ou seja, se, da primeira vez o resultado for falso, os comandos não são executados nenhuma vez.</p>
<p>Observe que se a condição for sempre verdadeira, a estrutura de repetição se repete indefinidamente e o programa fica travado em um loop infinito. Neste caso, o processamento fica travado nesta linha.</p>
<h3>Estrutura de repetição com teste no final</h3>
<p>Nessa estrutura, um fluxo de execução será repetido pelo menos uma vez. Cada vez que terminar a execução de um dos fluxos, o teste condicional é feito para verificar se o fluxo é executado novamente.</p>
<pre style="padding-left: 30px;">do
&nbsp;&nbsp;&nbsp; comando a ser executado</pre>
<pre style="padding-left: 30px;">while (condição)</pre>
<p>Caso haja mais de um comando a ser executado, eles devem ser separados linha a linha ou por ponto e vírgulas. Para delimitar o bloco, todos os comandos a serem executados devem estar entre chaves ({}).</p>
<pre style="padding-left: 30px;">do</pre>
<pre style="padding-left: 30px;">{
&nbsp;&nbsp;&nbsp; primeiro comando a ser executado</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; segundo comando a ser executado
&nbsp;&nbsp;&nbsp; ...</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; comando n a ser executado
} while (condição)</pre>
<p>Dessa forma, a condição é testada depois de executar o trecho de código. Ou seja, se, da primeira vez o resultado da condição for falso, mesmo assim os comandos são executados<strong> pelo menos uma vez.</strong></p>
<h3>Estrutura de Repetição com variável de controle</h3>
<p>Ocorrem casos que é difícil determinar quantas vezes um bloco será executado. Sabe-se que ele será executado quando uma certa condição for satisfeita. Às vezes, não é intuitivo determinar quantas vezes um bloco vai ser executado. Nestas vezes, os comandos while e do while são recomendados.<br />
No caso de se saber quantas vezes um bloco deve ser executado, o comando for permite a execução de um bloco um número determinado de vezes.</p>
<pre style="padding-left: 30px;">for (inicialização;condição;incremento)
&nbsp;&nbsp;&nbsp; comando</pre>
<p>Caso haja mais de um comando a ser executado, eles devem ser separados linha a linha ou por ponto e vírgulas. Para delimitar o bloco, todos os comandos a serem executados devem estar entre chaves ({}).</p>
<pre style="padding-left: 30px;">for (inicialização;condição;incremento)</pre>
<pre style="padding-left: 30px;">{</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; comando 1</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; ...</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; comando n
}</pre>
<p>O comando for é equivalente a:</p>
<pre style="padding-left: 30px;">inicialização</pre>
<pre style="padding-left: 30px;">while (condição)</pre>
<pre style="padding-left: 30px;">{</pre>
<pre style="padding-left: 60px;">comando 1</pre>
<pre style="padding-left: 60px;">...</pre>
<pre style="padding-left: 60px;">comando n</pre>
<pre style="padding-left: 30px;">    incremento
}</pre>
<p>&nbsp;</p>
<p>Por exemplo:</p>
<pre style="padding-left: 30px;">for (num=1;num&lt;=10;num=num+1)
&nbsp;&nbsp;&nbsp; comando</pre>
<p>É equivalente a:</p>
<pre style="padding-left: 30px;"><em>num=1 </em></pre>
<pre style="padding-left: 30px;"><em>while (num&lt;=10) </em><em>{ </em><em>&nbsp;&nbsp;&nbsp;
    comando</em><em>
&nbsp;&nbsp;&nbsp; num = num + 1
} </em></pre>
<h3>Estrutura de repetição com teste no meio</h3>
<p>Às vezes, trabalha-se com condições complexas que são difíceis de serem representadas no início ou no final de um bloco. Dessa forma, a estrutura de repetição com teste no meio utiliza-se do comando break que é útil para interromper a repetição a qualquer momento da execução. Quando o fluxo é interrompido, passa-se, diretamente, para o fluxo imediatamente superior.</p>
<pre style="padding-left: 30px;">while (true) //Ou outra condição</pre>
<pre style="padding-left: 30px;">{
&nbsp;&nbsp;&nbsp; primeiro comando a ser executado</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; segundo comando a ser executado
&nbsp;&nbsp;&nbsp; if (condição)</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break
&nbsp;&nbsp;&nbsp; terceiro comando a ser executado</pre>
<pre style="padding-left: 30px;">&nbsp;&nbsp;&nbsp; n comando a ser executado
}</pre>
<h3>O comando continue</h3>
<p>O comando continue interrompe a execução de uma iteração do laço e passa para a próxima. Quando o comando continue é chamado dentro de um &#8220;for&#8221; o controle passa para o comando de incremento.</p>
<h3>Comparação entre as estruturas de repetição</h3>
<table border="1">
<tbody>
<tr>
<th>Estrutura</th>
<th>Quando é testada a condição</th>
<th>Quantidade de<br />
execuções</th>
<th>Efeito do comando continue</th>
</tr>
<tr>
<td>while</td>
<td>início</td>
<td>0 ou mais</td>
<td>Passa para a próxima<br />
iteração, ou seja, testa a condição</td>
</tr>
<tr>
<td>do while</td>
<td>fim</td>
<td>1 ou mais</td>
<td>Passa para a próxima<br />
iteração, ou seja, testa a condição</td>
</tr>
<tr>
<td>for</td>
<td>início</td>
<td>0 ou mais</td>
<td>Faz o incremento e depois testa<br />
a condição</td>
</tr>
<tr>
<td>Teste no meio</td>
<td>Qualquer lugar</td>
<td>Depende se utiliza while, do<br />
while ou for</td>
<td>Depende se utiliza while, do while ou for.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Exemplos em Processing</h2>
<p>No exemplo abaixo, um conjunto de linhas é desenhado através da estrutura de repetição for.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex01forlinhas.png"><img class="alignnone size-full wp-image-776" title="aula08ex01forlinhas" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex01forlinhas.png" alt="aula08ex01forlinhas" width="284" height="420" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/index.html">Executar!</a></p>
<p>&nbsp;</p>
<p>Neste exemplo, uma elipse tem seu tamanho alterado a partir de uma variável i.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex02forellipse.png"><img class="alignnone size-full wp-image-777" title="aula08ex02forellipse" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex02forellipse.png" alt="aula08ex02forellipse" width="358" height="471" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/index1.html">Executar!</a></p>
<p>É possível misturar a estrutura de repetição com a estrutura condicional.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex03foreif.png"><img class="alignnone size-full wp-image-784" title="aula08ex03foreif" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex03foreif.png" alt="aula08ex03foreif" width="366" height="528" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/index2.html">Executar!</a></p>
<p>Em mais um exemplo, o degradê é obtido através do desenho de uma linha e alteração de cor ao mesmo tempo.</p>
<p>Observe que este exemplo já foi <a href="http://www.brunocampagnolo.com/2009ip/2009/03/12/exercicio-p02-variaveis-do-processing-e-o-modo-continuo/">tratado anteriormente</a>.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex04forelinhas2.png"><img class="alignnone size-full wp-image-785" title="aula08ex04forelinhas2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex04forelinhas2.png" alt="aula08ex04forelinhas2" width="325" height="433" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/index3.html">Executar!</a></p>
<p>Por padrão, a estrutura for produz repetições em uma dimensão. Colocando uma estrutura for dentro da outra, pode-se iterar por duas dimensões. No exemplo a seguir, o ponto percorre as linhas e colunas durante a execução.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex05forepontos.png"><img class="alignnone size-full wp-image-792" title="aula08ex05forepontos" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/aula08ex05forepontos.png" alt="aula08ex05forepontos" width="325" height="443" /></a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/index4.html">Executar!</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/05/19/aula-08-estrutura-de-repeticao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 05  &#8211; Funções Matemáticas &#8211; Parte 1 &#8211; Restrições e Números Aleatórios</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/05/05/aula-05-funcoes-matematicas-parte-1-restricoes-e-numeros-aleatorios/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/05/05/aula-05-funcoes-matematicas-parte-1-restricoes-e-numeros-aleatorios/#comments</comments>
		<pubDate>Tue, 05 May 2009 19:08:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[aula05]]></category>
		<category><![CDATA[funções]]></category>
		<category><![CDATA[matemática]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=740</guid>
		<description><![CDATA[Nosso principal objetivo hoje será a vista de notas e provas.
Além disso, começaremos o tópico relacionado à funções matemáticas e sua aplicação na programação gráfica.
Material da aula em anexo.


Discover Simple, Private Sharing at Drop.io


  var scribd_doc = scribd.Document.getDoc(14989593, 'key-2cky0vsvrlbafbko0jc6');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  
]]></description>
			<content:encoded><![CDATA[<p>Nosso principal objetivo hoje será a vista de notas e provas.<br />
Além disso, começaremos o tópico relacionado à funções matemáticas e sua aplicação na programação gráfica.</p>
<p>Material da aula <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/05/05-funcoes_matematicas_final.ppt">em anexo</a>.</p>
<p><span id="more-740"></span></p>
<div>
<div style="text-align: left; color: #595653; font-size: 11px; font-family: Verdana, sans-serif; padding-top: 10px; padding-right: 5px;">Discover Simple, Private Sharing at <a href="http://drop.io">Drop.io</a></div>
<p><script type="text/javascript" src='http://www.scribd.com/javascripts/view.js'></script>
<div id="mediaPlayer"></div>
<p><script type="text/javascript">  var scribd_doc = scribd.Document.getDoc(14989593, 'key-2cky0vsvrlbafbko0jc6');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  </script></div>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/05/05/aula-05-funcoes-matematicas-parte-1-restricoes-e-numeros-aleatorios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aula 04 &#8211; Estrutura condicional e criação de variáveis</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/24/aula-04-estrutura-condicional-e-criacao-de-variaveis/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/24/aula-04-estrutura-condicional-e-criacao-de-variaveis/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 18:23:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[aula04]]></category>
		<category><![CDATA[conversões]]></category>
		<category><![CDATA[estrutura condicional]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[imagens]]></category>
		<category><![CDATA[teclado]]></category>
		<category><![CDATA[variáveis]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=155</guid>
		<description><![CDATA[Objetivo
Até agora o código que escrevemos caracterizou-se por ser executado linha a linha e do início ao fim do programa. A única alteração de fluxo trabalhada foi implementada através do bloco draw, que permite que seja feita a repetição de parte do código indefinidamente. Entretanto, em um programa de computador muitas vezes torna-se necessário um [...]]]></description>
			<content:encoded><![CDATA[<h2>Objetivo</h2>
<p style="text-align: justify;">Até agora o código que escrevemos caracterizou-se por ser executado linha a linha e do início ao fim do programa. A única alteração de fluxo trabalhada foi implementada através do bloco draw, que permite que seja feita a repetição de parte do código indefinidamente. Entretanto, em um programa de computador muitas vezes torna-se necessário um controle mais fino do fluxo de execução. Por exemplo, realizar um desenho apenas quando uma certa condição esteja satisfeita. Para este controle será necessária a definição da estrutura condicional, representada pela palavra chave if.</p>
<p style="text-align: justify;">Este capítulo trata desta estrutura, mas também se preocupa em aumentar o poder de uso das variáveis. Até agora, apenas as variáveis do Processing foram utilizadas. Como próximo passo, será mostrada a possibilidade do programador em definir e usar suas próprias variáveis.</p>
<p style="text-align: justify;"><span id="more-155"></span></p>
<h2>Estrutura Condicional</h2>
<p>No capítulo anterior, conhecemos os operadores relacionais e os operadores lógicos. Tais operadores permitem que um programa tome decisões sobre quais linhas de código podem ser executadas e quais linhas de código não podem ser executadas.</p>
<p>Em resumo, expressões relacionais são expressões que realizam operações de comparação entre dois valores de um mesmo tipo primitivo usando os operadores relacionais (==, &gt;=, !=, &lt;=, etc). Os operandos são variáveis, constantes ou expressões de qualquer tipo e o resultado da expressão é um valor lógico.</p>
<p>Os operadores relacionais são:</p>
<ul>
<li>&lt;: Menor;</li>
<li>&gt;: Maior;</li>
<li>&lt;=: Menor ou igual;</li>
<li>&gt;=: Maior ou igual;</li>
<li>==: Igual;</li>
<li>!=: Diferente.</li>
</ul>
<p>As já citadas expressões lógicas, por sua vez, envolvem os operadores lógicos (||, &amp;&amp;, !). Os operandos são valores lógicos e o resultado da expressão é um valor lógico. A tabela verdade (combinação entre os operadores) é:</p>
<ul>
<li>true &amp;&amp; true é igual a true;</li>
<li>true &amp;&amp; false é igual a false;</li>
<li>false &amp;&amp; true é igual a false;</li>
<li>false &amp;&amp; false é igual a false;</li>
<li>true || true é igual a true;</li>
<li>true || false é igual a true;</li>
<li>false || true é igual a true;</li>
<li>false || false é igual a false;</li>
<li>!true é igual a false;</li>
<li>!false é igual a true.</li>
</ul>
<p style="text-align: justify;">Estes resultados lógicos podem ser utilizados para executar ações apenas quando uma certa condição for satisfeita. Por exemplo, um programa pode desenhar ou não um objeto se o mouse for pressionado. O primeiro tipo de estrutura condicional é a seleção simples. Nesta estrutura, construída através da<a href="http://www.processing.org/reference/if.html"> instrução if</a>, se uma certa condição for verdadeira, a primeira instrução imediatamente abaixo da condição é executada. Caso a condição seja false, o comando é ignorado. Em inglês, &#8220;if&#8221; significa &#8220;se&#8221;.</p>
<blockquote>
<p style="text-align: justify;">if(condição)</p>
<p style="text-align: justify;">comando a ser executado</p>
</blockquote>
<p style="text-align: justify;">No exemplo abaixo, a variável lógica mousePressed é usada como condição. Desta forma, o comando <strong>rect(width/3, height/3, width/3, height/3);</strong> só é executado caso mousePressed esteja com valor verdadeiro, ou seja, se o mouse for pressionado. Observe que o comando <strong>ellipse(width/3, height/3, width/3, height/3);</strong> sempre é executado e não é influenciado pelo if. Uma boa prática para dar a idéia que há uma relação entre o comando if e a linha posterior é fazer um pequeno deslocamento após o início da linha. Este deslocamento se chama indentação. Esta prática, no Processing, é apenas uma convenção estética. Em outras linguagens como Python, por exemplo, esta prática é obrigatória.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional.png"><img class="alignnone size-full wp-image-519" title="condicional" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional.png" alt="condicional" width="351" height="301" /></a><br />
void draw()<br />
{<br />
background(255);<br />
if(mousePressed)<br />
rect(width/3, height/3, width/3, height/3);<br />
ellipse(width/3, height/3, width/3, height/3);<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index66.html">Executar!</a></p>
<p style="text-align: justify;">Caso haja mais de um comando a ser executado estes comandos devem ser agrupados entre colchetes. Este agrupamento é chamado de <strong>bloco de instruções</strong>. Novamente, a indentação é relevante para facilitar a leitura. Abaixo, apenas enquanto qualquer tecla estiver pressionada, o fundo é mudado para a cor branca e o retângulo é desenhado.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional2.png"><img class="alignnone size-full wp-image-524" title="condicional2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional2.png" alt="condicional2" width="354" height="345" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
background(0);<br />
if(keyPressed)<br />
{<br />
background(255);<br />
rect(width/3, height/3, width/3, height/3);<br />
}<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index67.html">Executar!</a></p>
<p style="text-align: justify;">A condição em uma seleção simples pode ser formada por uma expressão relacional. A seguir, apenas quando a posição em x do mouse for maior que a metade da tela, a linha é desenhada. O exemplo também demonstra outro estilo de indentação na qual a abertura da chaves é colocada logo após a definição da condição sem a quebra de linha.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional3.png"><img class="alignnone size-full wp-image-529" title="condicional3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional3.png" alt="condicional3" width="294" height="296" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
background(255);<br />
if(mouseX&gt;width/2) {<br />
line(width/2, 0, width/2, height);<br />
}<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index68.html">Executar!</a></p>
<p style="text-align: justify;">Para executar um fluxo alternativo de código apenas no caso da condição ser falsa, utiliza-se a estrutura de seleção composta. Neste caso, a palavra else é colocada logo após o fim do bloco de código definido pelo comando if. O bloco de instruções após o else só é executado quando a condição for falsa. É importante destacar que o fluxo principal e o fluxo alternativo tem execuções excludentes, ou seja, <strong>o fluxo alternativo nunca é executado após o fluxo principal</strong>.</p>
<p style="text-align: justify;">O código abaixo ilustra o uso do else. O bloco do if só é executando quando o último botão do mouse pressionado pelo usuário for o botão esquerdo. A linha, então, é desenhada de cima para baixo e em um fundo branco. Caso contrário, ou seja, se não for o botão esquerdo, a linha desenhada é de baixo para cima em um fundo cinza.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional4.png"><img class="alignnone size-full wp-image-535" title="condicional4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional4.png" alt="condicional4" width="247" height="373" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
if(mouseButton==LEFT) {<br />
background(255);<br />
line(0, 0, width, height);<br />
}<br />
else  {<br />
background(128);<br />
line(width, 0, 0, height);<br />
}<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index69.html">Executar!</a></p>
<p style="text-align: justify;">Condições podem ser encadeadas. Neste caso, uma estrutura de seleção pode ser colocada dentro da outra. No exemplo abaixo, quando a primeira condição é falsa (mouseX&lt;width/3) o segundo teste  (mouseX&lt;2*width/3) é feito. Caso este segundo teste também seja falso, daí sim a instrução background(255) é habilidada. Há, portanto, três fluxos no programa a seguir e os três fluxos são executados conforme o intervalo determinado pela variável mouseX.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional5.png"><img class="alignnone size-full wp-image-540" title="condicional5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional5.png" alt="condicional5" width="312" height="372" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
if(mouseX&lt;width/3) {<br />
background(0);<br />
} else if(mouseX&lt;2*width/3) {<br />
background(128);<br />
} else {<br />
background(255);<br />
}<br />
line(width/3, 0, width/3, height);<br />
line(2*width/3, 0, 2*width/3, height);<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index70.html">Executar!</a></p>
<p style="text-align: justify;">
<blockquote>
<p style="text-align: justify;"><strong><em>Exercício de Fixação 01 &#8211; Teste de mesa</em></strong></p>
<p><strong><em>Imagine a existência das variáveis a e b que podem assumir ou o valor zero ou o valor um. Complete a tabela abaixo, a partir de possíveis valores para a e b, segundo o    código abaixo:</em></strong></p>
<table id="AutoNumber1" style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="33%" bordercolor="#111111">
<tbody>
<tr>
<td width="8%"><strong><em>a</em></strong></td>
<td width="6%"><strong><em>b</em></strong></td>
<td width="86%"><strong><em>Comando Executado</em></strong></td>
</tr>
<tr>
<td width="8%"><strong><em>0</em></strong></td>
<td width="6%"><strong><em>0</em></strong></td>
<td width="86%"><strong><em> println(&#8221;Z&#8221;);</em></strong></td>
</tr>
<tr>
<td width="8%"><strong><em>0</em></strong></td>
<td width="6%"><strong><em>1</em></strong></td>
<td width="86%"><strong><em> </em></strong></td>
</tr>
<tr>
<td width="8%"><strong><em>1</em></strong></td>
<td width="6%"><strong><em>0</em></strong></td>
<td width="86%"><strong><em> </em></strong></td>
</tr>
<tr>
<td width="8%"><strong><em>1</em></strong></td>
<td width="6%"><strong><em>1</em></strong></td>
<td width="86%"><strong><em> </em></strong></td>
</tr>
</tbody>
</table>
<p><strong><em> </em></strong></p>
<p style="text-align: justify;"><strong><em><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exfixa1.png"><img class="alignnone size-full wp-image-621" title="exfixa1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exfixa1.png" alt="exfixa1" width="158" height="187" /></a></em></strong></p>
</blockquote>
<p style="text-align: justify;"><span style="color: #000000;"><br />
</span></p>
<p style="text-align: justify;">Operadores lógicos também podem ser utilizados com as estruturas condicionais. Abaixo, um botão é criado conforme na área entre os pontos (30, 20) e (40, 35). Quando o usuário passa com o mouse sobre a região, sua cor de preenchimento é colocada com o valor branco (255). Caso contrário, o preenchimento é colocado com a cor preta (zero).</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional6.png"></a><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional6_1.png"><img class="alignnone size-full wp-image-552" title="condicional6_1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional6_1.png" alt="condicional6_1" width="476" height="386" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
// Cria um botão. Quando o mouse estiver dentro do intervalo,<br />
// pinta o botão de branco<br />
if(mouseX&gt;=30 &amp;&amp; mouseX&lt;=40 &amp;&amp; mouseY&gt;=20 &amp;&amp; mouseY&lt;=35) {<br />
fill(255);<br />
}<br />
else {<br />
fill(0);<br />
}<br />
rect(30, 20, 10, 15);</p>
<p>}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index71.html">Executar!</a></p>
<p style="text-align: justify;">Uma estrutura de seleção encadeada pode ser usada para representar os possíveis estados de um botão.Abaixo, as ações executadas quando o botão é clicado estão dentro do bloco posterior ao if(mousePressed).</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional7.png"><img class="alignnone size-full wp-image-553" title="condicional7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional7.png" alt="condicional7" width="455" height="501" /></a></p>
<p style="text-align: justify;">void setup()<br />
{<br />
textFont(createFont(&#8221;Arial&#8221;, 10));<br />
textAlign(CENTER);<br />
}</p>
<p>void draw()<br />
{<br />
background(255);<br />
// Cria um botão. Quando o mouse estiver dentro do intervalo,<br />
// pinta o botão de branco</p>
<p>if(mouseX&gt;=width/3 &amp;&amp;<br />
mouseX&lt;=2*width/3 &amp;&amp;<br />
mouseY&gt;=height/3 &amp;&amp;<br />
mouseY&lt;=2*height/3) {<br />
if(mousePressed) {<br />
fill(128);<br />
text(&#8221;Ok!&#8221;, 10, 10);<br />
}<br />
else<br />
fill(255);<br />
}<br />
else {<br />
fill(0);<br />
}<br />
rect(width/3, height/3, width/3, height/3);<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index72.html">Executar!</a></p>
<p style="text-align: justify;">Em mais um exemplo de estrutura condicional encadeada, desta vez as variáveis de teclado são utilizadas:</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional8.png"><img class="alignnone size-full wp-image-558" title="condicional8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional8.png" alt="condicional8" width="218" height="374" /></a></p>
<p style="text-align: justify;">void draw()<br />
{<br />
background(0);<br />
if(keyPressed)<br />
{<br />
if(key==&#8217;r&#8217; || key==&#8217;R')<br />
{<br />
background(255,0,0);<br />
}<br />
}<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index73.html">Executar!</a></p>
<p style="text-align: justify;">No seguinte, as teclas codificadas são consideradas. Neste caso, a instrução <strong>if(key==CODED) </strong>é necessária para verificar se a tecla é codificada. Cada if é responsável por verificar o estado de uma tecla</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional9.png"></a><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional9_1.png"><img class="alignnone size-full wp-image-568" title="condicional9_1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/condicional9_1.png" alt="condicional9_1" width="314" height="532" /></a></p>
<p style="text-align: justify;">void setup()<br />
{<br />
textFont(createFont(&#8221;Arial&#8221;, 10));<br />
textAlign(CENTER);<br />
}<br />
void draw()<br />
{<br />
background(128);<br />
// Se for tecla codificada<br />
if(key==CODED)<br />
{<br />
// Se for para cima<br />
if(keyCode==UP)<br />
{<br />
text(&#8221;CIMA&#8221;, width/2, height/2);<br />
} else if(keyCode==DOWN)<br />
{<br />
text(&#8221;BAIXO&#8221;, width/2, height/2);<br />
}<br />
}<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index74.html">Executar!</a></p>
<blockquote>
<p style="text-align: justify;"><strong><em>Exercício de Fixação 02 &#8211; Botões</em></strong></p>
<p><strong><em>Faça um programa que implemente três botões na tela. Quando cada um destes botões é clicado, a cor de fundo da tela deve ser trocada.<br />
</em></strong></p></blockquote>
<p style="text-align: justify;">A variável frameCount também poderia ser usada na construção de expressões relacionais e com o objetivo de controlar o andamento de uma animação. Entretanto, torna-se mais prática a utilização de variáveis criadas pelo próprio programador ao invés da frameCount. A próxima seção trata da criação deste tipo de variável. Posteriormente, verificaremos como utilizar tais variável em nossas estruturas de seleção.</p>
<h2>Criação de variáveis em um programa</h2>
<p>As variáveis criadas pelo programador também são armazenadas na memória do computador. Pode-se retornar à analogia que a memória corresponde a um armário recheado de gavetas. Para diferenciar uma gaveta de outra, é necessário por um rótulo em cada gaveta. O rótulo da gaveta corresponde ao identificador da variável. O conteúdo da gaveta corresponde ao valor associado à variável.</p>
<p>Para que se possa criar essas gavetas no armário, ou melhor, declarar as variáveis na memória é necessário configurar qual é o tipo de informação que pode ser armazenado em cada variável. Este processo de declaração é formado por três partes: tipo da variável, nome da variável e, opcionalmente, o valor inicial da variável após o <a href="http://www.processing.org/reference/assign.html">comando de atribução (&#8221;=&#8221;)</a>. Nas linhas seguintes exemplifica-se a criação de três variáveis do tipo inteiro (int), uma após a outra:</p>
<blockquote>
<pre>int a = 1; // a começa com valor 1</pre>
<pre>int b = 2; // b começa com valor 2</pre>
<pre>int c = a + b; // c começa com valor 3</pre>
<pre>int d; // d tem valor desconhecido.</pre>
</blockquote>
<p>O código acima demonstra que do lado direito do sinal de atribuição (&#8221;=&#8221;) pode-se ter uma expressão. No caso, a expressão aritmética &#8220;a + b&#8221; tem como resultado o valor 3. Assim, pode-se representar a memória do computador de maneira gráfica.</p>
<p><img class="alignnone size-full wp-image-113" title="variaveis21" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variaveis21.png" alt="variaveis21" width="594" height="255" /></p>
<p>Observe que o valor da variável chamada d é desconhecido até a execução da última linha. Qualquer tentativa em utilizar a variável d levantará um erro de execução. Por exemplo, o código abaixo, tenta usar a variável d para calcular o valor de e.</p>
<blockquote><p>int a = 1; // a começa com valor 1<br />
int b = 2; // b começa com valor 2<br />
int c = a + b; // c começa com valor 3<br />
int d; // d tem valor desconhecido<br />
<span style="color: #ff0000;">int e = d * 2; // e é igual ao dobro de d, esta linha levanta um erro!</span></p></blockquote>
<p>O Processing seleciona a linha com o erro e mostra a mensagem &#8220;The local variable d may not have been initialized&#8221;.</p>
<p><img class="alignnone size-full wp-image-114" title="erro_variavel" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erro_variavel.png" alt="erro_variavel" width="367" height="600" /></p>
<p>A inicialização da variável não necessariamente precisa ser feita durante a linha de declaração. A correção do código anterior, pode ser feita, portanto desta maneira:</p>
<blockquote><p>int a = 1; // a começa com valor 1<br />
int b = 2; // b começa com valor 2<br />
int c = a + b; // c começa com valor 3<br />
int d;<br />
d= 4;<br />
int e = d * 2; // e é igual ao dobro de d, ou seja 8.</p></blockquote>
<p>A declaração das variáveis também pode ser resumida em uma linha.</p>
<blockquote><p>int a, b, c, d, e;<br />
a = 1; // a começa com valor 1<br />
b = 2; // b começa com valor 2<br />
c = a + b; // c começa com valor 3<br />
d= 4;<br />
e = d * 2; // e é igual ao dobro de d, ou seja 8.</p></blockquote>
<p>O tipo inteiro não é o único tipo de dado disponível, o Processing também aceita outros tipos. Tais tipos armazenam diferentes objetos e obedecem a diferentes intervalos, ou seja, podem assumir diversos valores. Alguns exemplos:</p>
<ul>
<li>Inteiro (<a href="http://www.processing.org/reference/int.html">int</a>): -2.147.483.648 a -2.147.483.647</li>
<li>Ponto Flutuante (<a href="http://www.processing.org/reference/float.html">float</a>): -3,4 * 10^38 a +3,4*10^38</li>
<li>Caractere (<a href="http://www.processing.org/reference/char.html">char</a>): 0 a 65535;</li>
<li>Byte (<a href="http://www.processing.org/reference/byte.html">byte</a>): -128 a 127;</li>
<li>Lógico (<a href="http://www.processing.org/reference/boolean.html">boolean</a>): true ou false;</li>
<li>Cor (<a href="http://www.processing.org/reference/color_datatype.html">color</a>): 16 milhões de cores e 256 tonalidades de transparência;</li>
<li>Fonte (<a href="http://www.processing.org/reference/PFont.html">PFont</a>): Inúmeros tipos diferentes de fontes;</li>
<li>Forma SVG (<a href="http://www.processing.org/reference/PShape.html">PShape</a>): Inúmeros tipos diferentes de formas no formato SVG;</li>
<li>Imagem (<a href="http://www.processing.org/reference/PImage.html">PImage</a>): Diferentes tipos de imagens (.gif, .jpg, .png, .tga).</li>
</ul>
<p>Após uma variável ser criada com um tipo de dado ele não pode ser trocado ou redefinido. Por exemplo, o código abaixo levanta o erro &#8220;Duplicate local variable a&#8221;.</p>
<blockquote><p>float a= 12;</p>
<p>int a = 13;</p></blockquote>
<p><img class="alignnone size-full wp-image-115" title="erro_variavel2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erro_variavel2.png" alt="erro_variavel2" width="367" height="600" /></p>
<p>Também não é possível misturar tipos que não sejam conversíveis. Por exemplo, o tipo ponto flutuante não &#8220;serve&#8221; dentro do tipo inteiro. A mensagem de erro dada é:  &#8220;cannot convert from float to int&#8221;.</p>
<blockquote><p>int a = 13.3; // Erro!<br />
float a = 1;<br />
int b = a + 12.4; // Erro!</p></blockquote>
<p><img class="alignnone size-full wp-image-116" title="erro_variavel3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erro_variavel3.png" alt="erro_variavel3" width="367" height="600" /></p>
<p>Em muitas situações, porém, é necessária a conversão entre tipos de dados diferentes. A manipulação do tipo lógico (boolean) é um exemplo típico. Ele não é conversível implicitamente ao tipo inteiro. Para converter do tipo boolean para o tipo int, por exemplo, utiliza-se a função int.</p>
<blockquote><p>boolean a = true;<br />
int b = int(a);</p></blockquote>
<p>Algumas outras funções de conversão disponíveis são:</p>
<ul>
<li><a href="http://www.processing.org/reference/binary_.html">binary</a>: Converte byte, char, int e color para string de notação binária;</li>
<li><a href="http://www.processing.org/reference/boolean_.html">boolean</a>: Converte de string (&#8221;true&#8221; e &#8220;false&#8221;) para valor lógico;</li>
<li><a href="http://www.processing.org/reference/byte_.html">byte</a>: Conversão para byte;</li>
<li><a href="http://www.processing.org/reference/char_.html">char</a>: Conversão para char;</li>
<li><a href="http://www.processing.org/reference/float_.html">float</a>: Converte para float;</li>
<li><a href="http://www.processing.org/reference/hex_.html">hex</a>: Converte um byte, char, int ou color para uma representação equivalente hexadecimal;</li>
<li><a href="http://www.processing.org/reference/int_.html">int</a>: Converte para número inteiro;</li>
<li><a href="http://www.processing.org/reference/str_.html">str</a>: Retorna a representação em string de tipos primitivos e arrays;</li>
<li><a href="http://www.processing.org/reference/unbinary_.html">unbinary</a>: Converte uma representação binária no formato string para o inteiro equivalente;</li>
<li><a href="http://www.processing.org/reference/unhex_.html">unhex</a>: Converte uma representação hexadecimal no formato string para o inteiro equivalente.</li>
</ul>
<h3>Nomenclatura de Variáveis</h3>
<p>Em relação aos nomes de variáveis, os exemplos mostrados até agora caracterizaram-se por usar apenas uma letra para dar nome à variável. Embora esta seja uma prática válida, é altamente recomendável a escolha de nomes significativos para descrever cada variável. Por exemplo, para representar uma variável que indica a cor do fundo de um programa algumas opções interessantes ao invés de &#8220;f&#8221; ou &#8220;c&#8221; seriam:</p>
<ul>
<li>fundo</li>
<li>corFundo</li>
<li>corDeFundo</li>
</ul>
<p>Nomes como &#8220;CORDEFUNDO&#8221;, &#8220;CorDeFundo&#8221; e &#8220;cordefundo&#8221; embora sejam válidos para a linguagem de programação, fogem de uma certa convenção de nomenclatura recomendável para facilitar a leitura de seus programas. Esta convenção depende de cada linguagem. No Processing, utiliza-se o chamado <a href="http://pt.wikipedia.org/wiki/CamelCase">CamelCase</a>, recomendando-se que:</p>
<ul>
<li>O nome de todas as variáveis seja iniciado com letra minúscula e nunca por um número;</li>
<li>Se o nome da variável for composto por mais de uma palavra, as palavras seguintes devem ter sua primeira letra maiúscula;</li>
<li>Variáveis que nunca mudam de valor durante a execução de um programa, ou, na prática, constantes são nomeadas de maneira diferente e todas as letras devem ser capitalizadas. Por exemplo: CORNER, CENTER, indicam valores constantes.</li>
</ul>
<p>Também se deve salientar que alguns caracteres não podem ser usados para dar nome às variáveis. Neste conjunto se incluem os espaços, caracteres especiais ($, %, &amp;, * , -, etc) e caracteres acentuados. Além disso, as variáveis também não podem ser nomeadas com as palavras-reservadas da linguagem Processing. E, embora seja possível, é altamente não recomendável utilizar  o nome de funções já existentes para dar nome.  Ou seja, &#8220;rect&#8221; e &#8220;ellipse&#8221; são nomes que devem ser evitados e &#8220;int&#8221; e &#8220;float&#8221; são inválidos.</p>
<h3>Escopo de variáveis</h3>
<p>Uma variável possui uma área de validade, ou seja, sua existência é limitada a um bloco de código. Esta validade é chamada de escopo da variável.</p>
<p>No caso do modo contínuo do Processing, para criar uma variável que seja vista por todo o programa, sua criação deve ser feita fora dos blocos setup e draw. Por exemplo, no código abaixo, a variável x pode ser trabalhada tanto pelo setup quanto pelo draw.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel1.png"><img class="alignnone size-full wp-image-570" title="variavel1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel1.png" alt="variavel1" width="320" height="205" /></a></p>
<p>int x;<br />
void setup()<br />
{<br />
x = width;<br />
strokeWeight(10);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(x, height/2);<br />
x = x &#8211; 1;<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index75.html">Executar!</a></p>
<p>Se uma variável é definida dentro de um bloco, ela não é enxergada pelo outro. No exemplo abaixo, o Processing levanta o erro &#8220;Cannot find anything named &#8216;n&#8217;&#8221;, denotando que a variável n, dentro do bloco draw é desconhecida. Em outras palavras, <strong>o escopo da variável n é o bloco setup</strong>.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel2.png"><img class="alignnone size-full wp-image-575" title="variavel2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel2.png" alt="variavel2" width="222" height="315" /></a><br />
void setup()<br />
{<br />
int n = 0;<br />
strokeWeight(10);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(n, height/2);<br />
n = n + 1;<br />
}</p>
<p>Observe que blocos podem ser criados através da abertura e fechamento de chaves. No exemplo abaixo, a variável cor só existe dentro do if. Este estilo de codificação pode criar uma confusão na leitura do código. Recomenda-se, portanto, a organização da criação das variáveis. Assim, sua definição deve ser feita no início dos blocos draw e setup no caso de variáveis que devem ser usadas apenas nestes blocos e fora do setup e draw no caso de variáveis que devem ser compartilhadas pelos dois blocos.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel3.png"><br />
</a></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel3_1.png"><img class="alignnone size-full wp-image-577" title="variavel3_1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel3_1.png" alt="variavel3_1" width="230" height="330" /></a></p>
<p>void draw()<br />
{<br />
if(mousePressed)<br />
{<br />
color c = color(255);<br />
}<br />
background(c);<br />
}</p>
<p>Na seção a seguir, exemplificam-se alguns usos de variáveis no Processing e, principalmente, sua utilização conjunta à estrutura condicional.</p>
<h3>Exemplos de uso de variáveis</h3>
<p>Variáveis podem ser usadas para representar a posição de um objeto na tela. No exemplo abaixo, as variáveis x e y indicam a posição em x e y da construção de um ponto.</p>
<p>Em setup os valores de x e y são, respectivamente, inicializados com width/2 e height/2, ou seja, o ponto é desenhado no centro da tela.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel4.png"></a><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel4_1.png"><img class="alignnone size-full wp-image-579" title="variavel4_1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel4_1.png" alt="variavel4_1" width="310" height="223" /></a></p>
<p>float x;<br />
float y;<br />
void setup()<br />
{<br />
x = width/2;<br />
y = height/2;<br />
strokeWeight(10);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(x,y);<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index76.html">Executar!</a></p>
<p>As variáveis x e y podem ser alteradas a cada chamada do draw. Esta atualização pode ser feita, por exemplo, com a instrução x=x+1. Esta instrução, a cada chamada do draw, incrementa o valor de x em uma unidade. Por exemplo, na primeira chamada ao draw, ou seja, no primeiro frame, x é igual a 50. A partir daí, x = 50 +1, ou x fica com valor 51. Como a modificação de x em cada frame é de uma posição, pode-se dizer que sua velocidade em x é de 1 pixel por frame.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel5.png"><img class="alignnone size-full wp-image-585" title="variavel5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel5.png" alt="variavel5" width="295" height="274" /></a></p>
<p>float x;<br />
float y;<br />
void setup()<br />
{<br />
x = width/2;<br />
y = height/2;<br />
strokeWeight(10);<br />
println(x);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(x,y);<br />
x = x + 1;<br />
println(x);<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index77.html">Executar!</a></p>
<p>No próximo exemplo, a velocidade do objeto é dependente da posição do mouse. Desta forma, se a posição do mouse estiver à esquerda do objeto a velocidade é negativa. Caso contrário, a velocidade é positiva.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel6.png"><img class="alignnone size-full wp-image-590" title="variavel6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel6.png" alt="variavel6" width="340" height="426" /></a></p>
<p>float x;<br />
float y;<br />
void setup()<br />
{<br />
x = width/2;<br />
y = height/2;<br />
strokeWeight(10);<br />
frameRate(30);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(x,y);<br />
// Faz com que o objeto siga o mouse (eixo x)<br />
if(mouseX&lt;x)<br />
x = x &#8211; 1;<br />
else if(mouseX&gt;x)<br />
x = x + 1;</p>
<p>// Faz com que o objeto siga o mouse (eixo y)<br />
if(mouseY&lt;y)<br />
y = y &#8211; 1;<br />
else if(mouseY&gt;y)<br />
y = y + 1;<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index78.html">Executar!</a></p>
<p>O teclado também pode ser utilizado como condição para a modificação de uma variável.  A seguir, as teclas controlam a modificação de x ou y.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel7.png"><img class="alignnone size-full wp-image-595" title="variavel7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel7.png" alt="variavel7" width="369" height="672" /></a></p>
<p>float x;<br />
float y;<br />
void setup()<br />
{<br />
x = width/2;<br />
y = height/2;<br />
strokeWeight(10);<br />
frameRate(30);<br />
}<br />
void draw()<br />
{<br />
background(255);<br />
point(x,y);<br />
// Se a tecla for codificada e<br />
// pressionada<br />
if(key==CODED &amp;&amp; keyPressed)<br />
{<br />
// Para cima, altera o valor de y em -1<br />
if(keyCode==UP)<br />
{<br />
y = y &#8211; 1;<br />
}<br />
// Para baixo, altera o valor de y em +1<br />
else if(keyCode==DOWN)<br />
{<br />
y = y + 1;<br />
}<br />
// Para esquerda, altera o valor de x em -1<br />
else if(keyCode==LEFT)<br />
{<br />
x = x &#8211; 1;<br />
}<br />
// Para direita, altera o valor de x em +1<br />
else if(keyCode==RIGHT)<br />
{<br />
x = x + 1;<br />
}<br />
}<br />
}<br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index79.html">Executar!</a></p>
<p>Além dos tipos básicos, as variáveis também podem conter objetos mais complexos como fontes e imagens. A<a href="http://www.processing.org/reference/createFont_.html"> função createFont</a>, no exemplo a seguir, retorna uma variável do tipo <a href="http://www.processing.org/reference/PFont.html">PFont</a>. Essa variável é usada no bloco draw para desenhar a cada frame um texto diferente. A condição (frameCount%2==0) a cada frame habilita um bloco diferente. Quando frameCount é par,  a condição é verdadeira e o fluxo principal é executado. No caso de frames ímpares o fluxo alternativo é executado.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel8.png"><img class="alignnone size-full wp-image-601" title="variavel8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel8.png" alt="variavel8" width="328" height="576" /></a></p>
<p>PFont fonte1;<br />
PFont fonte2;<br />
void setup()<br />
{<br />
fonte1 = createFont(&#8221;Arial&#8221;, 15);<br />
fonte2 = createFont(&#8221;Times New Roman&#8221;, 20);<br />
textAlign(CENTER);<br />
frameRate(5);<br />
}<br />
void draw()<br />
{<br />
background(128);<br />
// Em frames pares, mostra a fonte arial<br />
if(frameCount % 2==0)<br />
{<br />
textFont(fonte1);<br />
text(&#8221;Arial&#8221;, width/2, height/2);<br />
}<br />
else // Em frames ímpares, mostra a times<br />
{<br />
textFont(fonte2);<br />
text(&#8221;Times&#8221;, width/2, height/2);<br />
}<br />
}</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index80.html">Executar!</a></p>
<p style="text-align: justify;">Outro tipo de variável que o Processing aceita é a variável de imagem. Uma imagem é representada pelo <a href="http://www.processing.org/reference/PImage.html">tipo PImage</a>. Para carregar uma imagem é necessária a chamada à<a href="http://www.processing.org/reference/loadImage_.html"> função loadImage</a> passando como parâmetro o nome do arquivo de imagem. A exibição da imagem é controlada pela função image. Tal função permite a escolha da posição da imagem na tela e, opcionalmente, de sua altura e largura. No exemplo a seguir, o arquivo &#8220;aviao.png&#8221; é exibido.</p>
<p style="text-align: justify;">Para colocar este arquivo dentro do projeto para que Processing consiga enxergá-lo, selecione o menu <strong>Sketch &gt; Add file&#8230;</strong> . O arquivo será colocado em uma pasta chamada data dentro da pasta do projeto.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/menuaddfile.png"><img class="alignnone size-full wp-image-606" title="menuaddfile" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/menuaddfile.png" alt="menuaddfile" width="269" height="157" /></a></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel9.png"><img class="alignnone size-full wp-image-607" title="variavel9" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel9.png" alt="variavel9" width="251" height="269" /></a></p>
<p style="text-align: justify;">// Variável de imagem<br />
PImage img;<br />
// Carrega a imagem<br />
img = loadImage(&#8221;aviao.png&#8221;);<br />
// Exibe a imagem na posição 0,0<br />
image(img,0,0);</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index81.html">Executar!</a></p>
<p style="text-align: justify;">Imagem inserida (originalmente de <a href="http://www.flyingyogi.com/fun/spritelib.html">SpriteLib GPL</a> &#8211; observe a licença desta imagem no site!).</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/aviao.png"><img class="alignnone size-full wp-image-613" title="aviao" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/aviao.png" alt="aviao" width="65" height="65" /></a></p>
<p style="text-align: justify;">No próximo exemplo, a exibição da imagem é controlada a partir da posição do mouse. A chamada a <a href="http://www.processing.org/reference/imageMode_.html">imageMode(CENTER)</a> faz com que o desenho da imagem seja centralizado em relação à posição do mouse.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel10.png"><img class="alignnone size-full wp-image-614" title="variavel10" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/variavel10.png" alt="variavel10" width="370" height="585" /></a></p>
<p style="text-align: justify;">// Variável de imagem<br />
PImage img;<br />
void setup()<br />
{<br />
size(300, 200);<br />
// Carrega a imagem<br />
img = loadImage(&#8221;aviao.png&#8221;);<br />
// O modo de desenho da imagem é centralizado<br />
imageMode(CENTER);<br />
}<br />
void draw()<br />
{<br />
// Oculta o cursor<br />
noCursor();<br />
// Cor de fundo igual ao fundo da imagem<br />
background(0,67,171);<br />
// Exibe a imagem na posição do mouse<br />
image(img,mouseX,mouseY);<br />
}</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index82.html">Executar!</a></p>
<p style="text-align: justify;">Por enquanto, observe que só nos preocupamos em carregar e mostrar as imagens. Futuramente, veremos como uma imagem pode ser alterada através de filtros ou processada pixel a pixel.</p>
<h2>Para saber mais</h2>
<p><span style="color: #000000;">Reas, Casey. Fry, Ben. Processing: A Programming Handbook for Visual Designers and Artists. </span></p>
<p><span style="color: #000000;">51 a 59 &#8211; decisão.</span></p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/24/aula-04-estrutura-condicional-e-criacao-de-variaveis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 03 &#8211; Expressões Aritméticas, Relacionais e Lógicas</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/17/aula-03-expressoes-aritmeticas-relacionais-e-logicas/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/17/aula-03-expressoes-aritmeticas-relacionais-e-logicas/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 16:47:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[aula03]]></category>
		<category><![CDATA[expressões aritméticas]]></category>
		<category><![CDATA[expressões lógicas]]></category>
		<category><![CDATA[expressões relacionais]]></category>
		<category><![CDATA[movimento]]></category>
		<category><![CDATA[teclado]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=302</guid>
		<description><![CDATA[Objetivo
Anteriormente, entendemos o Processing como uma ferramenta de desenho e como uma ferramenta de animação e interação. Cada vez mais funções são apresentadas para que se entenda como funcionam as funcionalidades de uma linguagem de programação voltada para a computação gráfica e design digital.
As variáveis apresentadas no capítulo anterior foram utilizadas como entradas imediatas de [...]]]></description>
			<content:encoded><![CDATA[<h2>Objetivo</h2>
<p style="text-align: justify;">Anteriormente, entendemos o Processing como uma <a href="http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/">ferramenta de desenho</a> e como uma <a href="http://www.brunocampagnolo.com/2009ip/2009/03/10/aula-02-variaveis-do-processing-e-o-modo-continuo/">ferramenta de animação e interação</a>. Cada vez mais funções são apresentadas para que se entenda como funcionam as funcionalidades de uma linguagem de programação voltada para a computação gráfica e design digital.</p>
<p style="text-align: justify;">As variáveis apresentadas no capítulo anterior foram utilizadas como entradas imediatas de dados das funções gráficas. Tais variáveis, porém, podem ser alteradas e modificadas através de expressões , operadores e funções. Desta forma, o tema do capítulo corrente trata de como aplicar elementos da aritmética e lógica em um programa de computador. Cada um destes elementos será enxergado como se fosse um bloco de lego, ou melhor, um filtro no qual um ou mais valores serão transformados em outros.</p>
<p style="text-align: justify;">No início, outro tipo de interação também é apresentada: a interação via teclado.</p>
<p style="text-align: justify;">Destaca-se que o uso de expressões relacionais e lógicas neste capítulo deve ser estudado com cuidado por ter um enfoque mais matemático que o tradicional. Entretanto, em situações reais seu uso é mais simples se combinadas com o uso de estruturas condicionais. Se você compreende bem as operações lógicas e relacionais fique confortável para pular este capítulo e partir direto para o trabalho com a estrutura condicional na seqüencia.</p>
<p><span id="more-302"></span></p>
<h2>Exemplos do Capítulo</h2>
<p>Os exemplos mostrados neste capítulo estão disponíveis para <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/aula03.zip">download</a>.</p>
<h2 style="text-align: justify;">Sintaxe introduzida (link para documentação em Português)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. Pule para o tópico<strong> &#8220;Usando as variáveis de teclado no modo contínuo&#8221;</strong>, se for sua primeira leitura.</p>
<ul>
<li>Variáveis de teclado:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/key.html">key</a>: contém o valor da tecla mais recentemente pressionada ou solta, representa o caractere da tecla;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/keyCode.html">keyCode</a>: permite a detecção de teclas especiais como UP, DOWN, LEFT e RIGHT (cima, baixo, esquerda e direita);</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/keyPressed.html">keyPressed</a>: valor booleano que indica se uma tecla está pressionada (true) ou solta (false).</li>
</ul>
</li>
<li>Expressões Aritméticas:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/addition.html">operador +</a>: Adiciona dois valores ou concatena dois strings. Pode ser usado para modificar a posição de um elemento na tela em relação a uma coordenada existente, deixando o elemento mais à direita em relação ao eixo x ou mais para baixo em relação ao eixo y.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/minus.html">operador -</a>: Subtrai dois valores. Semelhante ao operador “+”, o &#8211; também pode deslocar um elemento. No caso do operador &#8211; o elemento é deslocado para cima em relação ao eixo y e para a esquerda em relação ao eixo x. O operador “-” também pode ser usado para inverter uma direção de movimento.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/multiply.html">operador *</a>: Multiplica dois valores. Sua utilidade está, por exemplo, no reescalonamento de uma posição. A operação de multiplicação por zero também terá vez em relação à habilitação de desenho de um elemento.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/divide.html">operador /</a>: Divide um valor por outro. Indica quantas vezes um elemento serve dentro de outro. Operações com “/” podem ser usadas, por exemplo, para criar funções que aumentam de uma unidade após um certo tempo.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/modulo.html">operador %</a>: Retorna o resto inteiro da divisão. Usado para restringir um conjunto de números a um intervalo desejado.</li>
</ul>
</li>
<li>Expressões Relacionais:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/equality.html">==</a>: Operador de igualdade. Devolve verdadeiro quando os dois operandos são iguais;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/inequality.html">!=</a>: Operador de diferença. Devolve verdadeiro quando os dois operandos são diferentes;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/greaterthan.html">&gt;</a>: Operador de maior. Devolve verdadeiro quando o operando da esquerda é maior que o da direita;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/lessthan.html">&lt;</a>: Operador de menor. Devolve verdadeiro quando o operando da esquerda é menor que o da direita;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/greaterthanorequalto.html">&gt;=</a>: Operador maior ou igual. Devolve verdadeiro quando o operando da esquerda é maior ou igual que o da direita.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/lessthanorequalto.html">&lt;=</a>: Operador menor ou igual. Devolve verdadeiro quando o operando da esquerda é menor ou igual que o da direita.</li>
</ul>
</li>
<li>Expressões Lógicas:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/logicalAND.html">&amp;&amp;</a> &#8211; Operador E.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/logicalOR.html">||</a> &#8211; Operador OU.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/logicalNOT.html">!</a> &#8211; Operador NÃO.</li>
</ul>
</li>
</ul>
<h2 style="text-align: justify;">Sintaxe introduzida (link para documentação em Inglês)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. Pule para o tópico<strong> &#8220;Usando as variáveis de teclado no modo contínuo&#8221;</strong>, se for sua primeira leitura.</p>
<ul>
<li>Variáveis de teclado:
<ul>
<li><a href="http://www.processing.org/reference/key.html">key</a>: contém o valor da tecla mais recentemente pressionada ou solta, representa o caractere da tecla;</li>
<li><a href="http://www.processing.org/reference/keyCode.html">keyCode</a>: permite a detecção de teclas especiais como UP, DOWN, LEFT e RIGHT (cima, baixo, esquerda e direita);</li>
<li><a href="http://www.processing.org/reference/keyPressed.html">keyPressed</a>: valor booleano que indica se uma tecla está pressionada (true) ou solta (false).</li>
</ul>
</li>
<li>Expressões Aritméticas:
<ul>
<li><a href="http://www.processing.org/reference/addition.html">operador +</a>: Adiciona dois valores ou concatena dois strings. Pode ser usado para modificar a posição de um elemento na tela em relação a uma coordenada existente, deixando o elemento mais à direita em relação ao eixo x ou mais para baixo em relação ao eixo y.</li>
<li><a href="http://www.processing.org/reference/minus.html">operador -</a>: Subtrai dois valores. Semelhante ao operador “+”, o &#8211; também pode deslocar um elemento. No caso do operador &#8211; o elemento é deslocado para cima em relação ao eixo y e para a esquerda em relação ao eixo x. O operador “-” também pode ser usado para inverter uma direção de movimento.</li>
<li><a href="http://www.processing.org/reference/multiply.html">operador *</a>: Multiplica dois valores. Sua utilidade está, por exemplo, no reescalonamento de uma posição. A operação de multiplicação por zero também terá vez em relação à habilitação de desenho de um elemento.</li>
<li><a href="http://www.processing.org/reference/divide.html">operador /</a>: Divide um valor por outro. Indica quantas vezes um elemento serve dentro de outro. Operações com “/” podem ser usadas, por exemplo, para criar funções que aumentam de uma unidade após um certo tempo.</li>
<li><a href="http://www.processing.org/reference/modulo.html">operador %</a>: Retorna o resto inteiro da divisão. Usado para restringir um conjunto de números a um intervalo desejado.</li>
</ul>
</li>
<li>Expressões Relacionais:
<ul>
<li><a href="http://www.processing.org/reference/equality.html">==</a>: Operador de igualdade. Devolve verdadeiro quando os dois operandos são iguais;</li>
<li><a href="http://www.processing.org/reference/inequality.html">!=</a>: Operador de diferença. Devolve verdadeiro quando os dois operandos são diferentes;</li>
<li><a href="http://www.processing.org/reference/greaterthan.html">&gt;</a>: Operador de maior. Devolve verdadeiro quando o operando da esquerda é maior que o da direita;</li>
<li><a href="http://www.processing.org/reference/lessthan.html">&lt;</a>: Operador de menor. Devolve verdadeiro quando o operando da esquerda é menor que o da direita;</li>
<li><a href="http://www.processing.org/reference/greaterthanorequalto.html">&gt;=</a>: Operador maior ou igual. Devolve verdadeiro quando o operando da esquerda é maior ou igual que o da direita.</li>
<li><a href="http://www.processing.org/reference/lessthanorequalto.html">&lt;=</a>: Operador menor ou igual. Devolve verdadeiro quando o operando da esquerda é menor ou igual que o da direita.</li>
</ul>
</li>
<li>Expressões Lógicas:
<ul>
<li><a href="http://www.processing.org/reference/logicalAND.html">&amp;&amp;</a> &#8211; Operador E.</li>
<li><a href="http://www.processing.org/reference/logicalOR.html">||</a> &#8211; Operador OU.</li>
<li><a href="http://www.processing.org/reference/logicalNOT.html">!</a> &#8211; Operador NÃO.</li>
</ul>
</li>
</ul>
<h2 style="text-align: justify;">Usando as variáveis de teclado no modo contínuo</h2>
<p style="text-align: justify;">O teclado é, sem dúvida, um dos dispositivos de interação de maior&nbsp; popularidade no uso de dispositivos eletrônicos. Desde teclados computadorizados, aparelhos celulares, eletrodomésticos como microondas, máquinas de escrever, e, até mesmo, brinquedos, a interação via teclado é conhecida por todos. O teclado do computador é derivado da interface da máquina de escrever. Mesmo que o computador tenha evoluído nas últimas décadas e deixado de ser meramente uma máquina de criar textos, o teclado persiste e foi adaptado para o uso em games, navegação pela Internet e comunicação pessoal.</p>
<p style="text-align: justify;">O Processing expõe três variáveis que indicam o estado atual do teclado:</p>
<ul>
<li><a href="http://www.processing.org/reference/key.html">key</a>: contém o valor da tecla mais recentemente pressionada ou solta, representa o caractere da tecla;</li>
<li><a href="http://www.processing.org/reference/keyCode.html">keyCode</a>: permite a detecção de teclas especiais como UP, DOWN, LEFT e RIGHT (cima, baixo, esquerda e direita);</li>
<li><a href="http://www.processing.org/reference/keyPressed.html">keyPressed</a>: valor booleano que indica se uma tecla está pressionada (true) ou solta (false).</li>
</ul>
<p>A variável key retorna o caractere pressionado. No exemplo abaixo, cada vez que o usuário altera a tecla uma letra diferente é exibida na tela. Observe o uso da <a href="http://www.processing.org/reference/textAlign_.html">função textAlign</a> para alinhar o texto no centro da tela.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey.png"><img class="alignnone size-full wp-image-304" title="tecladokey" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey.png" alt="tecladokey" width="459" height="238" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp;&nbsp; // Carrega a fonte Arial com metade do tamanho da tela
&nbsp;&nbsp; textFont(createFont("Arial", width/2));
&nbsp;&nbsp; // Alinha o texto
&nbsp;&nbsp; textAlign(CENTER, BASELINE);
}
void draw()
{
&nbsp;&nbsp;&nbsp; // Limpa a tela
&nbsp;&nbsp;&nbsp; background(100);
&nbsp;&nbsp;&nbsp; // Exibe a tecla pressionada
&nbsp;&nbsp;&nbsp; text(key, width/2, height/2);

}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index26.html">Executar!</a></p>
<p style="text-align: justify;">Embora o valor de key seja um caractere também é possível convertê-lo para uma representação numérica. Essa representação numérica é derivada de uma tabela de caracteres chamada <a href="http://www.asciitable.com/">tabela ASCII</a>. Esta tabela representa cada caractere com um valor diferente de 0 até 255. Por exemplo, entre 48 e 57 temos os valores dos caracteres de 0 a 9. Entre 65 e 90 tem-se o intervalo das letras maiúsculas. O exemplo abaixo, associa a posição de desenho de uma linha à tecla pressionada.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey2.png"><img class="alignnone size-full wp-image-309" title="tecladokey2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey2.png" alt="tecladokey2" width="414" height="455" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp;&nbsp;&nbsp; size(300, 100);
&nbsp;&nbsp;&nbsp; // Carrega a fonte Arial com metade do tamanho da tela
&nbsp;&nbsp;&nbsp; textFont(createFont("Arial", height/2));
&nbsp;&nbsp;&nbsp; // Alinha o texto
&nbsp;&nbsp;&nbsp; textAlign(CENTER, BASELINE);
}
void draw()
{
&nbsp;&nbsp;&nbsp; // Limpa a tela
&nbsp;&nbsp;&nbsp; background(100);
&nbsp;&nbsp;&nbsp; // Exibe a tecla pressionada como uma linha
&nbsp;&nbsp;&nbsp; // O valor de x corresponde à tecla
&nbsp;&nbsp;&nbsp; line(key, 0, key, height);
&nbsp;&nbsp;&nbsp; // Exibe o valor ASCII da tecla pressionada
&nbsp;&nbsp;&nbsp; text(int(key), width/2, height);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index27.html">Executar!</a></p>
<p>Enquanto a variável key retorna um caractere ASCII, a <a href="http://www.processing.org/reference/keyCode.html">variável keyCode</a> permite que se utilize a representação para teclas especiais. Esta representação inclui também as teclas como: UP, DOWN, LEFT, RIGHT, ALT, SHIFT e CONTROL, por exemplo. Observe que keyCode representa a tecla e não a letra. Por exemplo, ao pressionar a tecla &#8216;A&#8217;, independente se o valor é minúsculo ou maiúsculo, o valor obtido é 65. O exemplo abaixo demonstra a diferença entre key e keyCode. Uma lista dos valores está disponível no <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/KeyEvent.html">site do Java</a>.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey3.png"><img class="alignnone size-full wp-image-314" title="tecladokey3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey3.png" alt="tecladokey3" width="414" height="517" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(300, 100);
&nbsp; // Carrega a fonte Arial com metade do tamanho da tela
&nbsp; textFont(createFont("Arial", height/2));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER, BASELINE);
}
void draw()
{
&nbsp; // Limpa a tela
&nbsp; background(100);
&nbsp; // Exibe a tecla pressionada como uma linha
&nbsp; // O valor de x1 corresponde à key
&nbsp; // O valor de x2 corresponde à keyCode
&nbsp; line(key, 0, keyCode, height);
&nbsp; // Exibe o valor da tecla pressionada (key)
&nbsp; text(int(key), width/3, height/2);
&nbsp; text(key, 2*width/3, height/2);
&nbsp; // Exibe o valor da tecla pressionada (keyCode)
&nbsp; text(keyCode, width/2, height);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index28.html">Executar!</a></p>
<p style="text-align: justify;">A última variável que se preocupa com o teclado é a <a href="http://www.processing.org/reference/keyPressed.html">variável keyPressed</a>. Tal variável é um valor lógico que poderá ser utilizado para a tomada de decisões. O código a seguir exemplifica a mudança da cor da tela caso qualquer tecla seja pressionada. A tecla pressionada determina a cor escolhida. O uso da <a href="http://www.processing.org/reference/int.html">função int</a> se dá para converter o valor lógico (true ou false) para 1 ou zero.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey4.png"><img class="alignnone size-full wp-image-319" title="tecladokey4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/tecladokey4.png" alt="tecladokey4" width="400" height="391" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com metade do tamanho da tela
&nbsp; textFont(createFont("Arial", height/2));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER, BASELINE);
}
void draw()
{
&nbsp; // Limpa a tela com a cor da tecla
&nbsp; // caso a tecla seja pressionada
&nbsp; background(key * int(keyPressed));
&nbsp; text(key, width/2, height/2);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index29.html">Executar!</a></p>
<p style="text-align: justify;">Para usar o teclado efetivamente, será necessário diferenciar cada uma das teclas pressionadas e associar ações diferentes a cada tecla conforme sua relação com um valor.&nbsp; Será necessário, portanto, necessário o uso dos operadores, principalmente, os relacionais. Nas próximas seções, conheceremos os principais operadores que podem ser utilizados no Processing e como eles podem ser utilizados para manipulação das variáveis de mouse e de teclado, ou mesmo para aplicar operações na variável frameCount.</p>
<h2>Expressões Aritméticas</h2>
<p>A matemática pode ser utilizada para produzir forma e movimento em um programa. Os operadores aritméticos tradicionais, embora sejam bastante intuitivos podem ser aplicados na criação de comportamentos complexos, principalmente quando misturados entre si para gerar funções. As expressões aritméticas são construídas através dos operadores explicados a seguir:</p>
<ul>
<li><a href="http://www.processing.org/reference/addition.html">operador +</a>: Adiciona dois valores ou concatena dois strings. Pode ser usado para modificar a posição de um elemento na tela em relação a uma coordenada existente, deixando o elemento mais à direita em relação ao eixo x ou mais para baixo em relação ao eixo y.</li>
<li><a href="http://www.processing.org/reference/minus.html">operador -</a>: Subtrai dois valores. Semelhante ao operador &#8220;+&#8221;, o &#8211; também pode deslocar um elemento. No caso do operador &#8211; o elemento é deslocado para cima em relação ao eixo y e para a esquerda em relação ao eixo x. O operador &#8220;-&#8221; também pode ser usado para inverter uma direção de movimento.</li>
<li><a href="http://www.processing.org/reference/multiply.html">operador *</a>: Multiplica dois valores. Sua utilidade está, por exemplo, no reescalonamento de uma posição. A operação de multiplicação por zero também terá vez em relação à habilitação de desenho de um elemento.</li>
<li><a href="http://www.processing.org/reference/divide.html">operador /</a>: Divide um valor por outro. Indica quantas vezes um elemento serve dentro de outro. Operações com &#8220;/&#8221; podem ser usadas, por exemplo, para criar funções que aumentam de uma unidade após um certo tempo.</li>
<li><a href="http://www.processing.org/reference/modulo.html">operador %</a>: Retorna o resto inteiro da divisão. Usado para restringir um conjunto de números a um intervalo desejado.</li>
</ul>
<p>Observa-se exemplos de aplicação de cada um destes operadores em seguida, principalmente para a implementação de deslocamentos e movimentos.</p>
<p>No exemplo a seguir, o mouse determina a posição de um retângulo na tela. O círculo branco é desenhado à direita do retângulo através da aplicação do operador + e o círculo cinza é desenhado à esquerda pelo uso do operador -.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento1.png"><img class="alignnone size-full wp-image-324" title="deslocamento1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento1.png" alt="deslocamento1" width="381" height="310" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; rectMode(CENTER);
}

void draw()
{
&nbsp; background(100);
&nbsp; // Retângulo ao centro
&nbsp; fill(0);
&nbsp; rect(mouseX, mouseY, 20, 20);
&nbsp; // Círculo à direita
&nbsp; fill(255);
&nbsp; ellipse(mouseX+20, mouseY, 20, 20);
&nbsp; // Círculo à esquerda
&nbsp; fill(128);
&nbsp; ellipse(mouseX-20, mouseY, 20, 20);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index30.html">Executar!</a></p>
<p>O caso abaixo demonsta o texto sendo exibido à esquerda, acima, à direita e abaixo conforme a aplicação dos deslocamentos.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento2.png"><img class="alignnone size-full wp-image-329" title="deslocamento2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento2.png" alt="deslocamento2" width="382" height="291" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com tamanho 10
&nbsp; textFont(createFont("Arial", 10));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER);
}

void draw()
{
&nbsp; background(100);
&nbsp; noFill();
&nbsp; text("N", mouseX, mouseY-20);
&nbsp; text("O", mouseX-20, mouseY);
&nbsp; text("S", mouseX, mouseY + 20);
&nbsp; text("E", mouseX+20,mouseY);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index31.html">Executar!</a></p>
<p>A combinação dos operadores + e &#8211; pode ser feita com a variável frameCount, width e height. No exemplo abaixo, cada letra é deslocada em relação a anterior. O valor do deslocamento determina também a posição inicial do objeto.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento3.png"><img class="alignnone size-full wp-image-334" title="deslocamento3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento3.png" alt="deslocamento3" width="360" height="380" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com tamanho 20
&nbsp; textFont(createFont("Arial", 20));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER);
}
void draw()
{
&nbsp; background(100);
&nbsp; text("3", frameCount, height - 20);
&nbsp; text("2", frameCount+10, height - 40);
&nbsp; text("1", frameCount+20, height - 60);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index32.html">Executar!</a></p>
<p style="text-align: justify;">O operador de multiplicação também pode ser usado para aumentar ou diminuir a velocidade de um movimento. No exemplo abaixo, cada letra tem uma velocidade diferente a partir do multiplicador.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento4.png"><img class="alignnone size-full wp-image-343" title="deslocamento4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento4.png" alt="deslocamento4" width="463" height="268" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com tamanho 20
&nbsp; textFont(createFont("Arial", 20));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER);
}
void draw()
{
&nbsp; background(100);
&nbsp; text("3", frameCount*0.5, height - 20);
&nbsp; text("2", frameCount, height - 40);
&nbsp; text("1", frameCount*2, height - 60);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index33.html">Executar!</a></p>
<p style="text-align: justify;">A partir dos exemplos anteriores pode-se observar que a posição do objeto em relação ao tempo reflete a relação física entre velocidade e tempo (sendo frameCount uma boa aproximação do tempo passado desde o início do programa). Assim, considerando a independência dos movimentos no eixo x e no eixo y, as fórmulas para cálculo da posição de um objeto após a passagem de um certo tempo é:</p>
<blockquote>
<pre style="text-align: justify;">x = posição inicial em x + (velocidade em x * frameCount )</pre>
<pre style="text-align: justify;">y = posição inicial em y + (velocidade em y * frameCount)</pre>
</blockquote>
<p style="text-align: justify;">Esta é a fórmula do <a href="http://pt.wikipedia.org/wiki/Movimento_retil%C3%ADneo">Movimento Retilínio Uniforme</a>. No exemplo, abaixo, cada instrução implementa uma fórmula de posicionamento diferente em x e em y. A tabela sumariza as posições, direções e velocidades de cada objeto. Observe que a velocidade é dada em pixels por frame.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento5.png"><img class="alignnone size-full wp-image-352" title="deslocamento5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento5.png" alt="deslocamento5" width="486" height="343" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com tamanho 20
&nbsp; textFont(createFont("Arial", 20));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER);
&nbsp; frameRate(5);
}
void draw()
{
&nbsp; background(100);
&nbsp; text("3", 10+frameCount*0.5, 20+frameCount*3);
&nbsp; text("2", 45-frameCount*2, 50+frameCount*3);
&nbsp; text("1", 90-frameCount*7, 60-frameCount*5);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index34.html">Executar!</a></p>
<table id="l6l5" border="1" cellspacing="0" cellpadding="3" width="500">
<tbody>
<tr>
<td width="14%">Instrução</td>
<td width="14%"><span style="font-size: xx-small;">Posição Inicial em X<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Velocidade em X (pixels / frame)<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Direção<br />
em X </span></td>
<td width="14%"><span style="font-size: xx-small;">Posição Inicial em Y<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Velocidade em Y (pixels / frame))</span></td>
<td width="14%"><span style="font-size: xx-small;">Direção em Y<br />
</span></td>
</tr>
<tr>
<td width="14%"><span style="font-size: xx-small;">text(&#8221;3&#8243;, 10+frameCount*0.5, 20+frameCount*3);</span></td>
<td width="14%"><span style="font-size: xx-small;">10<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">0.5<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Para a direita (+)<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">20<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">3<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">De cima para baixo (+)<br />
</span></td>
</tr>
<tr>
<td width="14%"><span style="font-size: xx-small;">text(&#8221;2&#8243;, 45-frameCount*2, 50+frameCount*3);</span></td>
<td width="14%"><span style="font-size: xx-small;">45<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">2<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Para a esquerda (-)<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">50<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">3<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">De cima para baixo (+)<br />
</span></td>
</tr>
<tr>
<td width="14%"><span style="font-size: xx-small;">text(&#8221;1&#8243;, 90-frameCount*7, 60-frameCount*5);</span></td>
<td width="14%"><span style="font-size: xx-small;">90<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">7<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">Para a esquerda (-)<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">60<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">5<br />
</span></td>
<td width="14%"><span style="font-size: xx-small;">De baixo para cima (-)<br />
</span></td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">&nbsp;</p>
<blockquote>
<p style="text-align: justify;"><em>E<strong>xercício de Fixação 01 &#8211; Completar a tabela</strong></em></p>
<p style="text-align: justify;"><em><strong>Conhecendo a fórmula do MRU e dadas as seguintes posições, complete a tabela a seguir.</strong></em></p>
<p style="text-align: justify;"><em><strong>Fórmula:</strong></em></p>
<pre style="text-align: justify;"><em><strong>x = posição inicial em x + (velocidade em x * frameCount )</strong></em></pre>
<pre style="text-align: justify;"><em><strong>y = posição inicial em y + (velocidade em y * frameCount)</strong></em></pre>
<p style="text-align: justify;"><em><strong><br />
</strong></em></p>
<table id="l6l5" border="1" cellspacing="0" cellpadding="3" width="500">
<tbody>
<tr>
<td width="14%"><em><strong>Instrução</strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Posição Inicial em X<br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Velocidade em X (pixels / frame)<br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Direção<br />
em X </span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Posição Inicial em Y<br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Velocidade em Y (pixels / frame))</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;">Direção em Y<br />
</span></strong></em></td>
</tr>
<tr>
<td width="14%"><em><strong><span style="font-size: xx-small;">text(&#8221;X&#8221;, frameCount*0.7, 13-frameCount*6);</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
</tr>
<tr>
<td width="14%"><em><strong><span style="font-size: xx-small;">text(&#8221;Y&#8221;, -45+frameCount*10, 50+frameCount*3);</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
</tr>
<tr>
<td width="14%"><em><strong><span style="font-size: xx-small;">text(&#8221;Z&#8221;, 12-frameCount*3, 30+frameCount*2);</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><strong><span style="font-size: xx-small;"><br />
</span></strong></em></td>
<td width="14%"><em><span style="font-size: xx-small;"><br />
</span></em></td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">&nbsp;</p>
</blockquote>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">Outro tipo de movimento de possível implementação apenas usando operadores aritméticos é o <a href="http://pt.wikipedia.org/wiki/Movimento_retil%C3%ADneo#Movimento_retil.C3.ADneo_uniformemente_variado_.28MRUV.29">movimento retilíneo uniformemente variado</a>. Neste caso, a velocidade varia de maneira constante, ou seja, uma aceleração é aplicada. Um exemplo típico de aceleração que pode ser aplicada em um corpo é a aceleração da gravidade.</p>
<p style="text-align: justify;">A fórmula para determinação da posição a partir do frameCount é:</p>
<blockquote>
<pre style="text-align: justify;">posição atual = posição inicial + velocidade inicial * frameCount+ (1/2*aceleração*frameCount * frameCount )</pre>
</blockquote>
<p style="text-align: justify;">Foge do escopo deste material a demonstração desta fórmula.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento6.png"><img class="alignnone size-full wp-image-357" title="deslocamento6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento6.png" alt="deslocamento6" width="507" height="347" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(100, 300);
&nbsp; frameRate(5);
}
void draw()
{
&nbsp; ellipse(width/2,
&nbsp; 10+1*frameCount+(0.5*5*frameCount*frameCount),
&nbsp; 10, 10);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index35.html">Executar!</a></p>
<p style="text-align: justify;">É claro, o movimento em x e em y pode ser enxergado de maneira independente. Por exemplo, a seguir é demonstrado o movimento de um projétil: velocidade constante em x e variável em relação à velocidade em y.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento7.png"><img class="alignnone size-full wp-image-363" title="deslocamento7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento7.png" alt="deslocamento7" width="462" height="571" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 300);
&nbsp; frameRate(30);
}
void draw()
{
&nbsp; background(0);
&nbsp; ellipse(2 * frameCount,
&nbsp; height-5*frameCount+(0.5*0.06*frameCount*frameCount),
&nbsp; 10, 10);
}
</pre></p>
<p style="text-align: justify;"><a href="http://http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index36.html">Executar!</a></p>
<p style="text-align: justify;">Movimentos periódicos podem ser implementados através do <a href="http://www.processing.org/reference/modulo.html">operador %</a>. Tal operador retorna o resto inteiro da divisão. Conforme já explicado no<a href="http://www.brunocampagnolo.com/2009ip/2009/03/10/aula-02-variaveis-do-processing-e-o-modo-continuo/"> capítulo anterior</a>, a aplicação do operador % em uma variável que cresce constantemente cria uma expressão que volta a se repetir. O programa abaixo gera o gráfico de aplicação do operador % em relação ao frameCount. O intervalo de repetição da expressão se dá de zero até 99. Ao frameCount chegar em 100, já que 100 dividido por 100&nbsp; dá resto 0, o intervalo recomeça.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento8.png"><img class="alignnone size-full wp-image-368" title="deslocamento8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento8.png" alt="deslocamento8" width="472" height="549" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 20));
&nbsp; frameRate(10);
}
void draw()
{
&nbsp; // Exibe o ponto
&nbsp; point(frameCount,
&nbsp; frameCount % 100);
&nbsp; // Exibe os dados
&nbsp; fill(255);
&nbsp; rect(0, height/2, 400, 100);
&nbsp; fill(0);
&nbsp; text("frameCount = " + frameCount, 0, height - 60);
&nbsp; text("frameCount % 100 = " + (frameCount % 100), 0, height - 40);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index37.html">Executar!</a></p>
<p style="text-align: justify;">Destaca-se, também, que qualquer um dos movimentos anteriores também pode ser implementado de maneira periódica usando o operador % como parâmetro do movimento. No exemplo abaixo, a expressão frameCount % 30 permite que se repita a animação de 30 em 30 frames.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento9.png"><img class="alignnone size-full wp-image-373" title="deslocamento9" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento9.png" alt="deslocamento9" width="441" height="424" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; // Carrega a fonte Arial com tamanho 20
&nbsp; textFont(createFont("Arial", 20));
&nbsp; // Alinha o texto
&nbsp; textAlign(CENTER);
&nbsp; frameRate(5);
}
void draw()
{
&nbsp; background(100);
&nbsp; text("3", 10+(frameCount % 30)*0.5, 20+(frameCount % 30)*3);
&nbsp; text("2", 45-(frameCount % 30)*2, 50+(frameCount % 30)*3);
&nbsp; text("1", 90-(frameCount % 30)*7, 60-(frameCount % 30)*5);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index38.html">Executar!</a></p>
<p style="text-align: justify;">A aplicação da expressão (frameCount % width) ou (frameCount % height) retorna, respectivamente, um intervalo de repetição entre zero e a largura da tela e entre zero e a altura da tela. Esta expressão é útil para criar a ilusão que um objeto ao chegar em um limite da tela retorna à posição original. No caso da velocidade do objeto ser de valor constante igual a 1 frame por segundo, a expressão deve ser (frameCount % width) para uma repetição no eixo x e (frameCount % height) para uma repetição no eixo y.&nbsp; Se a velocidade for diferente, o valor de velocidade deve dividir a largura ou altura, conforme exemplo abaixo:</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento10.png"><img class="alignnone size-full wp-image-379" title="deslocamento10" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento10.png" alt="deslocamento10" width="487" height="403" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(100, 300);
}
void draw()
{
&nbsp; background(0);
&nbsp; ellipse(0,
&nbsp; (frameCount % height), 10, 10);
&nbsp; // Velocidade: 2 px/frame
&nbsp; ellipse(width/4,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2*(frameCount % (height/2)), 10, 10);
&nbsp; // Velocidade: 3 px/frame
&nbsp; ellipse(width/2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3*(frameCount % (height/3)), 10, 10);
&nbsp; // Velocidade: 4 px/frame
&nbsp; ellipse(3*width/4,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4*(frameCount % (height/4)), 10, 10);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index39.html">Executar!</a></p>
<p style="text-align: justify;">Desta forma, o operador &#8220;/&#8221;, ou seja, a divisão, é útil também na criação de funções que aumentam (ou diminuem) conforme a passagem do tempo. No programa seguinte, observa-se a evolução do gráfico de uma função conforme a aplicação de diferentes fatores de divisão. Salianta-se que ao invés da divisão, o mesmo efeito poderia ser conseguido através da multiplicação. Por exemplo, o gráfico de (frameCount/2) é o mesmo de (frameCount * 0.5). A divisão, porém, deixa mais claro ao leitor do código o objetivo do programador. No caso de (frameCount/2), por exemplo, o objetivo é obter uma função com a metade da velocidade imposta por frameCount.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento11.png"><img class="alignnone size-full wp-image-385" title="deslocamento11" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento11.png" alt="deslocamento11" width="587" height="490" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 15));
&nbsp; frameRate(10);
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(0);
&nbsp; point(frameCount,
&nbsp; frameCount);
&nbsp; stroke(255, 0, 0);
&nbsp; point(frameCount,
&nbsp; frameCount / 2);
&nbsp; stroke(0, 255, 0);
&nbsp; point(frameCount,
&nbsp; frameCount / 3);
&nbsp; // Exibe os dados
&nbsp; noStroke();
&nbsp; fill(255);
&nbsp; rect(0, height/2, 400, 100);
&nbsp; fill(0);
&nbsp; text("frameCount&nbsp; = "&nbsp;&nbsp;&nbsp; + frameCount, 0, height - 45);
&nbsp; fill(255,0,0);
&nbsp; text("frameCount / 2 = " + (frameCount / 2), 0, height - 30);
&nbsp; fill(0,255,0);
&nbsp; text("frameCount / 3 = " + (frameCount / 3), 0, height - 15);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index40.html">Executar!</a></p>
<p style="text-align: justify;">Uma funcionalidade interessante é obtida através da combinação entre as expressões (frameCount % width) e (frameCount / width): percorrer os pixels da tela. A chamada à point(frameCount % width, frameCount / width), marca cada um dos pontos da tela da esquerda para a direita e de cima para baixo.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento12.png"><img class="alignnone size-full wp-image-390" title="deslocamento12" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento12.png" alt="deslocamento12" width="523" height="364" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(256, 256);
&nbsp; textFont(createFont("Arial", 20));
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(frameCount % 256);
&nbsp; point(frameCount % width,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frameCount / width);

&nbsp; // Exibe os dados
&nbsp; fill(255);
&nbsp; rect(0, width-60, width, 60);
&nbsp; fill(0);
&nbsp; text("frameCount % width = " + (frameCount % width), 0, height - 40);
&nbsp; text("frameCount / width = " + (frameCount / width), 0, height - 20);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index41.html">Executar!</a></p>
<p style="text-align: justify;">Esta abordagem de desenho, embora permita compreender o instante de desenho de cada pixel é muito lenta para situações reais pois exige o redesenho de cada frame. Em um capítulo posterior, verificaremos como repetir o comando de desenho diversas vezes sem precisar redesenhar a tela utilizando a <a href="http://www.processing.org/reference/for.html">instrução for</a>.</p>
<p style="text-align: justify;">Variações nesta abordagem podem ser feitas, por exemplo, para gerar o desenho de um grid.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento13.png"><img class="alignnone size-full wp-image-395" title="deslocamento13" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/deslocamento13.png" alt="deslocamento13" width="638" height="452" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(300, 300);
&nbsp; textFont(createFont("Arial", 15));
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(128);
&nbsp; fill(frameCount % 256);
&nbsp; rect((frameCount % (width/10)) * 10,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (frameCount / (width/10)) * 10, 10, 10);

&nbsp; // Exibe os dados
&nbsp; fill(255);
&nbsp; rect(0, width-100, width, 100);
&nbsp; fill(0);
&nbsp; text("(frameCount % (width /10)) * 10 = " +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (frameCount % (width /10)) * 10 , 0, height - 80);
&nbsp; text("(frameCount / (width /10)) * 10 = " +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (frameCount / (width /10)) * 10, 0, height - 60);
&nbsp; text("frameCount % width = " + (frameCount % width), 0, height - 40);
&nbsp; text("frameCount / width = " + (frameCount / width), 0, height - 20);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index42.html">Executar!</a></p>
<blockquote>
<p style="text-align: justify;">&nbsp;</p>
</blockquote>
<p style="text-align: justify;">A variável frameCount começa a se mostrar insuficiente para resolver todos os problemas: observe que a primeira posição do grid não é desenhada.&nbsp; Se diminuíssemos de 1 o valor de frameCount, esta situação estaria resolvida. Aumentaria, porém a complexidade de escrever e compreender esta expressão. No próximo capítulo, veremos como resolver o mesmo problema com uma expressão menos complexa através da definição de variáveis.</p>
<blockquote>
<p style="text-align: justify;"><em><strong>Exercício de Fixação 02 &#8211; Programa</strong></em></p>
<p style="text-align: justify;"><em><strong>Faça um programa que simule o comportamento da formação de uma palavra de 4 letras que devem se encontrar no centro da tela e formar uma palavra. Após o encontro, a animação recomeça.</strong></em></p>
<p style="text-align: justify;"><em><strong>Exercício de Fixação 03 &#8211; Grid</strong></em></p>
<p style="text-align: justify;"><em><strong>Faça um programa que construa um grid quadrado de 5 x 5 casas. Cada casa deve ser construída em um frame.</strong></em></p>
</blockquote>
<p style="text-align: justify;">Definiu-se nesta seção, os operadores aritméticos. Nosso próximo passo será a utilização de operadores que além de modificarem expressões também serão úteis na tomada de decisões.</p>
<h2 style="text-align: justify;">Expressões relacionais</h2>
<p style="text-align: justify;">Uma expressão relacional é obtida quando dois valores são comparados. Esta comparação tem como resultado um valor lógico. Tal valor pode ser o valor verdadeiro (true) ou o falso (false). O Processing apresenta seis operadores relacionais:</p>
<ul>
<li><a href="http://www.processing.org/reference/equality.html">==</a>: Operador de igualdade. Devolve verdadeiro quando os dois operandos são iguais;</li>
<li><a href="http://www.processing.org/reference/inequality.html">!=</a>: Operador de diferença. Devolve verdadeiro quando os dois operandos são diferentes;</li>
<li><a href="http://www.processing.org/reference/greaterthan.html">&gt;</a>: Operador de maior. Devolve verdadeiro quando o operando da esquerda é maior que o da direita;</li>
<li><a href="http://www.processing.org/reference/lessthan.html">&lt;</a>: Operador de menor. Devolve verdadeiro quando o operando da esquerda é menor que o da direita;</li>
<li><a href="http://www.processing.org/reference/greaterthanorequalto.html">&gt;=</a>: Operador maior ou igual. Devolve verdadeiro quando o operando da esquerda é maior ou igual que o da direita.</li>
<li><a href="http://www.processing.org/reference/lessthanorequalto.html">&lt;=</a>: Operador menor ou igual. Devolve verdadeiro quando o operando da esquerda é menor ou igual que o da direita.</li>
</ul>
<p>A avaliação destes operadores é bastante intuitiva. Observe as expressões abaixo:</p>
<ul>
<li>3==3 é igual a verdadeiro;</li>
<li>3==4 é igual a falso;</li>
<li>30!=40 é igual a verdadeiro;</li>
<li>40!=40 é igual a falso;</li>
<li>10&gt;5 é igual a verdadeiro;</li>
<li>10&lt;5 é igual a falso;</li>
<li>10&gt;10 é igual a falso;</li>
<li>10&gt;=10 é igual a true.</li>
</ul>
<p>Para exibir o valor destas expressões, pode-se usar a função println:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais1.png"><img class="alignnone size-full wp-image-398" title="relacionais1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais1.png" alt="relacionais1" width="283" height="614" /></a></p>
<p>println(3==3);<br />
println(3==4);<br />
println(30!=40);<br />
println(40!=40);<br />
println(10&gt;5);<br />
println(10&lt;5);<br />
println(10&gt;10);<br />
println(10&gt;=10);</p>
<p>Observe que o operador == não deve ser substituído por apenas um sinal de igual. Apenas um sinal de igual é usado para a operação de atribuição, que veremos no capítulo sobre criação de variáveis.</p>
<p>Os valores true e false serão úteis na tomada de decisões, mas também podem ser usados como se fossem números.</p>
<p>Assim, para a conversão de um valor true para 1 e do valor false para zero é necessária a aplicação da<a href="http://www.processing.org/reference/int_.html"> função int</a>:</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais2.png"><img class="alignnone size-full wp-image-399" title="relacionais2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais2.png" alt="relacionais2" width="164" height="611" /></a></p>
<p>println(int(3==3));<br />
println(int(3==4));<br />
println(int(30!=40));<br />
println(int(40!=40));<br />
println(int(10&gt;5));<br />
println(int(10&lt;5));<br />
println(int(10&gt;10));<br />
println(int(10&gt;=10));</p>
<p><strong>Importante! Este tipo de conversão será utilizado nos próximos exemplos para que possamos compreender como funcionam os operadores relacionais. Em situações reais, perceberemos posteriormente, que tal conversão deve ser evitada para que nosso código seja o mais claro possível</strong>.</p>
<p>No exemplo abaixo, a cor de fundo da tela é controlada conforme a posição em x do mouse. Se o mouse estiver antes da metade da tela, a cor de fundo é o branco (cor 255), pois 255 multiplicado por 1 é igual a 255. Caso contrário, a cor obtida é o preto (cor zero), pois 255 multiplicado por zero é igual a zero.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais3.png"><img class="alignnone size-full wp-image-404" title="relacionais3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais3.png" alt="relacionais3" width="304" height="257" /></a></p>
<p><pre name="code" class="java">
void draw()
{
&nbsp; background(255 * int(mouseX < width/2));
&nbsp; stroke(128);
&nbsp; line(width/2, 0, width/2, height);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index43.html">Executar!</a></p>
<p>Os operadores relacionais também podem ser usados para cortar um valor após um certo limite. Abaixo, quando o valor de mouseX passa da metade da tela, o valor de mouseX multiplicado por int(mouseX&lt;width/2) passa a ser zero.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais4.png"><img class="alignnone size-full wp-image-409" title="relacionais4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais4.png" alt="relacionais4" width="344" height="258" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; rectMode(CENTER);
}
void draw()
{
&nbsp; background(0);
&nbsp; fill(128);
&nbsp; rect(0, 0, width, height);
&nbsp; fill(255);
&nbsp; rect(mouseX&nbsp;&nbsp; * int(mouseX&lt;width/2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mouseY&nbsp;&nbsp; * int(mouseY&lt;height/2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width/4&nbsp; * int(mouseX&lt;width/2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; height/4 * int(mouseX&lt;height/2));
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index44.html">Executar!</a></p>
<p>No exemplo abaixo, cada tecla de zero a cinco é associada à troca da cor de fundo de um retângulo diferente, como se estivessemos usando um teclado. Observe que quando a tecla é pressionada o valor é mantido até que outra tecla seja pressionada.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais5.png"><img class="alignnone size-full wp-image-411" title="relacionais5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais5.png" alt="relacionais5" width="413" height="244" /></a></p>
<p><pre name="code" class="java">
void draw()
{
&nbsp; background(128);
&nbsp; fill( 255 * int(key=='1') );
&nbsp; rect(0, 0, width/5, height);
&nbsp; fill( 255 * int(key=='2') );
&nbsp; rect(width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='3') );
&nbsp; rect(2*width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='4') );
&nbsp; rect(3*width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='5') );
&nbsp; rect(4*width/5, 0, width/5, height);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index45.html">Executar!</a></p>
<p style="text-align: justify;">Diferente do exemplo anterior, a cor de fundo no próximo exemplo só é trocada enquanto a tecla estiver pressionada. Observa-se, portanto, que o operador * quando aplicado ao resultado de uma operação relacional exige que todos os lados da operação de multiplicação tenham valor verdadeiro para que o resultado da multiplicação não dê zero.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais6.png"><img class="alignnone size-full wp-image-420" title="relacionais6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais6.png" alt="relacionais6" width="484" height="240" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void draw()
{
&nbsp; background(128);
&nbsp; fill( 255 * int(key=='1') * int(keyPressed));
&nbsp; rect(0, 0, width/5, height);
&nbsp; fill( 255 * int(key=='2') * int(keyPressed));
&nbsp; rect(width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='3') * int(keyPressed));
&nbsp; rect(2*width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='4') * int(keyPressed));
&nbsp; rect(3*width/5, 0, width/5, height);
&nbsp; fill( 255 * int(key=='5') * int(keyPressed));
&nbsp; rect(4*width/5, 0, width/5, height);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index46.html">Executar!</a></p>
<p style="text-align: justify;">Usando estratégia semelhante à do exercício anterior, é possível criar uma ferramenta de desenho que mistura a interação com o mouse e teclado. No exemplo abaixo, a cor do pincel é escolhida a partir da tecla pressionada. O operador &#8216;+&#8217; separando as operações de multiplicação, faz com que somente com uma condição verdadeira a cor seja escolhida.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais7.png"><img class="alignnone size-full wp-image-421" title="relacionais7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/relacionais7.png" alt="relacionais7" width="363" height="328" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; background(0);
&nbsp; strokeWeight(5);
}
void draw()
{
&nbsp; stroke( 255 * int(key=='1') * int(mousePressed) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200 * int(key=='2') * int(mousePressed) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150 * int(key=='3') * int(mousePressed) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100 * int(key=='4') * int(mousePressed));
&nbsp; point(mouseX, mouseY);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index47.html">Executar!</a></p>
<p style="text-align: justify;">Apesar de válida, a utilização dos operadores * e + em conjunto com os operadores relacionais deve ser evitada quando possível. Para combinar operadores relacionais, portanto, utilizaremos os operadores lógicos.</p>
<h2 style="text-align: justify;">Expressões lógicas</h2>
<p style="text-align: justify;">Operadores lógicos são úteis para combinar duas ou mais expressões relacionais e para inverter valores lógicos. O operador E, representado pelo <a href="http://www.processing.org/reference/logicalAND.html">sinal &amp;&amp;</a>, retorna o valor verdadeiro caso todos os operandos tenham valor verdadeiro. O operador OU, reprentado pelo <a href="http://www.processing.org/reference/logicalOR.html">sinal ||</a>, retorna o valor verdadeiro caso qualquer um dos operandos tenha valor verdadeiro. O operador NÃO, representado pelo <a href="http://www.processing.org/reference/logicalNOT.html">sinal ! </a>é um operador unário, ou seja, só pode ser aplicado em um operando. Neste caso, a aplicação do operador inverte o verdadeiro como falso e vice-versa.</p>
<p style="text-align: justify;">Na prática, todas as combinações possíveis para estes operadores são:</p>
<ul>
<li>true &amp;&amp; true é igual a true;</li>
<li>true &amp;&amp; false é igual a false;</li>
<li>false &amp;&amp; true é igual a false;</li>
<li>false &amp;&amp; false é igual a false;</li>
<li>true || true é igual a true;</li>
<li>true || false é igual a true;</li>
<li>false || true é igual a true;</li>
<li>false || false é igual a false;</li>
<li>!true é igual a false;</li>
<li>!false é igual a true.</li>
</ul>
<p>Em uma comparação com objetos do mundo real, o operador E funciona como se fosse uma combinação de duas válvulas em um mesmo cano. Apenas se as duas válvulas estiverem ligadas a água sai pelo cano e enche o pote. No programa abaixo, cada uma das válvulas é controlada por um operador lógico. A válvula da esquerda é controlada pelo teclado e a da direita pelo mouse. Só no caso de ambas as válvulas estiverem ligadas o cano deixa a água sair.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos1.png"><img class="alignnone size-full wp-image-430" title="logicos1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos1.png" alt="logicos1" width="471" height="481" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(200, 200);
&nbsp; textFont(createFont("Arial", 45));
&nbsp; textAlign(CENTER);
&nbsp; smooth();
}

void draw()
{
&nbsp; // Desenha o cano e as válvulas
&nbsp; fill(0);
&nbsp; rect(0, height/2, 2*width/3, 30);
&nbsp; // Desenha a válvula associada ao teclado
&nbsp; fill(255 * int(keyPressed));
&nbsp; rect(width/4, height/2-10, 10, 40);
&nbsp; // Desenha a válvula associada ao mouse
&nbsp; fill(255 * int(mousePressed));
&nbsp; rect(width/2, height/2-10, 10, 40);
&nbsp; // Desenha o pote
&nbsp; fill(255 * int(mousePressed && keyPressed));
&nbsp; rect(3*width/5, height-60, 60, 60);
&nbsp; text("E", width/2, height/3);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index48.html">Executar!</a></p>
<p>No caso do operador OU, temos dois canos diferentes. Assim, tanto no caso de uma válvula ou outra estarem abertas o pote será preenchido com água. Novamente, a válvula da esquerda é controlada pelo teclado e a da direita pelo mouse.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos2.png"><img class="alignnone size-full wp-image-431" title="logicos2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos2.png" alt="logicos2" width="486" height="492" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(200, 200);
&nbsp; textFont(createFont("Arial", 45));
&nbsp; textAlign(CENTER);
&nbsp; smooth();
}

void draw()
{
&nbsp; // Desenha o cano e as válvulas
&nbsp; fill(0);
&nbsp; rect(0, height/2, width/3, 30);
&nbsp; rect(width-width/3, height/2, width/3, 30);
&nbsp; // Desenha a válvula associada ao teclado
&nbsp; fill(255 * int(keyPressed));
&nbsp; rect(width/4, height/2-10, 10, 40);
&nbsp; // Desenha a válvula associada ao mouse
&nbsp; fill(255 * int(mousePressed));
&nbsp; rect(width-width/4, height/2-10, 10, 40);
&nbsp; // Desenha o pote
&nbsp; fill(255 * int(mousePressed || keyPressed));
&nbsp; rect(width/5, height-60, 3*width/5, 60);
&nbsp; text("OU", width/2, height/3);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index49.html">Executar!</a></p>
<p>No exemplo abaixo, o retângulo faz o papel de um botão. Assim, o operador E é usado para determinar o intervalo no qual o mouse pode estar para que o botão seja habilitado. Desta forma, quando a posição em x do mouse estiver no intervalo entre 30 e 70 o retângulo é pintado na cor branca.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos3.png"><img class="alignnone size-full wp-image-441" title="logicos3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos3.png" alt="logicos3" width="402" height="281" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; textFont(createFont("Arial", 10));
&nbsp; textAlign(CENTER);
}

void draw()
{
&nbsp; background(128);
&nbsp; // Preenche quando mouseX estiver entre 30 e 70
&nbsp; fill( 255 * int((mouseX >= 30) && (mouseX <= 70)));
&nbsp; rect(30, 0, 40, 100);
&nbsp; // Mostra o valor de mouseX
&nbsp; text(mouseX, 10, 10);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index50.html">Executar!</a></p>
<p>No caso da habilitação do botão demandar do clique do mouse, somente se faz necessária a colocação de mais uma condição: mousePressed deve ser igual a true.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos4.png"><img class="alignnone size-full wp-image-446" title="logicos4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos4.png" alt="logicos4" width="406" height="301" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; textFont(createFont("Arial", 10));
&nbsp; textAlign(CENTER);
}

void draw()
{
&nbsp; background(128);
&nbsp; // Preenche quando mouseX estiver entre 30 e 70
&nbsp; // e o mouse for pressionado
&nbsp; fill( 255 * int((mouseX >= 30) &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mouseX <= 70) &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mousePressed));
&nbsp; rect(30, 0, 40, 100);
&nbsp; // Mostra o valor de mouseX
&nbsp; text(mouseX, 10, 10);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index51.html">Executar!</a></p>
<p>Nos exemplos anteriores considerou-se apenas a consideração de mouseX. Para a delimitação de um botão em uma área da tela, o valor de mouseY também deve ser considerado.</p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos5.png"><img class="alignnone size-full wp-image-451" title="logicos5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/logicos5.png" alt="logicos5" width="401" height="326" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; textFont(createFont("Arial", 10));
}

void draw()
{
&nbsp; background(128);
&nbsp; // Preenche quando mouseX estiver entre 30 e 70
&nbsp; // e quando mouseY estiver entre 10 e 40
&nbsp; fill( 255 * int((mouseX >= 30) &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mouseX <= 70) &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mouseY >= 10) &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mouseY <= 40)));
&nbsp; rect(30, 10, 40, 30);
&nbsp; // Mostra o valor de mouseX e mouseY
&nbsp; text("("+mouseX+","+mouseY+")", 10, 80);
}
</pre></p>
<p><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index52.html">Executar!</a></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><br />
</span></p>
<blockquote>
<p style="text-align: justify;"><strong><em><span style="color: #000000;">Exercício de Fixação 04 &#8211; Botões</span></em></strong></p>
<p style="text-align: justify;"><span style="color: #000000;"><strong><em>Seu objetivo agora é gerar uma interface com 4 botões retangulares. Ao clicar em qualquer um destes botões, o botão deve indicar que foi clicado.</em></strong><br />
</span></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #888888;"><br />
</span></span></p>
<p style="text-align: justify;">Os operadores E e OU também podem ser utilizados para na composição de funções com o objetivo de implementar movimentos mais complexos, formados por diferentes funções. Vamos codificar, inicialmente, o movimento de um objeto indo da esquerda para a direita e voltando ao ponto inicial.</p>
<p style="text-align: justify;">Observe, por exemplo, o movimento periódico do objeto abaixo. A expressão, (frameCount % width) conforme vimos anteriormente, é responsável por este movimento periódico.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos1.png"><img class="alignnone size-full wp-image-456" title="movimentologicos1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos1.png" alt="movimentologicos1" width="444" height="472" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 10));
&nbsp; fill(0);
}

void draw()
{
&nbsp; background(255);
&nbsp; rect(frameCount % width, 2*height/3, 20, 20);
&nbsp; text("frameCount % width = " + frameCount % width, 20, 20);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index53.html">Executar!</a></p>
<p style="text-align: justify;">Se fosse necessário o movimento contrário, ou seja, da esquerda para a direita, a expressão (width-frameCount % width) seria aplicável.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos2.png"><img class="alignnone size-full wp-image-461" title="movimentologicos2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos2.png" alt="movimentologicos2" width="575" height="463" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 10));
&nbsp; fill(0);
}

void draw()
{
&nbsp; background(255);
&nbsp; rect(width - frameCount % width, 2*height/3, 20, 20);
&nbsp; text("width - frameCount % width = " + (width - frameCount % width), 20, 20);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index54.html">Executar!</a></p>
<p style="text-align: justify;">Plotando as duas funções de movimento em um mesmo gráfico, conforme o programa abaixo, observa-se que para a implementação de, por exemplo, um movimento periódico do objeto indo e voltando na tela poderíamos misturar as duas funções. Constata-se que a função em vermelho poderia ser usada para o início do movimento e a função em verde para a segunda parte do movimento, ou seja, para o retorno do objeto.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos3.png"><img class="alignnone size-full wp-image-466" title="movimentologicos3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos3.png" alt="movimentologicos3" width="434" height="716" /></a></p>
<p style="text-align: justify;"><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 15));
&nbsp; frameRate(20);
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(0);
&nbsp; point(frameCount, frameCount);
&nbsp; stroke(255, 0, 0);
&nbsp; point(frameCount, frameCount % 100);
&nbsp; stroke(0, 255, 0);
&nbsp; point(frameCount, 100 - frameCount % 100);
&nbsp; // Exibe os dados
&nbsp; noStroke();
&nbsp; fill(255);
&nbsp; rect(0, height/2, 400, 100);
&nbsp; fill(0);
&nbsp; text("frameCount&nbsp; = "&nbsp;&nbsp;&nbsp; + frameCount, 0, height - 45);
&nbsp; fill(255,0,0);
&nbsp; text("frameCount % 100 = " + frameCount % 100,
&nbsp; 0, height - 30);
&nbsp; fill(0,255,0);
&nbsp; text("100 - frameCount % 100 = " + (100 - frameCount % 100),
&nbsp; 0, height - 15);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index55.html">Executar!</a></p>
<p style="text-align: justify;">A combinação entre as duas expressões pode ser feita através da multiplicação de cada uma delas pelo intervalo que ela deve ser válida.</p>
<p style="text-align: justify;">Ou seja: a expressão (frameCount % 100) no exemplo acima deve ser utilizada entre zero e 100 e a expressão (100-frameCount %100) é válida entre 100 e 200.</p>
<p style="text-align: justify;">O intervalo entre 0 e 100 é representado por: (frameCount &lt; 100) e (frameCount&gt;=100 &amp;&amp; frameCount&lt;200) representa o intervalo seguinte.</p>
<p style="text-align: justify;">A função final de deslocamento será:</p>
<blockquote>
<pre style="text-align: justify;">(frameCount % 100) * int(frameCount&lt;100) +</pre>
<pre style="text-align: justify;">(100-frameCount%100) * int(frameCount&gt;=100 &amp;&amp; frameCount&lt;200)</pre>
</blockquote>
<p style="text-align: justify;">No resultado abaixo a função de deslocamento é representada em azul.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos4.png"><img class="alignnone size-full wp-image-471" title="movimentologicos4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos4.png" alt="movimentologicos4" width="585" height="848" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 15));
&nbsp; frameRate(20);
&nbsp; strokeWeight(5);
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(0);
&nbsp; point(frameCount, frameCount);
&nbsp; stroke(255, 0, 0);
&nbsp; point(frameCount, frameCount % 100);
&nbsp; stroke(0, 255, 0);
&nbsp; point(frameCount, 100 - frameCount % 100);
&nbsp; stroke(0, 0, 255);
&nbsp; point(frameCount, (frameCount % 100) * int(frameCount<100) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (100-frameCount % 100) * int(frameCount>=100 && frameCount<200)
&nbsp;&nbsp;&nbsp; );

&nbsp; // Exibe os dados
&nbsp; noStroke();
&nbsp; fill(255);
&nbsp; rect(0, height/2, 400, 100);
&nbsp; fill(0);
&nbsp; text("frameCount&nbsp; = "&nbsp;&nbsp;&nbsp; + frameCount, 0, height - 45);
&nbsp; fill(255,0,0);
&nbsp; text("frameCount % 100 = " + frameCount % 100,
&nbsp; 0, height - 30);
&nbsp; fill(0,255,0);
&nbsp; text("100 - frameCount % 100 = " + (100 - frameCount % 100),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, height - 15);
&nbsp; fill(0,0,255);
&nbsp; text("100 - frameCount % 100 = " + (100 - frameCount % 100),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, height - 15);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index56.html">Executar!</a></p>
<p style="text-align: justify;">Aplicando a fórmula no movimento do objeto:</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos5.png"><img class="alignnone size-full wp-image-472" title="movimentologicos5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos5.png" alt="movimentologicos5" width="585" height="536" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 10));
&nbsp; fill(0);
}

void draw()
{
&nbsp; background(255);
&nbsp; // Função de movimento
&nbsp; rect( (frameCount % width) * int(frameCount&lt;width) +
&nbsp;&nbsp;&nbsp; (width-frameCount % width) * int(frameCount>=width &&&nbsp; frameCount<2*width)
&nbsp;&nbsp;&nbsp; , 2*height/3, 20, 20);
&nbsp; text("frameCount % width = " + (frameCount % width), 20, 20);
&nbsp; text("width-frameCount % width = " + (width-frameCount % width), 20, 40);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index57.html">Executar!</a></p>
<p style="text-align: justify;">Em resumo, a composição de funções de movimento pode ser feita através da soma das expressões que geram cada intervalo desejado:</p>
<blockquote>
<pre style="text-align: justify;">FUNÇÃO 1 * int(CONDIÇÃO QUE GERA O INTERVALO 1) +</pre>
<pre style="text-align: justify;">FUNÇÃO 2 * int(CONDIÇÃO QUE GERA O INTERVALO 2) +</pre>
<pre>...</pre>
</blockquote>
<p style="text-align: justify;">&nbsp;</p>
<blockquote>
<p style="text-align: justify;"><strong><em>Exercício de Fixação 5 &#8211; Funções</em></strong></p>
<p style="text-align: justify;"><strong><em>Crie um programa que simule o comportamento a seguir:</em></strong></p>
<p style="text-align: justify;"><strong><em>Entre o frame 0 e 10: Posição inicial em x igual a 10 e velocidade 3.</em></strong></p>
<p style="text-align: justify;"><strong><em>Do frame 10 em diante: Posição 40.</em></strong></p>
<p style="text-align: justify;"><strong><em>Posição em y sempre de height/2<br />
</em></strong></p>
<p style="text-align: justify;"><strong><em>Ver <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index63.html">exemplo</a>.</em></strong></p>
</blockquote>
<p style="text-align: justify;">No exemplo a seguir, o objetivo será deixar o próprio intervalo periódico. Ou seja, o objeto vai ficar oscilando entre duas posições.</p>
<p style="text-align: justify;"><strong>Importante: sem a criação de variáveis auxiliares o código a seguir será de difícil compreensão! Faça a análise do código com calma, mas não se preocupe, voltaremos futuramente a ele!</strong></p>
<p style="text-align: justify;">O intervalo desejado pode ser implementado através das condições:</p>
<p style="text-align: justify;">frameCount % (width*2) &lt; width</p>
<p style="text-align: justify;">e</p>
<p style="text-align: justify;">frameCount % (width*2) &gt;= width</p>
<p style="text-align: justify;">A primeira condição é habilitada de 0 até width. A segunda fica com valor verdadeiro de width em diante. (frameCount % (width *2)) restringe o intervalo de frameCount de zero ao dobro de width.</p>
<p style="text-align: justify;">Observe o desenho da função obtida em azul para uma largura de 100.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos6.png"><img class="alignnone size-full wp-image-478" title="movimentologicos6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos6.png" alt="movimentologicos6" width="507" height="781" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 15));
&nbsp; frameRate(20);
&nbsp; strokeWeight(5);
}
void draw()
{
&nbsp; // Exibe os pontos
&nbsp; stroke(0);
&nbsp; point(frameCount, frameCount);
&nbsp; stroke(255, 0, 0);
&nbsp; point(frameCount, frameCount % 100);
&nbsp; stroke(0, 255, 0);
&nbsp; point(frameCount, 100 - frameCount % 100);
&nbsp; stroke(0, 0, 255);
&nbsp; point(frameCount, (frameCount % 100)&nbsp; * int(frameCount % 200 < 100 ) +
&nbsp;&nbsp;&nbsp; (100-frameCount % 100) * int(frameCount % 200 >= 100)
&nbsp;&nbsp;&nbsp; );

&nbsp; // Exibe os dados
&nbsp; noStroke();
&nbsp; fill(255);
&nbsp; rect(0, height/2, 400, 100);
&nbsp; fill(0);
&nbsp; text("frameCount&nbsp; = "&nbsp;&nbsp;&nbsp; + frameCount, 0, height - 45);
&nbsp; fill(255,0,0);
&nbsp; text("frameCount % 100 = " + frameCount % 100,
&nbsp; 0, height - 30);
&nbsp; fill(0,255,0);
&nbsp; text("100 - frameCount % 100 = " + (100 - frameCount % 100),
&nbsp; 0, height - 15);
&nbsp; fill(0,0,255);
&nbsp; text("combinação = " + (100 - frameCount % 100),
&nbsp; 0, height );
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index58.html">Executar!</a></p>
<p style="text-align: justify;">Segue o resultado final, com o objeto movimentando-se do início ao fim e voltando:</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos7.png"><img class="alignnone size-full wp-image-483" title="movimentologicos7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos7.png" alt="movimentologicos7" width="545" height="610" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(400, 200);
&nbsp; textFont(createFont("Arial", 10));
&nbsp; fill(0);
}

void draw()
{
&nbsp; background(255);
&nbsp; // Função de movimento
&nbsp; rect( (frameCount % width) * int(frameCount % (width*2) < width ) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (width-frameCount % width) * int(frameCount % (width*2) >= width)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , 2*height/3, 20, 20);

&nbsp; text("frameCount % width = " + (frameCount % width), 20, 20);
&nbsp; text("width-frameCount % width = " + (width-frameCount % width), 20, 40);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index59.html">Executar!</a></p>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos8.png"><img class="alignnone size-full wp-image-488" title="movimentologicos8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/movimentologicos8.png" alt="movimentologicos8" width="610" height="648" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(350, 230);
&nbsp; textFont(createFont("Arial", 10));
&nbsp; fill(0);
}

void draw()
{
&nbsp; background(255);
&nbsp; // Função de movimento
&nbsp; rect( (frameCount % width) * int(frameCount % (width*2) < width ) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (width-frameCount % width) * int(frameCount % (width*2) >= width),&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (frameCount % height) * int(frameCount % (height*2) < height ) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (height-frameCount % height) * int(frameCount % (height*2) >= height) , 20, 20);

&nbsp; text("frameCount % width = " + (frameCount % width), 20, 20);
&nbsp; text("width-frameCount % width = " + (width-frameCount % width), 20, 40);
&nbsp; text("frameCount % height = " + (frameCount % height), 20, 60);
&nbsp; text("width-frameCount % height = " + (width-frameCount % height), 20, 80);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index60.html">Executar!</a></p>
<p style="text-align: justify;">Em mais um exemplo, também pode-se aplicar operações lógicas com as variáveis de teclado. No exemplo abaixo, as setas LEFT e RIGHT podem controlar a posição de um objeto.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/teclado1.png"><img class="alignnone size-full wp-image-494" title="teclado1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/teclado1.png" alt="teclado1" width="491" height="267" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(300,100);
&nbsp; rectMode(CENTER);
}

void draw()
{
&nbsp; background(255);
&nbsp; rect( width/3&nbsp;&nbsp;&nbsp;&nbsp; * int(keyCode==LEFT) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2*width/3&nbsp;&nbsp; * int(keyCode==RIGHT) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width/2&nbsp;&nbsp;&nbsp;&nbsp; * int(keyCode!=LEFT &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyCode!=RIGHT)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , height/2, 20, 20);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index61.html">Executar!</a></p>
<p style="text-align: justify;">Por fim, no exemplo a seguir a variável keyPressed é utilizada para que apenas quando o usuário esteja com a tecla pressionada o objeto seja deslocado.</p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/teclado2.png"><img class="alignnone size-full wp-image-499" title="teclado2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/teclado2.png" alt="teclado2" width="545" height="286" /></a></p>
<p><pre name="code" class="java">
void setup()
{
&nbsp; size(300,100);
&nbsp; rectMode(CENTER);
}

void draw()
{
&nbsp; background(255);
&nbsp; rect( width/3 * int(keyPressed &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyCode==LEFT) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2*width/3&nbsp;&nbsp; * int(keyPressed &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyCode==RIGHT&nbsp; ) +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width/2&nbsp;&nbsp;&nbsp;&nbsp; * int(!keyPressed || (keyCode!=LEFT &&
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyCode!=RIGHT))
&nbsp;&nbsp;&nbsp; , height/2, 20, 20);
}
</pre></p>
<p style="text-align: justify;"><a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index62.html">Executar!</a></p>
<h2>Para saber mais</h2>
<p><span style="color: #000000;">Reas, Casey. Fry, Ben. Processing: A Programming Handbook for Visual Designers and Artists. </span></p>
<p><span style="color: #000000;">Páginas 223 a 227 &#8211; teclado</span></p>
<p><span style="color: #000000;">43 a 50 &#8211; aritmética e funções</span></p>
<p><span style="color: #000000;">51 a 59 &#8211; decisão.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/17/aula-03-expressoes-aritmeticas-relacionais-e-logicas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 02 &#8211; Variáveis do Processing e o Modo Contínuo</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/10/aula-02-variaveis-do-processing-e-o-modo-continuo/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/10/aula-02-variaveis-do-processing-e-o-modo-continuo/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 19:36:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[aula02]]></category>
		<category><![CDATA[createFont]]></category>
		<category><![CDATA[draw]]></category>
		<category><![CDATA[focused]]></category>
		<category><![CDATA[frameCount]]></category>
		<category><![CDATA[frameRate]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[int]]></category>
		<category><![CDATA[key]]></category>
		<category><![CDATA[keyCode]]></category>
		<category><![CDATA[keyPressed]]></category>
		<category><![CDATA[modo contínuo]]></category>
		<category><![CDATA[mouseButton]]></category>
		<category><![CDATA[mousePressed]]></category>
		<category><![CDATA[mouseX]]></category>
		<category><![CDATA[mouseY]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[PFont]]></category>
		<category><![CDATA[PFont.list]]></category>
		<category><![CDATA[pmouseX]]></category>
		<category><![CDATA[pmouseY]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[println]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[screen.height]]></category>
		<category><![CDATA[screen.width]]></category>
		<category><![CDATA[setup]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[textFont]]></category>
		<category><![CDATA[variáveis]]></category>
		<category><![CDATA[width]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=110</guid>
		<description><![CDATA[Objetivo
No capítulo anterior, o Processing foi tratado como uma simples ferramenta de desenho. Entretanto, o Processing é uma ambiente bastante completo de programação em geral permitindo a manipulação de estruturas em memória através de suas instruções. O objetivo principal agora é começarmos a pensar sobre as diferentes maneiras de representar essas estruturas através de variáveis.
Além [...]]]></description>
			<content:encoded><![CDATA[<h2>Objetivo</h2>
<p>No <a href="http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/">capítulo anterior</a>, o Processing foi tratado como uma simples ferramenta de desenho. Entretanto, o Processing é uma ambiente bastante completo de programação em geral permitindo a manipulação de estruturas em memória através de suas instruções. O objetivo principal agora é começarmos a pensar sobre as diferentes maneiras de representar essas estruturas através de variáveis.</p>
<p>Além disso, os tópicos de programação gráfica deste capítulo tratam da utilização do modo contínuo do Processing. Em tal modo de execução, o Processing deixa de ser uma ferramenta de desenho e passa a permitir a criação de animações. Por fim, durante este texto também é demonstrado o uso básico de&nbsp; fontes e utilização do posicionamento do mouse em nossos programas para ilustrar o uso das variáveis de mouse.</p>
<p><span id="more-110"></span></p>
<h2>Exemplos do capítulo</h2>
<p>Os exemplos mostrados neste capítulo estão disponíveis para <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/aula02vars.zip">download </a>(<a href="http://drop.io/ArquivosIp2009/asset/aula02vars-zip">mirror</a>).</p>
<h2>Sintaxe Introduzida (link para a documentação em português)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. <strong>Pule para o tópico “Uso de Variáveis” se for sua primeira leitura!</strong></p>
<ul>
<li>Variáveis do Processing:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/width.html">width</a>: armazena a largura da tela de visualização</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/height.html">height</a>: armazena a altura da tela de visualização</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/focused.html">focused</a>: valor lógico que indica se o usuário está com o foco na janela do programa executando;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/frameCount.html">frameCount</a>: no modo contínuo, é um número inteiro que contém o número de frames mostrados desde o início da execução do programa. Cada chamada ao método draw incrementa este valor;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/framerate.html">frameRate</a>: valor aproximado de taxa de atualização máxima de frames na execução do programa em modo contínuo;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/online.html">online</a>: valor lógico que representa se o programa está sendo executado dentro de uma página Web ou não;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/screen.html">screen.width</a>: largura da tela do computador em pixels;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/screen.html">screen.height</a>: altura da tela do computador em pixels;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/mouseButton.html">mouseButton</a>: indica qual dos botões do mouse foi pressionado (LEFT, CENTER ou RIGHT);</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/mousePressed.html">mousePressed</a>: valor lógico que indica se qualquer botão do mouse foi pressionado;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/mouseX.html">mouseX</a>: posição horizontal do mouse (eixo X) no frame atual;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/mouseY.html">mouseY</a>: posição vertical do mouse (eixo Y);</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/pmouseX.html">pmouseX</a>: posição horizontal do mouse (eixo X) no frame anterior;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/pmouseY.html">pmouseY</a>: posição vertical do mouse (eixo Y) no frame anterior;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/key.html">key</a>: contém o valor da mais recente tecla pressionada ou solta;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/keyCode.html">keyCode</a>: usada para detectar o pressionamento de teclas especiais como UP, DOWN, RIGHT e LEFT;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/keyPressed.html">keyPressed</a>: valor lógico que indica se qualquer tecla foi pressionada.</li>
</ul>
</li>
<li>Exibição de variáveis no modo console:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/print_.html">print</a>: envia texto para área de console do Processing;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/println_.html">println</a>: envia texto para área de console do Processing e pula uma linha;</li>
</ul>
</li>
<li>Tipografia básica:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/text_.html">text</a>: em um ponto qualquer, escreve um texto;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/createFont_.html">createFont</a>: dinamicamente converte uma fonte disponível no computador para uma fonte do Processing;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/textFont_.html">textFont</a>: seleciona a fonte atual;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/PFont_list_.html">PFont.list</a>: lista as fontes disponíveis.</li>
</ul>
</li>
<li>Operadores aritméticos:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/addition.html">+</a>: adição e concatenação;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/minus.html">-</a>: subtração;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/multiply.html">*</a>: multiplicação;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/divide.html">/</a>: divisão;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/modulo.html">%</a>: módulo (resto inteiro da divisão);</li>
</ul>
</li>
<li>Funções de conversão:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/int_.html">int</a>: converte para um número inteiro;</li>
</ul>
</li>
<li>Modo contínuo:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/setup_.html">setup</a>: função chamada quando inicia a execução do programa;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/draw_.html">draw</a>: chamada imediatamente após a execução do setup, repete-se continuamente;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/framerate_.html">frameRate</a>: define a taxa de atualização do programa em frames por segundo;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/framerate.html">frameRate</a>: valor aproximado de taxa de atualização máxima de frames na execução do programa em modo contínuo;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/frameCount.html">frameCount</a>: no modo contínuo, é um número inteiro que contém o número de frames mostrados desde o início da execução do programa. Cada chamada ao método draw incrementa este valor;</li>
</ul>
</li>
</ul>
<h2>Sintaxe Introduzida (link para a documentação em inglês)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. <strong>Pule para o tópico “Uso de Variáveis” se for sua primeira leitura!</strong></p>
<ul>
<li>Variáveis do Processing:
<ul>
<li><a href="http://www.processing.org/reference/width.html">width</a>: armazena a largura da tela de visualização</li>
<li><a href="http://www.processing.org/reference/height.html">height</a>: armazena a altura da tela de visualização</li>
<li><a href="http://www.processing.org/reference/focused.html">focused</a>: valor lógico que indica se o usuário está com o foco na janela do programa executando;</li>
<li><a href="http://www.processing.org/reference/frameCount.html">frameCount</a>: no modo contínuo, é um número inteiro que contém o número de frames mostrados desde o início da execução do programa. Cada chamada ao método draw incrementa este valor;</li>
<li><a href="http://www.processing.org/reference/frameRate.html">frameRate</a>: valor aproximado de taxa de atualização máxima de frames na execução do programa em modo contínuo;</li>
<li><a href="http://www.processing.org/reference/online.html">online</a>: valor lógico que representa se o programa está sendo executado dentro de uma página Web ou não;</li>
<li><a href="http://www.processing.org/reference/screen.html">screen.width</a>: largura da tela do computador em pixels;</li>
<li><a href="http://www.processing.org/reference/screen.html">screen.height</a>: altura da tela do computador em pixels;</li>
<li><a href="http://www.processing.org/reference/mouseButton.html">mouseButton</a>: indica qual dos botões do mouse foi pressionado (LEFT, CENTER ou RIGHT);</li>
<li><a href="http://www.processing.org/reference/mousePressed.html">mousePressed</a>: valor lógico que indica se qualquer botão do mouse foi pressionado;</li>
<li><a href="http://www.processing.org/reference/mouseX.html">mouseX</a>: posição horizontal do mouse (eixo X) no frame atual;</li>
<li><a href="http://www.processing.org/reference/mouseY.html">mouseY</a>: posição vertical do mouse (eixo Y);</li>
<li><a href="http://www.processing.org/reference/pmouseX.html">pmouseX</a>: posição horizontal do mouse (eixo X) no frame anterior;</li>
<li><a href="http://www.processing.org/reference/pmouseY.html">pmouseY</a>: posição vertical do mouse (eixo Y) no frame anterior;</li>
<li><a href="http://www.processing.org/reference/key.html">key</a>: contém o valor da mais recente tecla pressionada ou solta;</li>
<li><a href="http://www.processing.org/reference/keyCode.html">keyCode</a>: usada para detectar o pressionamento de teclas especiais como UP, DOWN, RIGHT e LEFT;</li>
<li><a href="http://www.processing.org/reference/keyPressed.html">keyPressed</a>: valor lógico que indica se qualquer tecla foi pressionada.</li>
</ul>
</li>
<li>Exibição de variáveis no modo console:
<ul>
<li><a href="http://www.processing.org/reference/print_.html">print</a>: envia texto para área de console do Processing;</li>
<li><a href="http://www.processing.org/reference/println_.html">println</a>: envia texto para área de console do Processing e pula uma linha;</li>
</ul>
</li>
<li>Tipografia básica:
<ul>
<li><a href="http://www.processing.org/reference/text_.html">text</a>: em um ponto qualquer, escreve um texto;</li>
<li><a href="http://www.processing.org/reference/createFont_.html">createFont</a>: dinamicamente converte uma fonte disponível no computador para uma fonte do Processing;</li>
<li><a href="http://www.processing.org/reference/textFont_.html">textFont</a>: seleciona a fonte atual;</li>
<li><a href="http://www.processing.org/reference/PFont_list_.html">PFont.list</a>: lista as fontes disponíveis;</li>
</ul>
</li>
<li>Operadores aritméticos:
<ul>
<li><a href="http://www.processing.org/reference/addition.html">+</a>: adição e concatenação;</li>
<li><a href="http://www.processing.org/reference/minus.html">-</a>: subtração;</li>
<li><a href="http://www.processing.org/reference/multiply.html">*</a>: multiplicação;</li>
<li><a href="http://www.processing.org/reference/divide.html">/</a>: divisão;</li>
<li><a href="http://www.processing.org/reference/modulo.html">%</a>: módulo (resto inteiro da divisão).</li>
</ul>
</li>
<li>Funções de conversão:
<ul>
<li><a href="http://www.processing.org/reference/int_.html">int</a>: converte para um número inteiro.</li>
</ul>
</li>
<li>Modo contínuo:
<ul>
<li><a href="http://www.processing.org/reference/setup_.html">setup</a>: função chamada quando inicia a execução do programa;</li>
<li><a href="http://www.processing.org/reference/draw_.html">draw</a>: chamada imediatamente após a execução do setup, repete-se continuamente;</li>
<li><a href="http://www.processing.org/reference/frameRate_.html">frameRate</a>: define a taxa de atualização do programa em frames por segundo;</li>
<li><a href="http://www.processing.org/reference/frameRate.html">frameRate</a>: valor aproximado de taxa de atualização máxima de frames na execução do programa em modo contínuo;</li>
<li><a href="http://www.processing.org/reference/frameCount.html">frameCount</a>: no modo contínuo, é um número inteiro que contém o número de frames mostrados desde o início da execução do programa. Cada chamada ao método draw incrementa este valor;</li>
</ul>
</li>
</ul>
<h2>Uso de Variáveis</h2>
<p>Anteriormente, verificou-se que o Processing trabalha com os tipos de dados: inteiro, ponto flutuante, caractere, string e lógico. Tais tipos de dados em nossos programas até agora foram representados de maneira constante. Por exemplo, no programa abaixo, que desenha duas linhas que dividem a tela, os valores 300, 200, 100, 0 e 200 não variam durante a execução do programa.</p>
<blockquote><p><img class="alignnone size-full wp-image-117" title="linhas" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/linhas.png" alt="linhas" width="295" height="194" /><br />
<pre name="code" class="java">
size(300, 200);
line(100, 0, 100, 200);
line(200, 0, 200, 200);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index.html">Executar!</a></p></blockquote>
<p>Tais valores são constantes. Assim, para criar um novo programa que divida novamente a tela em 3 partes será necessária a atualização de diversas constantes dentro do programa. Variáveis resolvem este problema e permitem que se organize o código e se crie dependência de parâmetros em relação a outros. Na memória do computador, variáveis são containers para armazenar informações, permitindo que um dado mude de valor e seja reutilizado diversas vezes em um programa. Na utilização do ambiente do Processing, existem variáveis que já existem durante a execução e variáveis que o programador pode definir.</p>
<h3>Variáveis do Processing</h3>
<p>O Processing já possui uma série de variáveis que são criadas no momento de execução do programa. Tais variáveis não precisam ser declaradas e são atualizadas de maneira indireta através da chamada à funções e à interação com o programa. A <a href="http://www.processing.org/reference/width.html">variável width</a> reflete a largura da janela do programa e a <a href="http://www.processing.org/reference/height.html">variável height</a> contém o valor da altura. A chamada à <a href="http://www.processing.org/reference/size_.html">função size</a> modifica o valor destas variáveis, mas, caso não seja chamada, tanto a largura quanto a altura ficarão com valor de 100 pixels.</p>
<p>A importância de usar estas funções está em deixar o seu programa facilmente adaptável caso haja uma modificação apenas no tamanho da janela. A seguir, por exemplo, cria-se um programa para dividir a tela em seis partes iguais.</p>
<blockquote><p><img class="alignnone size-full wp-image-119" title="linhas2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/linhas2.png" alt="linhas2" width="295" height="196" /><br />
<pre name="code" class="java">
size(300, 200);
line(100, 0, 100, 200);
line(200, 0, 200, 200);
line(0, 100, 300, 100);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index2.html">Executar!</a></p></blockquote>
<p>Caso o valor de size seja modificado, todas as demais constantes devem ser modificadas. Com o uso de width e height como parâmetros, valores diferentes de size mantem a mesma proporção.</p>
<blockquote><p><img class="alignnone size-full wp-image-120" title="linhas3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/linhas3.png" alt="linhas3" width="444" height="146" /><br />
<pre name="code" class="java">
size(450, 100);
line(width/3, 0, width/3, height);
line(width/3*2, 0, width/3*2, height);
line(0, height/2, width, height/2);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index3.html">Executar!</a></p></blockquote>
<p>Além do width e do height, algumas outras variáveis úteis que o Processing disponibiliza são:</p>
<ul>
<li><a href="http://www.processing.org/reference/focused.html">focused</a>: valor lógico que indica se o usuário está com o foco na janela do programa executando;</li>
<li><a href="http://www.processing.org/reference/frameCount.html">frameCount</a>: no modo contínuo, é um número inteiro que contém o número de frames mostrados desde o início da execução do programa. Cada chamada ao método draw incrementa este valor;</li>
<li><a href="http://www.processing.org/reference/frameRate.html">frameRate</a>: valor aproximado de taxa de atualização máxima de frames na execução do programa em modo contínuo;</li>
<li><a href="http://www.processing.org/reference/online.html">online</a>: valor lógico que representa se o programa está sendo executado dentro de uma página Web ou não;</li>
<li><a href="http://www.processing.org/reference/screen.html">screen.width</a>: largura da tela do computador em pixels;</li>
<li><a href="http://www.processing.org/reference/screen.html">screen.height</a>: altura da tela do computador em pixels;</li>
<li><a href="http://www.processing.org/reference/mouseButton.html">mouseButton</a>: indica qual dos botões do mouse foi pressionado (LEFT, CENTER ou RIGHT);</li>
<li><a href="http://www.processing.org/reference/mousePressed.html">mousePressed</a>: valor lógico que indica se qualquer botão do mouse foi pressionado;</li>
<li><a href="http://www.processing.org/reference/mouseX.html">mouseX</a>: posição horizontal do mouse (eixo X) no frame atual;</li>
<li><a href="http://www.processing.org/reference/mouseY.html">mouseY</a>: posição vertical do mouse (eixo Y);</li>
<li><a href="http://www.processing.org/reference/pmouseX.html">pmouseX</a>: posição horizontal do mouse (eixo X) no frame anterior;</li>
<li><a href="http://www.processing.org/reference/pmouseY.html">pmouseY</a>: posição vertical do mouse (eixo Y) no frame anterior;</li>
<li><a href="http://www.processing.org/reference/key.html">key</a>: contém o valor da mais recente tecla pressionada ou solta;</li>
<li><a href="http://www.processing.org/reference/keyCode.html">keyCode</a>: usada para detectar o pressionamento de teclas especiais como UP, DOWN, RIGHT e LEFT;</li>
<li><a href="http://www.processing.org/reference/keyPressed.html">keyPressed</a>: valor lógico que indica se qualquer tecla foi pressionada.</li>
</ul>
<p>Neste capítulo, ilustraremos o uso das variáveis de mouse e de controle do modo contínuo.</p>
<h3>Exibição de variáveis</h3>
<p>Para exibir o valor de uma variável em um instante pode-se usar as <a href="http://www.processing.org/reference/print_.html">funções print </a>e <a href="http://www.processing.org/reference/println_.html">println</a>. Tais funções exibem informações na área de texto denominada console do Processing. O usuário nunca terá acesso a estas informações, pois o console do Processing é de exclusivo acesso do programador. Entretanto, muitas vezes, quando for necessária a depuração e correção de código com erro, as funções print e println permitirão ao programador a verificação dos valores de cada variável no momento desejado. No exemplo abaixo, a função println mostra os valores das expressões que usam as variáveis width e height.</p>
<blockquote><p><img class="alignnone size-full wp-image-122" title="depuracao" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/depuracao.png" alt="depuracao" width="599" height="596" /><br />
<pre name="code" class="java">
size(200, 250);
line(width/3, 0, width/3, height);
line(width/3*2, 0, width/3*2, height);
line(0, height/2, width, height/2);
println("O valor de width/3 é: " + width/3);
println("O valor de height é: " + height);
println("O valor de width/3*2 é: " + width/3*2);
println("O valor de height/2 é: " + height/2);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index4.html">Executar!</a></p></blockquote>
<p>Se necessária a exibição de uma variável para o usuário pode-se usar a <a href="http://www.processing.org/reference/text_.html">função text</a> para mostrar o valor da variável na tela. A utilização da função text, porém, não pode ser feita sozinha. Por exemplo, o código abaixo, ao ser executado, indica o erro de falta de indicação de qual fonte deve ser utilizada: &#8220;Use textFont() before text()&#8221;.</p>
<blockquote><p><img class="alignnone size-full wp-image-123" title="erro_text" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erro_text.png" alt="erro_text" width="304" height="425" /><br />
<pre name="code" class="java">
size(300, 150);
text("O valor de width é:", 10, 50);
text(width, 10, 70);
</pre></p></blockquote>
<p>Desta forma, antes de qualquer chamada à função text é necessário configurar qual é a fonte que será utilizada para a exibição do texto através da <a href="http://www.processing.org/reference/textFont_.html">função textFont</a>. A fonte deve ser carregada na memória utilizando as funções <a href="http://www.processing.org/reference/loadFont_.html">loadFont </a>ou <a href="http://www.processing.org/reference/createFont_.html">createFont</a>. No próximo capítulo, trataremos dos detalhes para trabalhar tipografia no Processing. Por enquanto, o carregamento das fontes deve ser feito seguindo o exemplo, indicando o nome da fonte que deve ser gerada e o tamanho da fonte:</p>
<blockquote><p><pre name="code" class="java">
textFont(createFont("Fonte", TAMANHO DA LETRA));
</pre></p></blockquote>
<p>Nesse modelo, o seguinte código corrige o anterior:</p>
<blockquote><p><img class="alignnone size-full wp-image-124" title="mostratext" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/mostratext.png" alt="mostratext" width="293" height="141" /><br />
<pre name="code" class="java">
size(300, 150);
textFont(createFont("Arial", 20));
text("O valor de width é:", 10, 50);
text(width, 10, 70);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index5.html">Executar!</a></p></blockquote>
<p>A escolha da fonte Arial no fragmento acima se dá por esta fonte estar instalada no computador. Entretanto, computadores diferentes tem um conjunto diferentes de fontes disponíveis. Para verificar as fontes disponíveis em um computador selecione o menu Tools &gt; Create Font e veja uma lista das fontes disponíveis.</p>
<p><img class="alignnone size-full wp-image-125" title="fontesdisponiveis" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/fontesdisponiveis.png" alt="fontesdisponiveis" width="359" height="467" /></p>
<p>Outra maneira de visualizar as fontes instaladas é a chamada ao comando a seguir. Neste caso, a lista de fontes é exibida no console do Processing:</p>
<blockquote><p><img class="alignnone size-full wp-image-126" title="fontlist" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/fontlist.png" alt="fontlist" width="416" height="442" /><br />
<pre name="code" class="java">
println(PFont.list());
</pre></p></blockquote>
<p>Observe que até agora apenas as variáveis width e height fazem sentido quando exibidas na tela. Por exemplo, o código seguinte exibe sempre o valor 0 mesmo quando o mouse é movido na execução do programa.</p>
<blockquote><p><img class="alignnone size-full wp-image-128" title="valormousex" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/valormousex.png" alt="valormousex" width="295" height="144" /><br />
<pre name="code" class="java">
size(300, 150);
textFont(createFont("Arial", 20));
text("O valor de mouseX é:", 10, 50);
text(mouseX, 10, 70);
text("Ué? Sempre zero...", 10, 90);
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index6.html">Executar!</a></p></blockquote>
<p>Este comportamento é normal e se deve ao fato que estamos trabalhando até agora com o modo básico do Processing, destinado apenas a desenhos básicos. Neste modo, o código do programa é executado apenas uma vez. Desta forma, a linha text(mouseX, 10, 70); é executada imediatamente na abertura do programa. Para que o valor da variável seja sempre atualizado na tela, será necessária a utilização do modo contínuo de execução do Processing.</p>
<h2>Modo contínuo de execução</h2>
<p>O modo contínuo de execução permite que o programador tenha controle do fluxo de execução do seu programa. Duas funções são utilizadas: a <a href="http://www.processing.org/reference/setup_.html">função setup</a>, utilizada de maneira opcional, é executada uma vez só durante o carregamento da página. A <a href="http://www.processing.org/reference/draw_.html">função draw</a>, por sua vez, é o coração do modo contínuo e indica o que deve se repetir constantemente.</p>
<h3>O que se repete: a função draw</h3>
<p>No modo contínuo de execução, todo o código que o programador deseja repetir indefinidamente deve ser colocado dentro de um bloco de texto determinado pela <a href="http://www.processing.org/reference/draw_.html">função draw</a>. Para criar um bloco draw, use a seguinte sintaxe:</p>
<blockquote><p><pre name="code" class="java">
void draw() {
// Coloque aqui o código que deve rodar indefinidamente
}
</pre></p></blockquote>
<p>O código dentro do draw entra em um processo chamado loop e só é interrompido quando o usuário fecha o programa ou clica no botão stop. No exemplo abaixo, a mensagem &#8220;Olá, Processing&#8221; é repetida até o fechamento do programa.</p>
<blockquote><p><img class="alignnone size-full wp-image-150" title="exemploolaprocessing" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploolaprocessing.png" alt="exemploolaprocessing" width="484" height="567" /><br />
<pre name="code" class="java">
void draw() {
println("Olá, Processing");
}
</pre></p></blockquote>
<p>É essencial entender que um programa só pode ter um bloco draw. No caso de repetição do método draw, o Processing mostra o erro: &#8220;Duplicate method draw int type &#8230;&#8221;.</p>
<blockquote><p><img class="alignnone size-full wp-image-151" title="erroduplodraw" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erroduplodraw.png" alt="erroduplodraw" width="485" height="567" /><br />
<pre name="code" class="java">
void draw()
{
println("Olá, Processing");
}
void draw()
{
println("Olá, Processing");
}
</pre></p></blockquote>
<h3>Controle da taxa de repetição</h3>
<p>Por padrão, a taxa de repetição de um bloco draw, também chamada de <a href="http://www.processing.org/reference/frameRate_.html">frameRate</a>, é de 60 frames por segundo (fps). Neste caso, a cada segundo, a função draw é chamada no máximo 60 vezes. O código abaixo exibe o valor de frameRate no console do Processing.</p>
<blockquote><p><img class="alignnone size-full wp-image-129" title="valorframerate" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/valorframerate.png" alt="valorframerate" width="411" height="441" /><br />
<pre name="code" class="java">
void draw()
{
println(frameRate);
}
</pre></p></blockquote>
<p>O valor do frameRate não é exato.&nbsp; Muitas vezes, um programa pode ser executado mais lentamente quando a máquina for lenta devido a algum processamento poderoso sendo realizado.&nbsp; Outra variável associada ao draw é a variável frameCount. Tal variável indica a quantidade de vezes que o método draw foi chamado desde o início do programa, ou seja, cada vez que o draw é executado o valor de frameCount aumenta em uma unidade.</p>
<blockquote><p><img class="alignnone size-full wp-image-130" title="framerateframecount" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/framerateframecount.png" alt="framerateframecount" width="413" height="482" /><br />
<pre name="code" class="java">
void draw()
{
print("O valor de frameRate: ");
println(frameRate);
print("O valor de frameCount: ");
println(frameCount);
}
</pre></p></blockquote>
<p>O valor do frameRate pode ser mudado com a função frameRate. A alteração do valor de frameRate para um valor baixo deixa a execução de um programa mais lenta. Quanto maior o valor de frameRate, mais rápida a taxa de atualização. No exemplo abaixo, o valor de frameRate é alterado para 3, ou seja, a função draw é chamada no máximo 3 vezes por segundo. Observe também que o texto desenhado se sobrepõe a cada chamada.</p>
<blockquote><p><img class="alignnone size-full wp-image-131" title="framerateframecounttext" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/framerateframecounttext.png" alt="framerateframecounttext" width="414" height="480" /><br />
<pre name="code" class="java">
void draw()
{
frameRate(3);
textFont(createFont("Arial", 20));
text("frameCount é:", 10, 50);
text(frameCount, 10, 70);
print("O valor de frameCount é:");
println(frameCount);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index7.html">Executar!</a></p></blockquote>
<p>Para corrigir esta sobreposição, pode-se, por exemplo, chamar a<a href="http://www.processing.org/reference/background_.html"> função background</a>. Neste caso, o fundo vai ser reconstruido a cada execução com a cor indicada como parâmetro.</p>
<blockquote><p><img class="alignnone size-full wp-image-132" title="framerateframecounttextcorrigido" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/framerateframecounttextcorrigido.png" alt="framerateframecounttextcorrigido" width="413" height="479" /><br />
<pre name="code" class="java">
void draw()
{
frameRate(3);
background(0);
textFont(createFont("Arial", 20));
text("frameCount é:", 10, 50);
text(frameCount, 10, 70);
print("O valor de frameCount é:");
println(frameCount);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index8.html">Executar!</a></p></blockquote>
<p>Com esta combinação de uso dos comandos frameRate, draw e frameCount, podem ser criados nossos primeiros exemplos de animação simples feita com o Processing.</p>
<p>No exemplo abaixo, a linha vai preenchendo a tela e é construída de cima para baixo. Como frameCount aumenta a cada draw, o valor de y do ponto final da linha também aumenta.</p>
<blockquote><p><img class="alignnone size-full wp-image-133" title="exemploanimacaoline1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploanimacaoline1.png" alt="exemploanimacaoline1" width="483" height="480" /><br />
<pre name="code" class="java">
void draw()
{
// Controla a velocidade da animação
frameRate(30);
// Desenha uma linha horizontal.
// Como frameCount aumenta a cada pixel o valor de
// y do ponto final da linha também aumenta.
line(0, frameCount, width, frameCount);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index9.html">Executar!</a></p></blockquote>
<p>A colocação da função background, por sua vez, faz com que a linha não se acumule na execução e a interface seja reconstruída a cada frame.</p>
<blockquote><p><img class="alignnone size-full wp-image-134" title="exemploanimacaoline2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploanimacaoline2.png" alt="exemploanimacaoline2" width="484" height="479" /><br />
<pre name="code" class="java">
void draw()
{
// Controla a velocidade da animação
frameRate(30);
// Limpa a tela
background(128);
// Desenha uma linha horizontal.
// Como frameCount aumenta a cada pixel o valor de
// y do ponto final da linha também aumenta.
line(0, frameCount, width, frameCount);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index10.html">Executar!</a></p></blockquote>
<p>Qualquer função pode ser parametrizada utilizando a variável frameCount. Efeitos diferentes são obtidos. Por exemplo, no código abaixo, o raio da elipse e a cor de preenchimento são alterados a cada frame.</p>
<blockquote><p><img class="alignnone size-full wp-image-136" title="exemploanimacaoelipse1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploanimacaoelipse1.png" alt="exemploanimacaoelipse1" width="483" height="480" /><br />
<pre name="code" class="java">
void draw()
{
// Controla a velocidade da animação
frameRate(30);
// Altera o preenchimento conforme o frameCount
fill(frameCount);
// Aumenta a elipse conforme o frameCount
ellipse(width/2, height/2, frameCount/2, frameCount/2);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index11.html">Executar!</a></p></blockquote>
<p>Movimentos simples também podem ser feitos utilizando a variável frameCount. Abaixo, um retângulo se movimenta da esquerda para a direita e outro na direção contrária. A expressão width-frameCount permitiu que o retângulo se movesse no sentido contrário.</p>
<blockquote><p><img class="alignnone size-full wp-image-138" title="exemploanimacaorect1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploanimacaorect1.png" alt="exemploanimacaorect1" width="483" height="565" /><br />
<pre name="code" class="java">
void draw()
{
// Controla a velocidade da animação
frameRate(30);
// Limpa a tela
background(255);
// O desenho do retângulo é feito a partir do ponto central
rectMode(CENTER);
// Retângulo da esquerda para a direita
fill(100);
rect(frameCount, height/2, 20, 30);
// Retângulo da direita para a esquerda
fill(200);
rect(width - frameCount, height/2, 20, 30);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index12.html">Executar!</a></p></blockquote>
<p>A variável frameCount representa um valor que só é incrementado. Dessa forma, a animação criada não se repete com a passagem do tempo. Se existir a necessidade de uma animação com um aspecto periódico, um operador aritmético que pode ser utilizado é o<a href="http://www.processing.org/reference/modulo.html"> operador módulo (%)</a>. Este operador permite que se criem expressões aritméticas que tem como resultado o resto inteiro de uma divisão. Exemplos:</p>
<ul>
<li>6 % 3 é igual a 0,&nbsp; já que 6 dividido por 3 dá 2 e o resto é 0, então 6 % 3 é igual a 0;</li>
<li>14 % 4 é igual a 2,&nbsp; já que 14 dividido por 4 é igual a 3 (4*3 = 12) e o resto é 2, então 14 % 4 é igual a 2;</li>
<li>35 % 3 é igual a 2, já que 35 dividido por 3 é igual a 11 ( 3 * 11 = 33) e o resto é 2, então 35 % 3 é igual a 2;</li>
<li>3 % 10 é igual a 3, já que 3 dividido por 10 é igual a 0 (3 * 0 = 0) e o resto é 3, então 3 % 10 é igual a 3.</li>
</ul>
<p>Para entender melhor o significado do módulo, observe a tabela, com a variação de x sendo incrementado e a aplicação do módulo de 3 em cada valor.</p>
<div>
<table id="emph" border="1" cellspacing="0" cellpadding="3" width="300">
<tbody>
<tr>
<td width="50%">x</td>
<td width="50%">x % 3</td>
</tr>
<tr>
<td width="50%">0</td>
<td width="50%">0</td>
</tr>
<tr>
<td width="50%">1</td>
<td width="50%">1</td>
</tr>
<tr>
<td width="50%">2</td>
<td width="50%">2</td>
</tr>
<tr>
<td width="50%">3</td>
<td width="50%">0</td>
</tr>
<tr>
<td width="50%">4</td>
<td width="50%">1</td>
</tr>
<tr>
<td width="50%">5</td>
<td width="50%">2</td>
</tr>
<tr>
<td width="50%">6</td>
<td width="50%">0</td>
</tr>
<tr>
<td width="50%">7</td>
<td width="50%">1</td>
</tr>
<tr>
<td width="50%">8</td>
<td width="50%">2</td>
</tr>
<tr>
<td width="50%">9</td>
<td width="50%">0</td>
</tr>
<tr>
<td width="50%">10</td>
<td width="50%">1</td>
</tr>
<tr>
<td width="50%">11</td>
<td width="50%">2</td>
</tr>
</tbody>
</table>
</div>
<p>Na tabela, o valor de x % 3 possui um comportamento periódico que vai se repetindo de 3 em 3 aplicações do operador. Caso fosse aplicado o módulo de 4 o valor se repetiria de 4 em 4 aplicações, e assim sucessivamente.</p>
<p>Desta maneira, o programa abaixo faz com que o retângulo se mova de cima para baixo na tela de maneira periódica, pois (frameCount % height) vai de 0 a height periodicamente.</p>
<blockquote><p><img class="alignnone size-full wp-image-142" title="exemploanimacaorect3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemploanimacaorect3.png" alt="exemploanimacaorect3" width="485" height="566" /><br />
<pre name="code" class="java">
void draw() {
// Varia a cor de fundo de 0 a 255
background(frameCount % 256);
// Move o retângulo de 0 a height
rect(width/2, frameCount % height, 20, 20);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index13.html">Executar!</a></p></blockquote>
<h3>Usando as variáveis de mouse no modo contínuo</h3>
<p>A posição do mouse também é refletida como uma variável do Processing. Tais variáveis só fazem sentido quando acessadas no modo contínuo do Processing. As seis variáveis de mouse são:</p>
<ul>
<li><a href="http://www.processing.org/reference/mouseButton.html">mouseButton</a>: indica qual dos botões do mouse foi pressionado (LEFT, CENTER ou RIGHT);</li>
<li><a href="http://www.processing.org/reference/mousePressed.html">mousePressed</a>: valor lógico que indica se qualquer botão do mouse foi pressionado;</li>
<li><a href="http://www.processing.org/reference/mouseX.html">mouseX</a>: posição horizontal do mouse (eixo X) no frame atual;</li>
<li><a href="http://www.processing.org/reference/mouseY.html">mouseY</a>: posição vertical do mouse (eixo Y);</li>
<li><a href="http://www.processing.org/reference/pmouseX.html">pmouseX</a>: posição horizontal do mouse (eixo X) no frame anterior;</li>
<li><a href="http://www.processing.org/reference/pmouseY.html">pmouseY</a>: posição vertical do mouse (eixo Y) no frame anterior.</li>
</ul>
<p>A <a href="http://www.processing.org/reference/mouseX.html">variável mouseX</a> contém a posição do mouse no eixo horizontal e a <a href="http://www.processing.org/reference/mouseY.html">variável mouseY</a> contém a posição do mouse no eixo vertical. Lembre-se: o valor de mouseY, diferentemente da matemática, sobe de cima para baixo em um programa. O exemplo abaixo demonstra essa situação.</p>
<blockquote><p><img class="alignnone size-full wp-image-143" title="exemplomousexmousey" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey.png" alt="exemplomousexmousey" width="484" height="566" /><br />
<pre name="code" class="java">
void draw() {
// Seleciona a fonte Arial
background(0);
textFont(createFont("Arial", 15));
text("mouseX =", 10, 20);
text(mouseX, 10, 40);
text("mouseY =", 10, 60);
text(mouseY, 10, 80);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index14.html">Executar!</a></p></blockquote>
<p>O mouse pode determinar também a posição de desenho dos elementos. Nos exemplos a seguir, utiliza-se o mouse como determinante do ponto inicial das figuras.</p>
<blockquote><p><img class="alignnone size-full wp-image-144" title="exemplomousexmousey2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey2.png" alt="exemplomousexmousey2" width="485" height="566" /><br />
<pre name="code" class="java">
void draw() {
background(0);
smooth();
// O retangulo segue o cursor.
rect(mouseX, mouseY, width/3, height/3);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index15.html">Executar!</a></p></blockquote>
<p>A alteração no valor do rectMode altera a posição de desenho da figura.</p>
<blockquote><p><img class="alignnone size-full wp-image-145" title="exemplomousexmousey3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey3.png" alt="exemplomousexmousey3" width="485" height="566" /><br />
<pre name="code" class="java">
void draw() {
background(0);
smooth();
// O retângulo é desenhado a partir do centro
rectMode(CENTER);
// O retangulo segue o cursor.
rect(mouseX, mouseY, width/3, height/3);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index16.html">Executar!</a></p></blockquote>
<p>A aplicação de um deslocamento na posição do mouse desloca o desenho das figuras. Este tipo de efeito é útil, por exemplo, quando é necessário mover objetos na tela ou desenhar cursores personalizados. Para desligar a visualização do cursor, chame a <a href="http://www.processing.org/reference/noCursor_.html">função noCursor()</a>.</p>
<blockquote><p><img class="alignnone size-full wp-image-146" title="exemplomousexmousey4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey4.png" alt="exemplomousexmousey4" width="483" height="566" /><br />
<pre name="code" class="java">
void draw() {
background(0);
smooth();
// Oculta o cursor
noCursor();
// O retângulo é desenhado a partir do centro
rectMode(CENTER);
// O retangulo segue o cursor.
rect(mouseX, mouseY, width/3, height/3);
ellipse(mouseX+20, mouseY, width/3, height/3);
triangle(mouseX-20, mouseY,
mouseX-20, mouseY+10,
mouseX + 30, mouseY + 5);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index17.html">Executar!</a></p></blockquote>
<p>O valor de mouseX ou mouseY também podem ser usados para controlar o tamanho de uma figura.</p>
<blockquote><p><img class="alignnone size-full wp-image-147" title="exemplomousexmousey5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey5.png" alt="exemplomousexmousey5" width="484" height="566" /><br />
<pre name="code" class="java">
void draw() {
background(0);
rect(0, height/2, mouseX, 20);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index18.html">Executar!</a></p></blockquote>
<p>Ou mesmo, podem controlar a escala ou cor de um elemento.</p>
<blockquote><p><img class="alignnone size-full wp-image-148" title="exemplomousexmousey6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey6.png" alt="exemplomousexmousey6" width="483" height="564" /><br />
<pre name="code" class="java">
void draw() {
background(0);
fill(mouseX * 2);
ellipse(width/2, height/2, mouseY * 2, mouseY * 2);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index19.html">Executar!</a></p></blockquote>
<p>É claro, o mouse também pode ser utilizado para geração de desenhos.</p>
<blockquote><p><img class="alignnone size-full wp-image-152" title="exemplomousexmousey7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey7.png" alt="exemplomousexmousey7" width="483" height="567" /><br />
<pre name="code" class="java">
void draw()
{
point(mouseX, mouseY);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index20.html">Executar!</a></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-153" title="exemplomousexmousey8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousexmousey8.png" alt="exemplomousexmousey8" width="484" height="567" /><br />
<pre name="code" class="java">
void draw() {
stroke(frameCount % 256);
line(0, 0, mouseX, mouseY);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index21.html">Executar!</a></p></blockquote>
<p>Outras duas variáveis úteis em relação à interação com o mouse são as <a href="http://www.processing.org/reference/pmouseX.html">variáveis pmouseX</a> e <a href="http://www.processing.org/reference/pmouseY.html">pmouseY</a>. Tais variáveis permitem que se obtenha o valor de posicionamento do mouse no frame anterior. A combinação de mouseX, mouseY, pmouseX e pmouseY permite a criação de diferentes efeitos de desenho.</p>
<blockquote><p><img class="alignnone size-full wp-image-154" title="exemplopmousex1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplopmousex1.png" alt="exemplopmousex1" width="486" height="567" /><br />
<pre name="code" class="java">
void draw() {
line(mouseX, mouseY, pmouseX, pmouseY);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index22.html">Executar!</a></p></blockquote>
<p>A<a href="http://www.processing.org/reference/mousePressed.html"> variável mousePressed</a> é um valor lógico que indica quando o mouse foi pressionado. Posteriormente, veremos que os valores lógicos podem ser usados para a tomada de decisão em nossos programas. No exemplo abaixo, o valor do stroke é determinado pelo pressionar do mouse. Desta forma, quando o valor de mousePressed for true (1), a multiplicação de 204 por 1 dá 204, ou seja, o pincel usado tem a mesma cor do fundo. Caso contrário, quando o botão do mouse estiver solto, 204 vezes 0 é zero e a cor do pincel fica preto.</p>
<p>Observe o uso da<a href="http://www.processing.org/reference/int_.html"> função int</a>. Tal função retorna o valor zero caso o valor de mousePressed seja falso e um caso seja verdadeiro.</p>
<blockquote><p><img class="alignnone size-full wp-image-158" title="exemplomousepressed" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousepressed.png" alt="exemplomousepressed" width="485" height="565" /><br />
<pre name="code" class="java">
void draw() {
// 204 (light gray) é a cor padrão do fundo
// Assim, quando mousePressed for true, o pincel será
// pintado com a cor de fundo
// Caso contrário, o pincel terá a cor 0 (preto).
stroke(204 * int(mousePressed));
line(mouseX, mouseY, pmouseX, pmouseY);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index23.html">Executar!</a></p></blockquote>
<p>Outra maneira de usar a variável mousePressed é demonstrada abaixo. Neste caso, a linha só é desenhada caso o mouse seja pressionado.</p>
<blockquote><p><img class="alignnone size-full wp-image-159" title="exemplomousepressed2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplomousepressed2.png" alt="exemplomousepressed2" width="483" height="564" /><br />
<pre name="code" class="java">
void draw() {
line(mouseX * int(mousePressed),
mouseY * int(mousePressed),
pmouseX* int(mousePressed),
pmouseY * int(mousePressed));
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index24.html">Executar!</a></p></blockquote>
<h3>Configuração do modo contínuo: a função setup</h3>
<p>Existem algumas funções que devem ser executadas apenas uma vez em um programa. Por exemplo, a configuração da largura e altura da tela através da <a href="http://www.processing.org/reference/size_.html">função size</a> deve ser executada apenas no início da execução. Outras configurações importantes que devem ser realizadas apenas uma vez são o carregamento de imagens, configuração do antialiasing (<a href="http://www.processing.org/reference/smooth_.html">função smooth</a>) e escolha da fonte a ser utilizada através da<a href="http://www.processing.org/reference/textFont_.html"> função textFont</a>.</p>
<p>Dessa forma, tudo que se deseja executar apenas uma vez e antes da chamada da função draw deve ser colocado no <a href="http://www.processing.org/reference/setup_.html">bloco setup</a>, definido assim:</p>
<blockquote><p><pre name="code" class="java">
void setup() {
// Coloque aqui o código que será executado apenas uma vez.
}
</pre></p></blockquote>
<p>No exemplo seguinte, o tamanho da tela é configurado antes do draw. Observe também o uso do<a href="http://www.processing.org/reference/addition.html"> operador +</a> para a concatenação do texto.</p>
<blockquote><p><img class="alignnone size-full wp-image-160" title="exemplosetup" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/exemplosetup.png" alt="exemplosetup" width="485" height="747" /><br />
<pre name="code" class="java">
void setup()
{
size(300, 200);
textFont(createFont("Arial", 20));
stroke(128);
fill(140);
}
void draw()
{
background(255);
text("(" + mouseX + ", " + mouseY + ")", 10, 20);
ellipse(pmouseX, pmouseY, mouseX, mouseY);
}
</pre><br />
<a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/index25.html">Executar!</a></p></blockquote>
<h2>Resumo</h2>
<p>Neste texto, tratamos do uso de variáveis dentro de um programa em Processing. Tais variáveis permitem que o comportamento dos programas seja alterado a partir de parâmetros modificados pela interação do usuário, pela passagem do tempo e, até mesmo, a partir de estímulos externos ao programa. Para que as variáveis tenham um uso interessante, foi necessária a definição do modo contínuo. Em tal modo o Processing funciona como uma ferramenta de animação permitindo que parte de nosso código seja repetido periodicamente.</p>
<h2>O que vem pela frente?</h2>
<p>Muitas vezes as variáveis não representarão, imediatamente, um valor necessário para os nossos programas. Dessa forma, será necessário modificar seu valor. Para esta modificação poderemos usar funções matemáticas ou operadores. O próximo capítulo, portanto, tratará das diferentes operações que podem ser feitas com uma variável e como utilizar estas operações para implementar efeitos em um programa.</p>
<h2>Exercício Proposto P02</h2>
<p>A) Desenhe um tabuleiro de jogo da velha. Ao redimensionar a tela via método size, este tabuleiro deve ser redimensionado também.</p>
<p>B) Desenhe uma linha vertical. Faça com que esta linha seja desenhada repetidamente e sua cor seja alterada em uma tonalidade. <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/a02exercb.html">Observe o programa esperado</a>. No final, seu programa deverá gerar a seguinte imagem:</p>
<p><img class="alignnone size-full wp-image-165" title="resultadoesperadoex" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/resultadoesperadoex.png" alt="resultadoesperadoex" width="264" height="237" /></p>
<p>C) Desenhe uma linha diagonal. Faça com que esta linha seja desenhada repetidamente e sua cor seja alterada em uma tonalidade de cada vez. Além disso, a repetição do padrão deve ser periódica (use o <a href="http://www.processing.org/reference/modulo.html">operador %</a> e o <a href="http://www.processing.org/reference/multiply.html">operador *</a> para implementar a periodicidade). <a href="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/a02exercc.html">Observe o programa esperado</a>. No final, seu programa deverá gerar a seguinte imagem:</p>
<p><img class="alignnone size-full wp-image-166" title="resultadoesperadoex2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/resultadoesperadoex2.png" alt="resultadoesperadoex2" width="264" height="237" /></p>
<p>D) Desenhe uma seta qualquer. Faça com que esta seta se mova da diagonal superior esquerda para a diagonal inferior direita.</p>
<p>E) Desenhe uma seta qualquer. Faça com que esta seta se mova da diagonal superior esquerda para a diagonal inferior direita e ao chegar na diagonal inferior direita volte ao início da jornada.</p>
<p>F) Desenhe 4 quadrados. Cada um inicia em uma posição diferente da tela. Faça com que eles se encontrem no centro da tela.</p>
<p>G) No capítulo anterior, solicitou-se a criação de um robô utilizando as ferramentas de desenho do Processing. Utilizando as variáveis width e height faça com que seu robô, quando a resolução é alterada, mantenha as proporções originais.</p>
<p>H ) Coloque seu robô no modo contínuo através das funções setup e draw. Crie alguma funcionalidade interessante baseada no que você aprendeu na aula, <strong>preferencialmente </strong>usando a interação via mouse.</p>
<p>Entregue seus exercícios neste <a href="http://spreadsheets.google.com/viewform?formkey=cEQ1eGlGS0U5b2oxWENQX05JSEItU1E6MA..">link</a>.</p>
<h2>Para saber mais</h2>
<p><span style="color: #000000;">Reas, Casey. Fry, Ben. Processing: A Programming Handbook for Visual Designers and Artists.&nbsp;<a href="http://www.processing.org/img/learning/Processing-Sample-070607.pdf"></a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/10/aula-02-variaveis-do-processing-e-o-modo-continuo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aula 01 &#8211; Introdução à Programação de Computadores usando Processing &#8211; Apresentação</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/06/aula-01-introducao-a-programacao-de-computadores-usando-processing-apresentacao/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/06/aula-01-introducao-a-programacao-de-computadores-usando-processing-apresentacao/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 17:29:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[apresentação]]></category>
		<category><![CDATA[aula01]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=95</guid>
		<description><![CDATA[Segue apresentação referente à aula desta semana.:
Faça o download da apresentação.


Discover Simple, Private Sharing at Drop.io


  var scribd_doc = scribd.Document.getDoc(12976085, 'key-1x34cypjy30lnucfzr5');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  
]]></description>
			<content:encoded><![CDATA[<p>Segue apresentação referente à <a href="http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/">aula desta semana.</a>:</p>
<p>Faça o <a href="http://drop.io/ArquivosIp2009/asset/01-programacaofinal-ppt">download da apresentação</a>.</p>
<p><span id="more-95"></span></p>
<div>
<div style="text-align: center; color: #595653; font-size: 11px; font-family: Verdana, sans-serif; padding-top: 10px; padding-right: 5px;">Discover Simple, Private Sharing at <a href="http://drop.io">Drop.io</a></div>
<p><script type="text/javascript" src='http://www.scribd.com/javascripts/view.js'></script>
<div id="mediaPlayer"></div>
<p><script type="text/javascript">  var scribd_doc = scribd.Document.getDoc(12976085, 'key-1x34cypjy30lnucfzr5');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  </script></div>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/06/aula-01-introducao-a-programacao-de-computadores-usando-processing-apresentacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 01 &#8211; Introdução à Programação de Computadores usando Processing</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 18:06:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[arc]]></category>
		<category><![CDATA[aula01]]></category>
		<category><![CDATA[background]]></category>
		<category><![CDATA[beginShape]]></category>
		<category><![CDATA[bezier]]></category>
		<category><![CDATA[comentários]]></category>
		<category><![CDATA[coordenadas]]></category>
		<category><![CDATA[curve]]></category>
		<category><![CDATA[ellipse]]></category>
		<category><![CDATA[endShape]]></category>
		<category><![CDATA[fill]]></category>
		<category><![CDATA[funções]]></category>
		<category><![CDATA[informação]]></category>
		<category><![CDATA[line]]></category>
		<category><![CDATA[noFill]]></category>
		<category><![CDATA[noSmooth]]></category>
		<category><![CDATA[noStroke]]></category>
		<category><![CDATA[point]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[quad]]></category>
		<category><![CDATA[rect]]></category>
		<category><![CDATA[rectMode]]></category>
		<category><![CDATA[size]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[stroke]]></category>
		<category><![CDATA[strokeCap]]></category>
		<category><![CDATA[strokeJoin]]></category>
		<category><![CDATA[strokeWeight]]></category>
		<category><![CDATA[triangle]]></category>
		<category><![CDATA[vertex]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=15</guid>
		<description><![CDATA[Introdução à Programação de Computadores usando Processing
Objetivo
Este texto tem como objetivo apresentar a programação de computadores para aqueles que nunca tiveram contato prévio com nenhuma outra linguagem ou ambiente de programação. Inicia-se com uma apresentação dos conceitos básicos sobre linguagens de programação em geral. Posteriormente, alguns destes conceitos são explorados utilizando-se a linguagem e ambiente [...]]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: justify;">Introdução à Programação de Computadores usando Processing</h1>
<h2 style="text-align: justify;">Objetivo</h2>
<p style="text-align: justify;">Este texto tem como objetivo apresentar a programação de computadores para aqueles que nunca tiveram contato prévio com nenhuma outra linguagem ou ambiente de programação. Inicia-se com uma apresentação dos conceitos básicos sobre linguagens de programação em geral. Posteriormente, alguns destes conceitos são explorados utilizando-se a <a href="http://www.processing.org/">linguagem e ambiente de programação Processing</a>. Os exemplos que serão apresentados se baseiam na necessidade de conhecer os fundamentos programação gráfica. Desta forma, também será focado o conhecimento matemático essencial para o trabalho com as primitivas gráficas na tela do computador, como, por exemplo, sistemas de coordenadas, ângulos e formas de desenho básicas.</p>
<p style="text-align: justify;">A leitura deste texto pode ser feita de maneira linear. Preferencialmente, siga também os links fornecidos em cada tópico quando surgir alguma dúvida. Tais links servem para que você se acostume a leitura da documentação do próprio Processing. No fim do documento, a seção &#8220;Para Saber Mais&#8221; faz referência a material complementar ou alternativo ao tópicos discorridos.</p>
<p style="text-align: justify;">&nbsp;</p>
<p><span id="more-15"></span></p>
<h2 style="text-align: justify;">Sintaxe introduzida (link para documentação em português)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. <strong>Pule para o tópico &#8220;O Processing&#8221; se for sua primeira leitura!</strong></p>
<ul>
<li>Elementos de código:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/comment.html">//</a> &#8211; Comentário de código;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/multilinecomment.html">/* */</a> &#8211; Comentário multilinha;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/doccomment.html">/** */</a> &#8211; Comentário de código;</li>
<li><a href="http://www.processing.org/reference/semicolon.html">;</a> &#8211; Finalizador de instrução;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/comma.html">,</a> &#8211; Separador de parâmetros;</li>
</ul>
</li>
<li>Operadores:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/greaterthan.html">&gt;</a>: Maior;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/lessthan.html">&lt;</a>: Menor;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/equality.html">==</a>: Igual;</li>
</ul>
</li>
<li>Valores lógicos:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/true.html">true</a>: verdadeiro;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/false.html">false</a>: falso;</li>
</ul>
</li>
<li>Configuração do fundo de tela:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/size_.html">size</a>: Controla o tamanho da janela do programa, recebendo dois parâmetros: largura e altura da janela;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/background_.html">background</a>: Modifica a cor de preenchimento do fundo da tela;</li>
</ul>
</li>
<li>Cores:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/background_.html">background</a>: Modifica a cor de preenchimento do fundo da tela;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/fill_.html"><span style="color: #000000;">fill</span></a>: <span style="color: #000000;">Escolhe a cor usada para preenchimento das formas;</span></li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/noFill_.html"><span style="color: #000000;">noFill</span></a>: <span style="color: #000000;">Desabilita o preenchimento das formas;</span></li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/stroke_.html"><span style="color: #000000;">stroke</span></a>: <span style="color: #000000;">Escolhe a cor usada para o desenho de bordas e linhas;</span></li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/noStroke_.html"><span style="color: #000000;">noStroke</span></a>: <span style="color: #000000;">Desabilita o desenho das bordas e linhas.</span></li>
</ul>
</li>
<li>Desenho de formas bidimensionais:
<ul>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/point_.html">point</a>: Desenha um ponto em uma posição específica;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/line_.html">line</a>: Desenha uma linha ligando dois pontos;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/triangle_.html">triangle</a>: Gera um triângulo a partir de 3 pontos;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/quad_.html">quad</a>: Desenha um quadrilátero a partir de 4 pontos;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/rect_.html">rect</a>: Desenha um tipo especial de quadrilátero, o retângulo, a partir de um ponto, uma largura e uma altura.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/ellipse_.html">ellipse</a>: Desenha uma elipse, dado a sua coordenada, a largura e a altura. Para desenhar um círculo a largura e altura devem ser iguais;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/arc_.html">arc</a>: Cria um arco. Arcos são pedaços de elipse. A função arc recebe como parâmetro além da coordenada, da largura e da altura o início e o fim do arco em radianos.</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/bezier_.html">bezier</a>: Constrói uma curva de Bezier a partir dos pontos âncora e pontos de controle;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/curve_.html">curve</a>: Desenha uma linha curva;</li>
<li><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/beginShape_.html">beginShape</a>, <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/vertex_.html">vertex </a>e <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/endShape_.html">endShape</a>: Constrói um polígono a partir de um conjunto de vértices.</li>
</ul>
</li>
<li>Alteração nos atributos de desenho:
<ul>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/stroke_.html">stroke</a>: Escolhe a cor usada para o desenho de bordas e linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/strokeWeight_.html">strokeWeight</a>: Determina a espessura de desenho das linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/strokeCap_.html">strokeCap</a>: Escolhe o estilo de renderização das finalizações de linha;</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/strokeJoin_.html">strokeJoin</a>: Define o estilo de junção dos segmentos de linha formando um polígono;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/noStroke_.html">noStroke</a>: Desabilita o desenho das bordas e linhas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/fill_.html">fill</a>: Escolhe a cor usada para preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/noFill_.html">noFill</a>: Desabilita o preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/smooth_.html">smooth</a>: Desenha os elementos geométricos com bordas e cantos suavizados;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/noSmooth_.html">noSmooth</a>: Desabilita a suavização de bordas e cantos;</span></li>
<li><span style="color: #000000;"><a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/rectMode_.html">rectMode</a>: Configura o comportamento padrão de como um retângulo é desenhado.</span></li>
</ul>
</li>
</ul>
<h2 style="text-align: justify;">Sintaxe introduzida (link para documentação em inglês)</h2>
<p>Esta seção serve como resumo e referência aos comandos explorados neste capítulo. <strong>Pule para o tópico &#8220;O Processing&#8221; se for sua primeira leitura!</strong></p>
<ul>
<li>Elementos de código:
<ul>
<li><a href="http://www.processing.org/reference/comment.html">//</a> &#8211; Comentário de código;</li>
<li><a href="http://www.processing.org/reference/multilinecomment.html">/* */</a> &#8211; Comentário multilinha;</li>
<li><a href="http://www.processing.org/reference/doccomment.html">/** */</a> &#8211; Comentário de código;</li>
<li><a href="http://www.processing.org/reference/semicolon.html">;</a> &#8211; Finalizador de instrução;</li>
<li><a href="http://www.processing.org/reference/comma.html">,</a> &#8211; Separador de parâmetros;</li>
</ul>
</li>
<li>Operadores:
<ul>
<li><a href="http://www.processing.org/reference/greaterthan.html">&gt;</a>: Maior;</li>
<li><a href="http://www.processing.org/reference/lessthan.html">&lt;</a>: Menor;</li>
<li><a href="http://www.processing.org/reference/equality.html">==</a>: Igual;</li>
</ul>
</li>
<li>Valores lógicos:
<ul>
<li><a href="http://www.processing.org/reference/true.html">true</a>: verdadeiro;</li>
<li><a href="http://www.processing.org/reference/false.html">false</a>: falso;</li>
</ul>
</li>
<li>Configuração do fundo de tela:
<ul>
<li><a href="http://www.processing.org/reference/size_.html">size</a>: Controla o tamanho da janela do programa, recebendo dois parâmetros: largura e altura da janela;</li>
<li><a href="http://www.processing.org/reference/background_.html">background</a>: Modifica a cor de preenchimento do fundo da tela;</li>
</ul>
</li>
<li>Cores:
<ul>
<li><a href="http://www.processing.org/reference/background_.html">background</a>: Modifica a cor de preenchimento do fundo da tela;</li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/fill_.html">fill</a></span>: <span style="color: #000000;">Escolhe a cor usada para preenchimento das formas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noFill_.html">noFill</a></span>: <span style="color: #000000;">Desabilita o preenchimento das formas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/stroke_.html">stroke</a></span>: <span style="color: #000000;">Escolhe a cor usada para o desenho de bordas e linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noStroke_.html">noStroke</a></span>: <span style="color: #000000;">Desabilita o desenho das bordas e linhas.</span></li>
</ul>
</li>
<li>Desenho de formas bidimensionais:
<ul>
<li><a href="http://www.processing.org/reference/point_.html">point</a>: Desenha um ponto em uma posição específica;</li>
<li><a href="http://www.processing.org/reference/line_.html">line</a>: Desenha uma linha ligando dois pontos;</li>
<li><a href="http://www.processing.org/reference/triangle_.html">triangle</a>: Gera um triângulo a partir de 3 pontos;</li>
<li><a href="http://www.processing.org/reference/quad_.html">quad</a>: Desenha um quadrilátero a partir de 4 pontos;</li>
<li><a href="http://www.processing.org/reference/rect_.html">rect</a>: Desenha um tipo especial de quadrilátero, o retângulo, a partir de um ponto, uma largura e uma altura.</li>
<li><a href="http://www.processing.org/reference/ellipse_.html">ellipse</a>: Desenha uma elipse, dado a sua coordenada, a largura e a altura. Para desenhar um círculo a largura e altura devem ser iguais;</li>
<li><a href="http://www.processing.org/reference/arc_.html">arc</a>: Cria um arco. Arcos são pedaços de elipse. A função arc recebe como parâmetro além da coordenada, da largura e da altura o início e o fim do arco em radianos.</li>
<li><a href="http://www.processing.org/reference/bezier_.html">bezier</a>: Constrói uma curva de Bezier a partir dos pontos âncora e pontos de controle;</li>
<li><a href="http://www.processing.org/reference/curve_.html">curve</a>: Desenha uma linha curva;</li>
<li><a href="http://www.processing.org/reference/beginShape_.html">beginShape</a>, <a href="http://www.processing.org/reference/vertex_.html">vertex </a>e <a href="http://www.processing.org/reference/endShape_.html">endShape</a>: Constrói um polígono a partir de um conjunto de vértices.</li>
</ul>
</li>
<li>Alteração nos atributos de desenho:
<ul>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/stroke_.html">stroke</a>: Escolhe a cor usada para o desenho de bordas e linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeWeight_.html">strokeWeight</a>: Determina a espessura de desenho das linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeCap_.html">strokeCap</a>: Escolhe o estilo de renderização das finalizações de linha;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeJoin_.html">strokeJoin</a>: Define o estilo de junção dos segmentos de linha formando um polígono;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noStroke_.html">noStroke</a>: Desabilita o desenho das bordas e linhas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/fill_.html">fill</a>: Escolhe a cor usada para preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noFill_.html">noFill</a>: Desabilita o preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/smooth_.html">smooth</a>: Desenha os elementos geométricos com bordas e cantos suavizados;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>: Desabilita a suavização de bordas e cantos;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/rectMode_.html">rectMode</a>: Configura o comportamento padrão de como um retângulo é desenhado.</span></li>
</ul>
</li>
</ul>
<h2 style="text-align: justify;">O Processing</h2>
<p style="text-align: justify;"><img class="alignright size-full wp-image-39" style="margin-left: 20px; margin-right: 20px;" title="telaprocessing" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/telaprocessing.png" alt="telaprocessing" width="420" height="537" />Tal ambiente, derivado da linguagem de programação Java, é uma linguagem de programação e ambiente para pessoas que desejam programar imagens, animações e interações. O Processing pode ser usado para o ensino dos fundamentos da programação de computadores usando um contexto visual. Seu público alvo é formado, principalmente, por artistas, estudantes e pesquisadores. A facilidade de instalação, uso e aprendizagem aliada à produtividade na geração de programas que utilizem interações complexas, faz com que o Processing seja ideal para a prototipação rápida de ideias e como caderno de esboços em software.</p>
<p style="text-align: justify;">Este aspecto didático do Processing não limita a sua aplicação em programas reais que exijam alto desempenho em processamento gráfico e ou que exijam portabilidade para diversas plataformas de software. Por ser baseado na linguagem Java, os programas em Processing geram applets e programas que apresentam excelente performance, principalmente se comparado com outras alternativas&nbsp; como Flash e JavaScript. Além disso, tais programas tem suporte para as plataformas Windows, Linux e Mac OS inclusive para funcionalidades como programação gráfica em 3d, <a href="http://pt.wikipedia.org/wiki/OpenGL">OpenGL</a>, processamento de som e vídeo, geração de arquivos <a href="http://pt.wikipedia.org/wiki/Portable_Document_Format">PDF</a>, exibição de imagens <a href="http://pt.wikipedia.org/wiki/SVG">SVG</a>, e, qualquer biblioteca existente para a linguagem Java.</p>
<p style="text-align: justify;">O Processing será nossa ferramenta de programação de computadores neste curso, veja sua interface ao lado. Sua instalação é bastante leve e simples e deve ser feita a partir do <a href="http://www.processing.org/download/index.html">próprio portal da ferramenta</a>. Para um passo a passo de instalação da ferramenta e como executar o seu primeiro código básico:</p>
<ol>
<li>Baixe o arquivo disponível no <a href="http://www.processing.org/download/index.html">portal do Processing</a>. Escolha a versão conforme o seu sistema operacional:
<ol>
<li><a href="http://www.processing.org/download/processing-1.0.3.zip">Windows</a>;</li>
<li><a href="http://www.processing.org/download/processing-1.0.3.tgz">Linux</a>;</li>
<li><a href="http://www.processing.org/download/processing-1.0.3.dmg">Mac OSX</a>.</li>
</ol>
</li>
<li>Descomprima o arquivo na pasta de sua preferência;</li>
<li>Nesta pasta, execute o programa Processing.exe;</li>
<li>Dentro da ferramenta, digite o código a seguir e clique no botão Run ou use a combinação de teclas CTRL + R;</li>
<li>Parabéns! Este é o seu primeiro programa em Processing! Veja o resultado esperado abaixo.</li>
</ol>
<p><pre name="code" class="java">
size(300, 200);
line(100, 100, 200, 100);
</pre></p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-74" title="oimundo" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/oimundo.png" alt="oimundo" width="306" height="232" /></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">Após a instalação do Processing, vamos entender o que significa a criação de um programa de computador. Destaca-se, porém, que o foco deste capítulo é enxergar o Processing como um ambiente de programação </span><span style="color: #000000;">voltado para a criação de imagens. Ou seja, trabalharemos com o Processing como se ele fosse um programa como o Paint ou PhotoShop. Mas, <strong>programar não significa fazer desenhos</strong>! Nos capítulos seguintes, veremos que o Processing não se limita ao desenho, sendo uma ferramenta completa de desenvolvimento que apresenta uma série de poderosas estruturas de programação. </span></span></p>
<h2 style="text-align: justify;">O que é programação de computadores?</h2>
<p style="text-align: justify;">Programar significa construir algoritmos. Um algoritmo é uma sequência de passos destinada a resolver um problema e é formado, principalmente, por estruturas de controle as quais serão discutidas posteriormente com mais detalhes.<br />
Tais estruturas de controle fazem parte do nosso dia a dia e, resumidamente são:</p>
<ul style="text-align: justify;">
<li><strong>Estrutura sequencial</strong>: indica a ordem de execução de um algoritmo. Cada passo deve ser realizado necessariamente após o outro;</li>
<li><strong>Estrutura de seleção</strong>: permite a escolha de um conjunto de passos em detrimento do outro conforme uma certa condição seja satisfeita;</li>
<li><strong>Estrutura de repetição</strong>: dá o poder de controlar a quantidade de vezes que um conjunto de passos pode ser executado em um algoritmo.</li>
</ul>
<p style="text-align: justify;">Estas estruturas permitem que sejam alteradas as informações no processador do computador. Neste capítulo, será tratado como a estrutura sequencial trabalha com as informações do tipo constante.</p>
<h2 style="text-align: justify;">A informação</h2>
<p style="text-align: justify;">Assim, além destas estruturas, outro ponto importante para a compreensão do que é um algoritmo é o conceito de informação. O material que o algoritmo manipula, ou seja, cada dado, fato ou valor que pode ser trabalhado na memória do computador é uma informação. Existem diversos formatos que uma informação pode ser armazenada e estes formatos são os chamados tipos primitivos de informação. Apesar de cada linguagem de programação ter um conjunto próprio de tipos primitivos, a maior parte das linguagens da família da linguagem Java, como o Processing, trabalha com os seguintes cinco tipos básicos:</p>
<ul style="text-align: justify;">
<li><strong>Inteiro</strong>: número pertencente ao conjunto dos números inteiros, pode ser negativo se acompanhado do sinal &#8220;-&#8221;. Exemplos: 130, -10, 2700, idade em anos, número de páginas de um livro, posição do mouse no eixo x, posição do mouse no eixo y;</li>
<li><strong>Ponto flutuante</strong>: número pertencente ao conjunto dos números de ponto flutuante. É formado por parte inteira e parte decimal, as quais são separadas através do &#8220;.&#8221; Exemplos: 1.73, 12.23, PI, salário.</li>
<li><strong>Caractere</strong>: texto formado por um caractere. Delimitado através do sinal de apóstrofo (&#8221;&#8216;&#8221;). Exemplos: &#8216;a&#8217;, &#8216;b&#8217;, &#8216;Z&#8217;, &#8216;1&#8242;, &#8216;2&#8242;, tecla pressionada.</li>
<li><strong>String</strong>: texto formado por um conjunto de um ou mais caracteres. Deve ser delimitado por um sinal de aspas (&#8221; &#8221; &#8220;). Exemplos: &#8220;Processing&#8221;, &#8220;Bruno&#8221;,&nbsp; &#8220;A&#8221;, seu nome.</li>
<li><strong>Lógico</strong>: o tipo lógico pode assumir dois valores: verdadeiro ou falso. O valor verdadeiro é representado pela palavra <a href="http://www.processing.org/reference/true.html">true </a>e o valor falso por <a href="http://www.processing.org/reference/false.html">false</a>. No Processing, o true também pode ser associado ao valor 1 e o false ao valor 0. Exemplos: true, false, interruptor de luz, estado do botão do mouse (pressionado ou não).</li>
</ul>
<p style="text-align: justify;">Uma informação pode ser constante ou variável. Constantes não variam com o tempo durante a execução de um programa. Variáveis podem ser alteradas em algum instante da execução.</p>
<ul style="text-align: justify;">
<li><strong>Exemplos de constantes</strong>: 123, PI, &#8220;nome&#8221;, true;</li>
<li><strong>Exemplos de variáveis</strong>: nome, interruptor, estado do botão do mouse.</li>
</ul>
<blockquote>
<h3 style="text-align: justify;"><em>Exercício de Fixação 01 &#8211; Classifique como variável ou constante</em></h3>
<p style="text-align: justify;"><em>Classifique os itens abaixo como variáveis ou constantes.</em></p>
<p style="text-align: justify;"><em>a) 12</em></p>
<p style="text-align: justify;"><em>b) endereço</em></p>
<p style="text-align: justify;"><em>c) &#8220;endereço&#8221;</em></p>
<p style="text-align: justify;"><em>d) 2.3</em></p>
<p style="text-align: justify;"><em>e) true</em></p>
<p style="text-align: justify;"><em>f) melhor time do Paraná</em></p>
<p style="text-align: justify;"><em>g) 1 + 1</em></p>
</blockquote>
<blockquote>
<h3 style="text-align: justify;"><em>Exercício de Fixação 02 &#8211; Determine o tipo de constante</em></h3>
<p style="text-align: justify;"><em>Classifique os itens abaixo como: Inteiro, Ponto Flutuante, Caractere, String e Lógico.<br />
</em></p>
<p style="text-align: justify;"><em>a) true</em></p>
<p style="text-align: justify;"><em>b) 23</em></p>
<p style="text-align: justify;"><em>c) 2.56</em></p>
<p style="text-align: justify;"><em>d) &#8216;a&#8217;</em></p>
<p style="text-align: justify;"><em>e) false</em></p>
<p style="text-align: justify;"><em>f) &#8220;true&#8221;</em></p>
<p style="text-align: justify;"><em>g) &#8220;false&#8221;</em></p>
</blockquote>
<p style="text-align: justify;">O uso das informações na memória exige que o programador entenda como representar a informação para o programa. No Processing, a informação é representada no formato texto. A manipulação das informações acontece através da execução de instruções que utilizam as estruturas sequencial, de seleção e de repetição. A seguir, vamos construir nosso primeiro algoritmo, o qual é formado apenas sequenciação de instruções.</p>
<h2 style="text-align: justify;">A estrutura sequencial e um exemplo de algoritmo</h2>
<p style="text-align: justify;">Vamos imaginar o seguinte problema: criar um esboço da bandeira do Brasil colado em uma cartolina branca.&nbsp; Além da cartolina, você tem um conjunto de pedaços de papel de diferentes cores: verde, amarelo e azul. Também tem tesoura, cola e uma régua. Em Português coloquial, uma resolução possível deste problema simples é bastante óbvia:</p>
<ol style="text-align: justify;">
<li>Recortar um retângulo verde;</li>
<li>Colar o retângulo verde na cartolina;</li>
<li>Recortar um losango amarelo;</li>
<li>Colar o losango amarelo;</li>
<li>Recortar um círculo de cor azul;</li>
<li>Cole, por fim, o círculo azul.</li>
</ol>
<p style="text-align: justify;">Seguimos uma sequencia de ações linear na qual cada ação é executada uma linha após a outra, de cima para baixo. <strong>Executando em uma ordem diferente, o resultado pode não ser o esperado. </strong>Colando primeiro o losango amarelo na cartolina, por exemplo, invalidaria a construção da bandeira.</p>
<p style="text-align: justify;">Desta forma, em um algoritmo, cada linha corresponde a uma instrução e deve ser lida e interpretada de maneira independente da anterior como se estivéssemos trabalhando com uma receita culinária. Esta sequencia lógica de execução do algoritmo passo a passo é a estrutura sequencial ou sequenciação. Ou seja, <strong>a ordem do código escrito importa na ordem de execução</strong>.</p>
<p style="text-align: justify;">Embora pareça completa e simples a lista de instruções acima, há algumas questões em aberto. Por exemplo, o retângulo verde é de que tamanho? Ele é maior ou menor que o losango amarelo? O ser humano responde estas questões de maneira intuituiva. Na programação de computadores não há espaço para ambiguidade. Se criássemos um programa para desenhar a bandeira do Brasil, deveríamos definir exatamente quais são as dimensões e posição de qualquer um dos componentes do objeto sendo desenhado. Além disso, não podemos usar a língua portuguesa para especificar comandos para a linguagem. Faz-se necessária a utilização de instruções da linguagem de programação. Para que possamos escrever o algoritmo anterior no Processing será necessário compreender que escrever um programa de computador é muito diferente de escrever um email ou um texto qualquer e a sintaxe deve ser conhecida e respeitada.</p>
<p style="text-align: justify;">Por exemplo, no Processing, o desenho de um retângulo se dá através da<a href="http://www.processing.org/reference/rect_.html"> instrução rect</a>. Uma instrução guarda certa semelhança com uma frase na língua portuguesa. Assim, a frase: &#8220;Desenhar um retângulo de 80 por 50 na posição 120, 130.&#8221;, no Processing deve ser escrito com o código abaixo.</p>
<p style="text-align: justify;"><pre name="code" class="java">
rect(120, 130, 80, 50);
</pre></p>
<p style="text-align: justify;">Constata-se que este código apresenta 4 informações numéricas constantes: 120, 130, 80 e 50. Estas informações numéricas são processadas pela função rect, responsável por construir o retângulo. Isto posto, da mesma forma como uma frase da língua humana, há uma série de componentes no código-fonte acima. Pode-se, até mesmo, fazer a analogia com os sujeitos, predicados e objetos de uma oração. Na próxima seção analisaremos a anatomia de uma instrução e de um código simples.</p>
<h2 style="text-align: justify;">Anatomia de um código em Processing</h2>
<p style="text-align: justify;">Aprender uma linguagem de programação é como aprender um novo idioma. Antes da fluência na linguagem, devemos, portanto, conhecer sua sintaxe. Diferente de um idioma, no qual o ser humano interpreta e perdoa os erros do iniciante, em uma linguagem de programação o erro de sintaxe implica em um programa que não funciona. Um programa básico no Processing é formado pelos seguintes componentes: comentários, funções, instruções, expressões e espaços em branco.</p>
<h3 style="text-align: justify;">Comentários</h3>
<p style="text-align: justify;">Comentários são fragmentos do código que o computador ignora. Sua importância está em escrever recados no programa sobre o que ele faz e comentários em geral sobre o funcionamento de um conjunto de instruções. Bons programadores comentam seu código de maneira que não apenas eles mas também outras pessoas possam entender o que acontece. Outra utilidade do comentário é ocultar pedaços do código que estão incompletos ou com algum problema e que devem ser consertados em outro momento.</p>
<p style="text-align: justify;">No exemplo abaixo, todas as linhas marcadas com <a href="http://www.processing.org/reference/comment.html">// são comentários de código</a>.</p>
<p><pre name="code" class="java">
// A função size configura a largura e a altura da tela do programa.
// No exemplo abaixo, a tela possui 300 pixels de altura e 200 de largura.
size(300, 200);
// A função background altera a cor de fundo da tela.
// No exemplo abaixo, a tela é pintada na cor branca.
background(255);
// A linha abaixo, embora seja um comando válido, não será executada pois o sinal de comentário está colocado antes do comando
// rect(120, 130, 80, 50);
</pre></p>
<p style="text-align: justify;">Outra maneira de criar um comentário é utilizando o conjunto <a href="http://www.processing.org/reference/multilinecomment.html">/* e */</a>. Este é o chamado comentário multilinha. Neste caso, o comentário inicia-se com o sinal /* e pode ser estendido a diversas linhas. O comentário é fechado com o sinal */.</p>
<p><pre name="code" class="java">
/* O programa abaixo é um exemplo simples de como podemos desenhar uma linha no Processing.
Atenção: este programa se preocupa em colorir a linha com a cor vermelha usando a função stroke.
*/
size(300, 200);
background(255);
stroke(255, 0, 0);
line(0, 0, 100, 100);
/* as linhas seguintes estão comentadas, ou seja, não são executadas
stroke(255, 0, 0);
line(100, 100, 200, 200);
*/
</pre></p>
<p style="text-align: justify;">O comentário de código (<em>doc comment</em>), por sua vez, é útil para a geração de uma documentação explicativa sobre o programa como um todo. Esta documentação é inserida no documento HTML gerado quando é feita a exportação do código em Processing para o formato applet, o qual permite sua publicação na Web. Após a exportação, todo o texto colocado entre os sinais <a href="http://www.processing.org/reference/doccomment.html">/** e */ </a>é colocado no arquivo &#8220;index.html&#8221;. Para exportar um programa em Processing, use o menu File &gt; Export ou tecle CTRL + E.</p>
<p><pre name="code" class="java">
/**
Exemplo simples de como podemos desenhar uma linha vermelha no Processing.
Atenção: este programa se preocupa em colorir a linha com a cor vermelha usando a função stroke.
*/
size(300, 200);
background(255);
stroke(255, 0, 0);
line(0, 0, 100, 100);
/* As linhas seguintes estão comentadas, ou seja, não são executadas
Estas linhas não serão copiadas no arquivo index.html.
stroke(255, 0, 0);
line(100, 100, 200, 200);
*/
</pre></p>
<p style="text-align: justify;">Observa-se que no Processing o comentário é exibido com uma cor diferente em relação ao resto do código.</p>
<h3 style="text-align: justify;">Funções</h3>
<p>Funções (também chamados de módulos ou procedimentos) permitem a transmissão de ordens do programador para o computador. Servem como comandos sendo passados para desenhar, alterar cores, realizar cálculos, executar ações quaisquer, etc. O nome de uma função é geralmente em letra minúscula. Quando uma função é chamada, seu nome deve ser seguido por parênteses. Quando o nome da função é composto por duas palavras, a segunda palavra é conectada na primeira e sua primeira letra é colocada em maiúsculo. Esta não é uma regra obrigatória, mas é uma boa prática para ser seguida quando você cria suas próprias funções. Portanto, além dos procedimentos disponíveis por padrão no Processing é possível definir novas funções para compartimentalizar e organizar o seu código.</p>
<p>No código abaixo, temos exemplos de chamadas às funções <a href="http://www.processing.org/reference/line_.html">line</a>,&nbsp; <a href="http://www.processing.org/reference/fill_.html">fill</a>, <a href="http://www.processing.org/reference/noFill_.html">noFill </a>e <a href="http://www.processing.org/reference/rect_.html">rect</a>.</p>
<p><pre name="code" class="java">
// A função size (300, 200) configura a tela para 300 pixels de largura por 200 pixels de altura
size(300, 200);
// A função fill habilita o preenchimento das formas sendo desenhadas a seguir.
// A cor escolhida é uma tonalidade intermediária de cinza
fill(128);
// A função rect desenha uma retângulo de 50 pixels por 30 pixels a partir do ponto (0, 0 )
rect(0, 0, 50, 30);
// A função noFill desabilita o preenchimento das formas.
noFill();
// A função rect desenha um retângulo de 50 pixels por 30 pixels a partir do ponto (10, 10)
// Observe que o retângulo não está preenchido devido à chamada a noFill feita anteriormente.
rect(10, 10, 50, 30);
</pre></p>
<p>Funções podem receber parâmetros para alterar ou configurar seu comportamente. Algumas funções, como a noFill, não recebem parâmetros. Outras, como a fill, recebem um parâmetro apenas. As demais funções como a rect podem utilizar mais de um parâmetro e estes parâmetros são separados através de <a href="http://www.processing.org/reference/comma.html">vírgulas</a>.</p>
<blockquote>
<h3 style="text-align: justify;"><em>Exercício de Fixação 03 &#8211; Determine o número de parâmetros</em></h3>
<p><em>Determine o número de parâmetros de cada uma das chamadas à funções abaixo.</em></p>
<p><em>a) noStroke();</em></p>
<p><em>b) fill(128);</em></p>
<p><em>c) rect(12, 12, 12, 12);</em></p>
<p><em>d) quad(10, 20, 20, 30, 30, 50, 60, 10);</em></p></blockquote>
<p>Importante acrescentar que as funções em Processing são sensíveis ao contexto. Deste modo, as chamadas às funções devem se preocupar com a letras maiúsculas e minúsculas. Por exemplo, a função rect não pode ser chamada escrevendo Rect e nem RECT. Assim, o código abaixo está errado e gera o erro &#8220;The function Size(int, int) does not exist.&#8221;</p>
<p><img class="alignnone size-full wp-image-76" title="erronome" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erronome.png" alt="erronome" width="276" height="436" /></p>
<p><pre name="code" class="java">
Size(100, 100);
</pre></p>
<h3 style="text-align: justify;">Expressões</h3>
<p>Através da combinação de operadores consegue-se a geração de expressões. Existem expressões de diversos tipos: expressões aritméticas, expressões lógicas e expressões relacionais.&nbsp; Expressões sempre tem como resultado um valor. Exemplos de expressões:</p>
<ul>
<li> 5+6 corresponde ao valor 11;</li>
<li>120.23 &#8211; 0.23 corresponde ao valor 120;</li>
<li>&#8220;Bruno &#8221; + &#8221; Campagnolo&#8221; corresponde ao valor &#8220;Bruno Campagnolo&#8221;;</li>
<li>((3*5)+4) corresponde ao valor 19;</li>
<li><a href="http://www.processing.org/reference/greaterthan.html">5 &gt; 3</a> corresponde ao valor true, pois 5 é maior que 3;</li>
<li><a href="http://www.processing.org/reference/equality.html">52 == 52</a> corresponde ao valor true, pois 52 é igual a 52;</li>
<li><a href="http://www.processing.org/reference/lessthan.html">51 &lt; 41</a> corresponde ao valor false, pois 51 não é menor que 41.</li>
</ul>
<p>As expressões podem ser usadas diretamente como parâmetro de uma função:</p>
<pre>// A função rect chamada abaixo desenha um retângulo de 50 pixels por 30 pixels a partir do ponto (20, 30).
// Observe que 10+10 corresponde a 20 e 3 * 10 dá o resultado da multiplicação de 3 por 10.
rect(10+10, 3*10, 50, 30);</pre>
<blockquote>
<h3 style="text-align: justify;"><em><em>Exercício de Fixação 04 &#8211; Determine o valor da expressão<br />
</em></em></h3>
<p><em>Determine qual é o valor de cada uma das expressões abaixo.</em></p>
<p><em>a) 1+1</em></p>
<p><em>b) 2 * 4</em></p>
<p><em>c) 20 * 4 + 2</em></p>
<p><em>d) 20 * (4 + 2)</em></p>
<p><em>e) 5 &gt; 40</em></p>
<p><em>f) 45 &lt; 50</em></p>
<p><em>g) (2*3) &gt; (5*1)</em></p>
<p><em>h) (10-10)==(20-20)</em></p></blockquote>
<h3 style="text-align: justify;">Instruções</h3>
<p>Assim, um conjunto de expressões e funções define uma instrução, a qual deve ser sempre finalizada pelo <a href="http://www.processing.org/reference/semicolon.html">sinal &#8220;;&#8221;</a>. Muito cuidado deve ser dedicado à utilização deste sinal, pois quando você esquece de colocar um ponto e vírgula em um programa, o Processing reclama com o erro &#8220;Syntax error, maybe a missing semicolon?&#8221;, <span style="color: #ff0000;"><span style="color: #000000;">como mostra a figura.</span><br />
</span></p>
<p><span style="color: #ff0000;"><img class="alignnone size-full wp-image-77" title="erropontoevirgula" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/erropontoevirgula.png" alt="erropontoevirgula" width="276" height="436" /><br />
</span></p>
<p>Existem diferentes tipos de instrução. Por enquanto, conhecemos apenas as instruções úteis para a chamada de funções.</p>
<h3 style="text-align: justify;">Espaços em branco</h3>
<p>O programador não precisa se preocupar com a quantidade de espaços em branco que usa entre os elementos de seu programa. Por espaços em branco leia-se: quebras de linha, tabulações e espaços normais. Deve-se preferir, porém, a representação de cada instrução em apenas uma linha e reservar os espaços&nbsp; para situações onde algum esclarecimento é necessário.</p>
<p>Assim, códigos no estilo abaixo são válidos mas devem ser evitados:</p>
<pre>size</pre>
<pre>(300&nbsp;&nbsp;&nbsp;&nbsp; ,</pre>
<pre>200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</pre>
<pre>background(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200)</pre>
<pre>;</pre>
<p>A figura abaixo resume os elementos apresentados.</p>
<p><span style="color: #ff0000;"><img class="alignnone size-full wp-image-80" title="anatomia" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/anatomia.png" alt="anatomia" width="556" height="491" /><br />
</span></p>
<p style="text-align: justify;">Definidos estes elementos, ferramentas iniciais para que se possa compreender as instruções do Processing, é possível agora utilizar essas instruções para a criação de janelas e desenho de diversas formas geométricas na tela do computador.</p>
<h2 style="text-align: justify;">Sistema de Coordenadas Cartesianas</h2>
<p style="text-align: justify;"><span style="color: #000000;">Quando se faz um desenho na tela do computador é necessária, primeiramente, a especificação do tamanho da área útil de desenho. Esta área é formada por pequenos pontos de luz chamados pixels. </span></p>
<p style="text-align: justify;">Cada pixel é identificado por uma cor e por uma posição. Em relação a posição de um ponto, utiliza-se um sistema de coordenadas cartesianas semelhante ao da matemática. Ou seja,&nbsp; uma primitiva é caracterizada por um valor de posicionamento no eixo x e outro no eixo y. No Processing, a origem dos eixos está na lateral superior esquerda da tela. Assim, o eixo x tem seus valores crescendo da esquerda para a direita e o eixo y inicia-se em cima e cresce até a parte de baixo da tela. A notação de um ponto se dá através do valor de x, seguido pelo valor de y e separados por uma vírgula.</p>
<p style="text-align: justify;"><span style="color: #ff0000;"><img class="alignnone size-full wp-image-82" title="eixocartesiano" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/eixocartesiano.png" alt="eixocartesiano - Originalmente de REAS e FRY" width="643" height="280" /><br />
</span></p>
<p style="text-align: justify;">Exemplos :</p>
<ul>
<li>(0, 0): Origem padrão do eixo, ponto superior esquerdo;</li>
<li>(99,0): Pixel na superior direita;</li>
<li>(0, 99): Pixel na inferior esquerda;</li>
<li>(99, 99): Pixel na inferior direita.</li>
</ul>
<p style="text-align: justify;">É possível alterar a origem do eixo utilizando-se a <a href="http://www.processing.org/reference/translate_.html">função translate</a>. Tal função especifica uma quantidade de deslocamento que deve ser aplicado nos objetos sendo mostrados na tela. Mais detalhes sobre essa função serão tratados em capítulo posterior.</p>
<h2 style="text-align: justify;">Fundo da Tela (background)</h2>
<p style="text-align: justify;">Assim, quando se fala em uma tela com resolução 800&#215;600, isso significa que a tela contém uma matriz de 800 pixels de largura por 600 pixels de altura. Isso significa 480 mil pontos de luz na tela. Embora este valor possa parecer elevado, o olho humano é bastante exigente e outro fator que influencia na qualidade de uma imagem é o número de pontos que estão contidos em uma unidade de área. Uma unidade comumente utilizada é o pontos por polegada quadrada (<em>dots per inch &#8211; dpi</em>). Bons monitores tem resoluções de 100 dpi. Este valor nem chega perto da resolução de algumas impressoras modernas.</p>
<p style="text-align: justify;">Os programas em Processing, portanto, além de configurarem o tamanho do conjunto de pixels que será utilizado como área de desenho devem também se preocupar com a melhor maneira de preencher estes pixels para melhorar a visualização do ser humano em relação à baixa resolução da tela do computador. Um zoom na tela do computador mostra esse problema em detalhe.</p>
<p style="text-align: justify;"><span style="color: #ff0000;"><img class="alignnone size-full wp-image-83" title="zoom" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/zoom.png" alt="zoom" width="253" height="302" /><br />
</span></p>
<p style="text-align: justify;">A <a href="http://www.processing.org/reference/size_.html">função size</a> controla o tamanho da janela do programa, recebendo dois parâmetros: largura e altura da janela.</p>
<blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-84" title="size100100" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/size100100.png" alt="size100100" width="134" height="160" /></span></span></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">size(100, 100);</span></span></p>
</blockquote>
<blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-85" title="size200200" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/size200200.png" alt="size200200" width="206" height="232" /></span></span></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">size(200, 200);</span></span></p>
</blockquote>
<blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-86" title="size320240" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/size320240.png" alt="size320240" width="326" height="272" /></span></span></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">size(320, 240);<br />
</span></span></p></blockquote>
<h2 style="text-align: justify;">Cores</h2>
<p style="text-align: justify;">A cor de fundo desta janela por padrão é cinza claro. Para alterar esse valor, a <a href="http://www.processing.org/reference/background_.html">função background</a> é usada para modificar a cor de desenho do fundo da tela. Esta função pode receber um ou mais parâmetros. Não é escopo deste capítulo os diferentes sistemas de representação de cores na tela do computador configurados por estes parâmetros. Futuramente, trataremos destes sistemas, mas, por enquanto, através do menu Tools &gt; Color Selector é possível obter o código de cor referente a uma cor. Se, simplesmente um número entre 0 e 255 for fornecido, a cor de fundo será configurada entre o preto (valor 0) e o branco, com tons intermediários de cinza entre estes dois valores. O valor cinza claro, por exemplo, corresponde ao valor 204.</p>
<p style="text-align: justify;"><span style="color: #ff0000;"><img class="alignnone size-full wp-image-87" title="colorselector" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/colorselector.png" alt="colorselector" width="415" height="318" /><br />
</span></p>
<p style="text-align: justify;">Duas outras funções para lidar com as cores são a <a href="http://www.processing.org/reference/stroke_.html">função stroke</a> e a <a href="http://www.processing.org/reference/fill_.html">função fill</a>, respectivamente, permitindo alteração da cor das linhas e bordas e a cor de preenchimento das formas básicas. Outras duas funções auxiliares a estas são a <a href="http://www.processing.org/reference/noStroke_.html">função noStroke</a> e a <a href="http://www.processing.org/reference/noFill_.html">função noFill</a>, as quais desabilitam as linhas e bordas e o preenchimento das formas. Na próxima seção trataremos destas formas, mostrando o que acontece quando se combina a chamada destas quatro funções.</p>
<p style="text-align: justify;"><span style="color: #ff0000;"><img class="alignnone size-full wp-image-88" title="strokefill" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/strokefill.png" alt="strokefill" width="205" height="98" /><br />
</span></p>
<h2 style="text-align: justify;">Formas Primitivas</h2>
<p>O Processing disponibiliza ao programador uma série de funções para desenho das formas bidimensionais primitivas. As principais:</p>
<ul>
<li><a href="http://www.processing.org/reference/point_.html">point</a>: Desenha um ponto em uma posição específica;</li>
<li><a href="http://www.processing.org/reference/line_.html">line</a>: Desenha uma linha ligando dois pontos;</li>
<li><a href="http://www.processing.org/reference/triangle_.html">triangle</a>: Gera um triângulo a partir de 3 pontos;</li>
<li><a href="http://www.processing.org/reference/quad_.html">quad</a>: Desenha um quadrilátero a partir de 4 pontos;</li>
<li><a href="http://www.processing.org/reference/rect_.html">rect</a>: Desenha um tipo especial de quadrilátero, o retângulo, a partir de um ponto, uma largura e uma altura.</li>
<li><a href="http://www.processing.org/reference/ellipse_.html">ellipse</a>: Desenha uma elipse, dado a sua coordenada, a largura e a altura. Para desenhar um círculo a largura e altura devem ser iguais;</li>
<li><a href="http://www.processing.org/reference/arc_.html">arc</a>: Cria um arco. Arcos são pedaços de elipse. A função arc recebe como parâmetro além da coordenada, da largura e da altura o início e o fim do arco em radianos.</li>
<li><a href="http://www.processing.org/reference/bezier_.html">bezier</a>: Constrói uma curva de Bezier a partir dos pontos âncora e pontos de controle;</li>
<li><a href="http://www.processing.org/reference/curve_.html">curve</a>: Desenha uma linha curva;</li>
<li><a href="http://www.processing.org/reference/beginShape_.html">beginShape</a>, <a href="http://www.processing.org/reference/vertex_.html">vertex </a>e <a href="http://www.processing.org/reference/endShape_.html">endShape</a>: Constrói um polígono a partir de um conjunto de vértices.</li>
</ul>
<p>No capítulo atual, trataremos apenas de algumas funções que trabalham com linhas retas. A figura abaixo resume os parâmetros necessários para construir cada uma das formas.</p>
<div id="attachment_89" class="wp-caption alignnone" style="width: 554px"><img class="size-full wp-image-89" title="primitivas" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/primitivas.png" alt="Retirada de Reas/Fry" width="544" height="845" /><p class="wp-caption-text">Retirada de Reas/Fry</p></div>
<p style="text-align: justify;"><span style="color: #000000;">A construção destas formas também podem ser influenciadas pelas funções de alteração nos atributos de desenho:</span></p>
<ul>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/stroke_.html">stroke</a>: Escolhe a cor usada para o desenho de bordas e linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeWeight_.html">strokeWeight</a>: Determina a largura de desenho das linhas;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeCap_.html">strokeCap</a>: Escolhe o estilo de renderização das finalizações de linha;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/strokeJoin_.html">strokeJoin</a>: Define o estilo de junção dos segmentos de linha formando um polígono;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noStroke_.html">noStroke</a>: Desabilita o desenho das bordas e linhas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/fill_.html">fill</a>: Escolhe a cor usada para preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noFill_.html">noFill</a>: Desabilita o preenchimento das formas;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/smooth_.html">smooth</a>: Desenha os elementos geométricos com bordas e cantos suavizados;<br />
</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>: Desabilita a suavização de bordas e cantos;</span></li>
<li><span style="color: #000000;"><a href="http://www.processing.org/reference/rectMode_.html">rectMode</a>: Configura o comportamento padrão de como um retângulo é desenhado.<br />
</span></li>
</ul>
<h3 style="text-align: justify;">Ponto</h3>
<p>Elemento visual mais simples. Caracterizado, no mínimo, por um pixel. A<a href="http://www.processing.org/reference/point_.html"> função point</a> recebe como parâmetro a posição em x e a posição em y do ponto sendo construído. Exemplo de chamada:<br />
<pre name="code" class="java">
point(x, y);
</pre></p>
<blockquote><p><img class="size-full wp-image-49 alignnone" title="pointexemplo1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo1.png" alt="pointexemplo1" width="111" height="108" /></p>
<p><pre name="code" class="java">
// Pontos com o mesmo x e y formam uma linha diagonal
//  a partir da superior esquerda.
point(5, 5);
point(10, 10);
point(15, 15);
point(20, 20);
point(25, 25);
point(30, 30);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-51" title="pointexemplo2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo2.png" alt="pointexemplo2" width="111" height="108" /></p>
<p><pre name="code" class="java">
// Pontos com o mesmo valor de y formam uma linha horizontal
point(10, 50);
point(20, 50);
point(30, 50);
point(40, 50);
point(50, 50);
point(60, 50);
point(70, 50);
point(80, 50);
point(90, 50);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-52" title="pointexemplo3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo3.png" alt="pointexemplo3" width="111" height="108" /></p>
<p><pre name="code" class="java">
// Linhas são geradas a partir do agrupamento de pontos
//  Linha diagonal
point(30, 30);
point(31, 31);
point(32, 32);
point(33, 33);
point(34, 34);
point(35, 35);
//  Linha horizontal
point(40, 40);
point(41, 40);
point(42, 40);
point(43, 40);
point(44, 40);
// Linha vertical
point(60, 60);
point(60, 61);
point(60, 62);
point(60, 63);
point(60, 64);
</pre></p></blockquote>
<p><span style="color: #000000;">A cor do ponto pode ser alterada</span> através da <a href="http://www.processing.org/reference/stroke_.html">função stroke</a>. Tal função recebe como parâmetro a cor a ser utilizada.</p>
<blockquote><p><img class="alignnone size-full wp-image-53" title="pointexemplo4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo4.png" alt="pointexemplo4" width="112" height="108" /></p>
<p><pre name="code" class="java">
// Linhas são geradas a partir do agrupamento de pontos
//  Linha diagonal com a cor branca
stroke(255);
point(30, 30);
point(31, 31);
point(32, 32);
point(33, 33);
point(34, 34);
point(35, 35);
//  Linha horizontal com a cor preta
stroke(0);
point(40, 40);
point(41, 40);
point(42, 40);
point(43, 40);
point(44, 40);
// Linha vertical com a cor cinza
stroke(128);
point(60, 60);
point(60, 61);
point(60, 62);
point(60, 63);
point(60, 64);
</pre></p></blockquote>
<p><span style="color: #ff0000;"><span style="color: #000000;">A largura do ponto é um atributo configurável com a <a href="http://www.processing.org/reference/strokeWeight_.html">função strokeWeight</a>. O ponto, a partir de um pixel, pode ser colocado com qualquer tamanho na tela.</span></span></p>
<blockquote><p><img class="alignnone size-full wp-image-54" title="pointexemplo5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo5.png" alt="pointexemplo5" width="106" height="108" /></p>
<p><pre name="code" class="java">
stroke(0);
point(10, 30);
strokeWeight(2);
stroke(50);
point(15, 30);
strokeWeight(10);
stroke(100);
point(25, 30);
strokeWeight(30);
stroke(150);
point(60, 30);
stroke(160);
strokeWeight(40);
point(50, 75);
</pre></p></blockquote>
<p>Quando o ponto é desenhado com uma largura maior que 1 pixel, a suavização do desenho pode ser desejável. Este processo, chamado antialiasing elimina o serrilhamento no desenho de um ponto de maior largura. O antialiasing é ligado/desligado através das <a href="http://www.processing.org/reference/smooth_.html">funções smooth</a> e <a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>.</p>
<blockquote><p><img class="alignnone size-full wp-image-55" title="pointexemplo6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/pointexemplo6.png" alt="pointexemplo6" width="110" height="113" /></p>
<p><pre name="code" class="java">
stroke(128);
strokeWeight(50);
smooth();
point(25, 25);
noSmooth();
point(75, 75);
</pre></p></blockquote>
<h3 style="text-align: justify;">Linha</h3>
<p style="text-align: justify;">A partir de dois pontos (origem e destino), uma linha é gerada através do desenho de um conjunto de pontos que unem a origem e o destino. A<a href="http://www.processing.org/reference/line_.html"> função line</a> recebe como parâmetros, nesta ordem:</p>
<ul>
<li><strong>x1</strong>: coordenada em x da origem;</li>
<li><strong>y1</strong>: coordenada em y da origem;</li>
<li><strong>x2</strong>: coordenada em x do destino;</li>
<li><strong>y2</strong>: coordenada em y do destino.</li>
</ul>
<p style="text-align: justify;">Exemplo de chamada:</p>
<p><pre name="code" class="java">
line(x1, y1, x2, y2);
</pre></p>
<blockquote><p><img class="alignnone size-full wp-image-57" title="lineexemplo1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo1.png" alt="lineexemplo1" width="106" height="108" /></p>
<p><pre name="code" class="java">
// Linhas horizontais (y de igual valor na origem e no destino)
line(10, 20, 40, 20);
line(15, 30, 35, 30);
line(20, 40, 30, 40);
// Quando a origem e o destino são os mesmos, temos um ponto
line(25, 50, 25, 50);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-58" title="lineexemplo2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo2.png" alt="lineexemplo2" width="108" height="109" /></p>
<p><pre name="code" class="java">
// Linhas verticais são geradas quando o x é igual na origem e no destino
line(20, 10, 20, 40);
line(30, 15, 30, 35);
line(40, 20, 40, 30);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-59" title="lineexemplo3" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo3.png" alt="lineexemplo3" width="108" height="110" /></p>
<p><pre name="code" class="java">
// Linhas que compartilham o mesmo ponto estão conectadas
line(30, 40, 30, 60);
line(30, 60, 40, 60);
line(40, 60, 40, 30);
</pre></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">A cor da linha é alterada através da <a href="http://www.processing.org/reference/stroke_.html">função stroke</a>. E a <a href="http://www.processing.org/reference/noStroke_.html">função noStroke</a> oculta qualquer linha desenhada.</span></span></p>
<blockquote><p><img class="alignnone size-full wp-image-102" title="lineexemplo8" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo8.png" alt="lineexemplo8" width="110" height="105" /></p>
<p><pre name="code" class="java">
// Linhas que compartilham o mesmo ponto estão conectadas
stroke(0);
line(30, 10, 30, 80);
stroke(255);
line(30, 80, 90, 80);
// A linha a seguir não é mostrada
noStroke();
line(90, 80, 40, 80);
</pre></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;">Por padrão, a largura de uma linha é de 1 pixel. <span style="color: #000000;">A <a href="http://www.processing.org/reference/strokeWeight_.html">função strokeWeight</a> também pode ser utilizada no desenho de linhas para escolher seu peso.</span></span></span></p>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #000000;"><br />
</span></span></span></p>
<blockquote><p><img class="alignnone size-full wp-image-60" title="lineexemplo5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo5.png" alt="lineexemplo5" width="109" height="110" /></p>
<p><pre name="code" class="java">
// Linhas que compartilham o mesmo ponto estão conectadas
// Linha fina
stroke(0);
strokeWeight(3);
line(30, 10, 30, 80);

stroke(255);
strokeWeight(10);
line(30, 80, 90, 80);

// Linha grossa
stroke(128);
strokeWeight(20);
line(90, 80, 90, 40);
</pre></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">A finalização de uma linha pode ser de diferentes estilos. Estes estilos são escolhidos através da <a href="http://www.processing.org/reference/strokeCap_.html">função strokeCap</a>. Por padrão, o estilo de renderização é o estilo ROUND, ou seja, uma linha termina com as bordas arredondadas. </span></span></span></span></span></p>
<blockquote><p><img class="alignnone size-full wp-image-62" title="lineexemplo6" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo6.png" alt="lineexemplo6" width="109" height="110" /></p>
<p><pre name="code" class="java">
strokeWeight(15);
line(10, 20, 90, 20);
strokeCap(SQUARE);
line(10, 40, 90, 40);
strokeCap(PROJECT);
line(10, 60, 90, 60);
strokeCap(ROUND);
line(10, 80, 90, 80);
</pre></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">E, para eliminar o serrilhamento o par <a href="http://www.processing.org/reference/smooth_.html">smooth </a>/ <a href="http://www.processing.org/reference/noSmooth_.html">noSmooth </a>continua valendo.</span></span></span></span></span></p>
<blockquote><p><img class="alignnone size-full wp-image-63" title="lineexemplo7" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/lineexemplo7.png" alt="lineexemplo7" width="109" height="110" /></p>
<p><pre name="code" class="java">
strokeWeight(25);
smooth();
line(20, 25, 80, 25);
noSmooth();
line(20, 75, 80, 75);
</pre></p></blockquote>
<h3 style="text-align: justify;">Triângulo</h3>
<p style="text-align: justify;">A <a href="http://www.processing.org/reference/triangle_.html">função triangle</a> desenha um triângulo a partir de 3 pontos. Um triângulo pode ser construído a partir de 6 parâmetros que representam os pontos a serem conectados:</p>
<ul>
<li><strong>x1</strong>: coordenada em x do primeiro ponto;</li>
<li><strong>y1</strong>: coordenada em y do primeiro ponto;</li>
<li><strong>x2</strong>: coordenada em x do segundo ponto;</li>
<li><strong>y2</strong>: coordenada em y do segundo ponto;</li>
<li><strong>x3</strong>: coordenada em x do terceiro ponto;</li>
<li><strong>y3</strong>: coordenada em y do terceiro ponto.</li>
</ul>
<p>Exemplo de chamada:<br />
<pre name="code" class="java">
triangle(x1, y1, x2, y2, x3, y3);
</pre></p>
<p><pre name="code" class="java">
triangle(10, 10, 10, 70, 80, 70);
triangle(10, 70, 10, 80, 50, 80);
</pre></p>
<p>O triângulo é um polígono fechado. A<a href="http://www.processing.org/reference/fill_.html"> função fill</a> permite que se escolha a cor usada para o preenchimento do triângulo. A cor padrão é o branco (valor 255). A função noFill desabilita o preenchimento.</p>
<blockquote><p><img class="alignnone size-full wp-image-64" title="triangleexemplo1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/triangleexemplo1.png" alt="triangleexemplo1" width="109" height="110" /></p>
<p><pre name="code" class="java">
fill(0);
triangle(10, 10, 20, 10, 15, 5);
fill(50);
triangle(20, 20, 30, 20, 25, 15);
fill(100);
triangle(30, 30, 40, 30, 35, 25);
fill(150);
triangle(40, 40, 50, 40, 45, 35);
noFill();
triangle(50, 50, 60, 50, 55, 45);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-66" title="triangleexemplo21" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/triangleexemplo21.png" alt="triangleexemplo21" width="109" height="110" /></p>
<p><pre name="code" class="java">
fill(128);
triangle(0, 50, 50, 0, 100, 50);
noFill();
triangle(0, 50, 50, 10, 100, 50);
triangle(0, 50, 50, 20, 100, 50);
triangle(0, 50, 50, 30, 100, 50);
triangle(0, 50, 50, 40, 100, 50);
</pre></p></blockquote>
<p>Por ser formado por uma junção de linhas, o triângulo permite que se escolha o estilo da conexão entre os segmentos através da <a href="http://www.processing.org/reference/strokeJoin_.html">função strokeJoin</a>. Há 3 estilos disponíveis: MITER  (o padrão), BEVEL e ROUND.</p>
<blockquote><p><img class="alignnone size-full wp-image-67" title="triangleexemplo4" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/triangleexemplo4.png" alt="triangleexemplo4" width="292" height="110" /></p>
<p><pre name="code" class="java">
size(300, 100);
noFill();
strokeWeight(15);
strokeJoin(BEVEL);
triangle(20, 80, 50, 20, 80, 80);
strokeJoin(MITER);
triangle(120, 80, 150, 20, 180, 80);
strokeJoin(ROUND);
triangle(220, 80, 250, 20, 280, 80);
</pre></p></blockquote>
<p>As funções <a href="http://www.processing.org/reference/stroke_.html">stroke</a>, <a href="http://www.processing.org/reference/noStroke_.html">noStroke</a>, <a href="http://www.processing.org/reference/strokeWeight_.html">strokeWeight</a>, <a href="http://www.processing.org/reference/smooth_.html">smooth </a>e <a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>, já explicadas nas seções anteriores também valem para o triângulo.</p>
<blockquote><p><img class="alignnone size-full wp-image-68" title="triangleexemplo5" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/triangleexemplo5.png" alt="triangleexemplo5" width="292" height="193" /></p>
<p><pre name="code" class="java">
size(300, 200);
background(0);
noFill();
smooth();
stroke(255);
strokeWeight(15);

strokeJoin(BEVEL);
triangle(20, 80, 50, 20, 80, 80);
strokeJoin(MITER);
triangle(120, 80, 150, 20, 180, 80);
strokeJoin(ROUND);
triangle(220, 80, 250, 20, 280, 80);

// Os triângulos seguintes possuem serrilhamento
noSmooth();
strokeJoin(BEVEL);
triangle(20, 180, 50, 120, 80, 180);
strokeJoin(MITER);
triangle(120, 180, 150, 120, 180, 180);
strokeJoin(ROUND);
triangle(220, 180, 250, 120, 280, 180);
</pre></p></blockquote>
<h3 style="text-align: justify;">Quadrilátero</h3>
<p>Semelhante ao triângulo, o quadrilátero é determinado a partir de quatro pontos. A <a href="http://www.processing.org/reference/quad_.html">função quad</a> recebe oito parâmetros, dois para cada ponto:</p>
<ul>
<li><strong>x1</strong>: coordenada em x do primeiro ponto;</li>
<li><strong>y1</strong>: coordenada em y do primeiro ponto;</li>
<li><strong>x2</strong>: coordenada em x do segundo ponto;</li>
<li><strong>y2</strong>: coordenada em y do segundo ponto;</li>
<li><strong>x3</strong>: coordenada em x do terceiro ponto;</li>
<li><strong>y3</strong>: coordenada em y do terceiro ponto;</li>
<li><strong>x4</strong>: coordenada em x do quarto ponto;</li>
<li><strong>y4</strong>: coordenada em y do quarto ponto.</li>
</ul>
<p style="text-align: justify;">Exemplo de chamada:</p>
<p><pre name="code" class="java">
quad(x1, y1, x2, y2, x3, y3, x4, y4);
</pre></p>
<p style="text-align: justify;">Dependendo dos parâmetros o polígono gerado pode ser um:</p>
<ul>
<li>retângulo;</li>
<li>quadrado;</li>
<li>paralelogramo;</li>
<li>trapézio;</li>
<li>quadrilátero irregular.</li>
</ul>
<blockquote><p><img class="alignnone size-full wp-image-69" title="quadexemplo1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/quadexemplo1.png" alt="quadexemplo1" width="292" height="193" /></p>
<p><pre name="code" class="java">
size(300, 200);
// Quadrilátero irregular
quad(10, 10, 90, 90, 10, 90, 90, 10);
// Quadrado
quad(110, 10, 110, 90, 190, 90, 190, 10);
// Retângulo
quad(10, 110, 10, 190, 190, 190, 190, 110);
// Losango
quad(250, 10, 200, 100, 250, 190,300, 100);
</pre></p></blockquote>
<p style="text-align: justify;"><span style="color: #ff0000;"><br />
</span></p>
<p style="text-align: justify;">Todas as funções (<a href="http://www.processing.org/reference/fill_.html">fill</a>, <a href="http://www.processing.org/reference/strokeJoin_.html">strokeJoin</a>,&nbsp; <a href="http://www.processing.org/reference/stroke_.html">stroke</a>, <a href="http://www.processing.org/reference/noStroke_.html">noStroke</a>, <a href="http://www.processing.org/reference/strokeWeight_.html">strokeWeight</a>, <a href="http://www.processing.org/reference/smooth_.html">smooth </a>e <a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>) que alteram o triângulo também podem ser usadas para alteração das propriedades das formas geradas pela função quad.</p>
<h3 style="text-align: justify;">Retângulo</h3>
<p>O retângulo é uma figura geométrica com todos os seus lados separados por ângulos retos (noventa graus). A função rect precisa de 4 parâmetros:</p>
<ul>
<li><strong>x</strong>: coordenada em x do início do retângulo;</li>
<li><strong>y</strong>: coordenada em y do início do retângulo;</li>
<li><strong>w</strong>: largura do retângulo;</li>
<li><strong>h</strong>: altura do retângulo.</li>
</ul>
<p>Exemplo de chamada:<br />
<pre name="code" class="java">
rect(x, y, w, h);
</pre><br />
Se o valor de w for igual ao de h um quadrado é construído.</p>
<p style="text-align: justify;">A <a href="http://www.processing.org/reference/rectMode_.html">função rectMode</a> permite que se altere o comportamento padrão de como um retângulo é desenhado a partir de sua localização.&nbsp; Por padrão, os parâmetros x e y determinam o ponto da lateral superior esquerda do retângulo. Este é o rectMode(CORNER). A sintaxe rectMode(CORNERS) usa o primeiro e o segundo parâmetro como um dos cantos e o terceiro e quarto parâmetros para determinar a posição do outro canto. No caso de rectMode(CENTER), o retângulo é construído a partir do ponto central, ou seja, x e y determinam onde deve ficar o centro do retângulo. Os outros dois parâmetros são usados para a largura e altura do retângulo. Por fim, a chamada a rectMode(RADIUS) especifica que o retângulo deve ser desenhado a partir do ponto central. Mas, desta vez, o terceiro e quarto parâmetros determinam metade da altura e da largura.</p>
<blockquote><p><img class="alignnone size-full wp-image-70" title="rectexemplo1" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/rectexemplo1.png" alt="rectexemplo1" width="293" height="181" /></p>
<p><pre name="code" class="java">
size(300, 200);
fill(210);
rect(10, 10, 80, 50);
fill(200);
rect(50, 35, 80, 50);
fill(190);
rect(90, 60, 80, 50);
fill(180);
rect(130, 85, 80, 50);
fill(170);
rect(170, 60, 80, 50);
fill(160);
rect(210, 35, 80, 50);
</pre></p></blockquote>
<blockquote><p><img class="alignnone size-full wp-image-71" title="rectexemplo2" src="http://www.brunocampagnolo.com/2009ip/wp-content/uploads/2009/03/rectexemplo2.png" alt="rectexemplo2" width="295" height="196" /></p>
<p><pre name="code" class="java">
size(300, 200);
// rectMode(CORNERS) recebe os pontos de limite do retângulo
rectMode(CORNERS);
rect(10, 10, 30, 30);
rect(30, 30, 50, 50);
rect(50, 50, 70, 70);
rect(70, 70, 90, 90);
noFill();
// rectMode(CENTER) recebe o centro, a largura e a altura
rectMode(CENTER);
rect(50, 50, 90, 90);
// rectMode(RADIUS); recebe o centro e metade da largura e metade da altura
rectMode(RADIUS);
rect(150, 100, 145, 95);
</pre></p></blockquote>
<p>Todas as funções (<a href="http://www.processing.org/reference/fill_.html">fill</a>, <a href="http://www.processing.org/reference/strokeJoin_.html">strokeJoin</a>,&nbsp; <a href="http://www.processing.org/reference/stroke_.html">stroke</a>, <a href="http://www.processing.org/reference/noStroke_.html">noStroke</a>, <a href="http://www.processing.org/reference/strokeWeight_.html">strokeWeight</a>, <a href="http://www.processing.org/reference/smooth_.html">smooth </a>e <a href="http://www.processing.org/reference/noSmooth_.html">noSmooth</a>) que alteram o triângulo e o quadrilátero também podem ser usadas para alteração das propriedades das formas geradas pela função rect.</p>
<h2 style="text-align: justify;">Resumo</h2>
<p><span style="color: #000000;">Neste capítulo começamos a percorrer o caminho com a Programação de Computadores. Conhecemos o ambiente Processing, que utilizaremos neste curso para a prototipação rápida de desenhos, animações, interações e programas em geral. A visão do Processing trabalhada hoje se limitou à utilização como ferramenta de desenho. Da Lógica de Programação, entendemos melhor qual é a anatomia de um programa: comentários, funções, constantes, etc. Por fim, algumas funções de geração de gráficos 2d foram exploradas e exemplificadas.<br />
</span></p>
<h2 style="text-align: justify;">O que vem pela frente?</h2>
<p><span style="color: #ff0000;"><span style="color: #000000;">No próximo capítulo o foco será o Processing como ferramenta de animação e de tipografia básica. Para que ele possa ser usado desta maneira, o conceito de modo contínuo será apresentado. Além disso, outro assunto relevante será a utilização de variáveis.</span><br />
</span></p>
<h2 style="text-align: justify;">Exercícios Propostos</h2>
<p><span style="color: #ff0000;"><span style="color: #000000;">A) </span><span style="color: #000000;">Na aula de hoje você conheceu uma série de comandos para o desenho de primitivas gráficas. Vamos treinar sua aplicação. Usando <strong>pelo menos</strong> as funções: point, line, triang, quad e rect desenhe um robô. Você tem liberdade para o desenho que quiser, mas o lado direito do robô deve ser simétrico em relação ao lado esquerdo.</span></span></p>
<p>Para entregar este exercício proposto, use <a href="http://spreadsheets.google.com/viewform?formkey=cEQ1eGlGS0U5b2oxNFV4SXVuYXVMZnc6MA..">este link</a>.</p>
<p>B) Treine a construção do esboço de outras figuras. Sugestões:</p>
<ul>
<li>Tabuleiro quadrado de 3 x 3;</li>
<li>Jogo da velha na posição inicial;</li>
<li>Seta;</li>
<li>Bandeira do Brasil;</li>
<li>Casa;</li>
<li>etc&#8230;</li>
</ul>
<p><!--[if !mso]> <mce:style><!  v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --> <!--[endif]--><!--[if !ppt]--><!-- .O 	{color:gray; 	font-size:149%;} .O1 	{color:gray; 	font-size:149%;} a:link 	{color:#3333CC !important;} a:active 	{color:#B840A1 !important;} a:visited 	{color:#AF67FF !important;} --><!-- .sld 	{left:0px !important; 	width:6.0in !important; 	height:4.5in !important; 	font-size:103% !important;} --><!--[endif]--></p>
<div>
<div class="O1"><span style="font-family: Verdana; font-size: 178%;"><span style="position: absolute; left: -5.24%; font-family: Arial;">–</span></span></div>
<div class="O1"><!--[if ppt]--><span style="font-family: Verdana; font-size: 178%; visibility: hidden;"><span style="position: absolute; left: -5.24%; font-family: Arial;">–</span></span><!--[endif]--><span style="font-family: Verdana; font-size: 32pt;"> </span></div>
</div>
<h2 style="text-align: justify;">Para saber mais</h2>
<p>Shiffman, Daniel. Coordinated Systems and Shapes, 2008, Disponível em: <a href="http://www.processing.org/learning/tutorials/basics/">http://www.processing.org/learning/tutorials/basics/</a></p>
<p><span style="color: #000000;">Reas, Casey. Fry, Ben. Processing: A Programming Handbook for Visual Designers and Artists. Páginas 23 a 36. Disponível parcialmente em: <a href="http://www.processing.org/img/learning/Processing-Sample-070607.pdf">http://www.processing.org/img/learning/Processing-Sample-070607.pdf</a></span></p>
<p>Referência do Processing em Português. Disponível em: <a href="http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/index_ext.html">http://www.dainf.cefetpr.br/~merkle/processing/reference/ptBR/index_ext.html</a></p>
<p>Referência do Processing em Inglês. Disponível em: <a href="http://www.processing.org/reference/index.html">http://www.processing.org/reference/index.html</a></p>
<p>Capítulo 2 do Livro &#8220;Lógica de Programação &#8211; A Construção de Algoritmos e  Estruturas de Dados&#8221; de Forbellone e Eberspächer. Páginas 17 a 21.</p>
<p class="bcp-corpo">Capítulo 1 do Livro &#8220;Algoritmos Estruturados&#8221; de Farrer e  outros. Páginas 47 a 50.</p>
<p class="bcp-corpo">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/03/aula-01-introducao-a-programacao-de-computadores-usando-processing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Alguns vídeos mostrados durante a Aula 00</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/03/02/alguns-videos-mostrados-durante-a-aula-00/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/03/02/alguns-videos-mostrados-durante-a-aula-00/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 11:59:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[realidade_aumentada]]></category>
		<category><![CDATA[vídeo]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=10</guid>
		<description><![CDATA[

Tetris Moves Me &#8211; Narrated Version from Joana Kelly on Vimeo.

Siftables Music Sequencer from Jeevan Kalanithi on Vimeo.
]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/67bxQmEl7tQ&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/67bxQmEl7tQ&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/v0srY37kkMw&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/v0srY37kkMw&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=861387&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=861387&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br /><a href="http://vimeo.com/861387">Tetris Moves Me &#8211; Narrated Version</a> from <a href="http://vimeo.com/user425244">Joana Kelly</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NK59Beq0Sew&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NK59Beq0Sew&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3165011&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3165011&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br /><a href="http://vimeo.com/3165011">Siftables Music Sequencer</a> from <a href="http://vimeo.com/notjeevan">Jeevan Kalanithi</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/03/02/alguns-videos-mostrados-durante-a-aula-00/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aula 00 &#8211; 17 e 18/02/2009 &#8211; Apresentação da Disciplina</title>
		<link>http://www.brunocampagnolo.com/2009ip/2009/02/17/aula-00-17-e-18022009-apresentacao-da-disciplina/</link>
		<comments>http://www.brunocampagnolo.com/2009ip/2009/02/17/aula-00-17-e-18022009-apresentacao-da-disciplina/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 16:41:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[aulas]]></category>
		<category><![CDATA[apresentação]]></category>
		<category><![CDATA[aula00]]></category>

		<guid isPermaLink="false">http://www.brunocampagnolo.com/2009ip/?p=3</guid>
		<description><![CDATA[Nesta aula, nosso objetivo será apresentar o que é a disciplina de Introdução à Programação 1 e 2.
Download Apresentação da Disciplina


Discover Simple, Private Sharing at Drop.io


  var scribd_doc = scribd.Document.getDoc(12533488, 'key-4khvhnuniqgfz3g1zds');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  
]]></description>
			<content:encoded><![CDATA[<p>Nesta aula, nosso objetivo será apresentar o que é a disciplina de Introdução à Programação 1 e 2.</p>
<p>Download <a href="http://drop.io/ArquivosIp2009/asset/00-apresentacaofinal-ppt">Apresentação da Disciplina</a></p>
<p><span id="more-3"></span></p>
<div>
<div style="text-align: center; color: #595653; font-size: 11px; font-family: Verdana, sans-serif; padding-top: 10px; padding-right: 5px;">Discover Simple, Private Sharing at <a href="http://drop.io">Drop.io</a></div>
<p><script type="text/javascript" src='http://www.scribd.com/javascripts/view.js'></script>
<div id="mediaPlayer"></div>
<p><script type="text/javascript">  var scribd_doc = scribd.Document.getDoc(12533488, 'key-4khvhnuniqgfz3g1zds');  scribd_doc.addParam('height', 450);scribd_doc.addParam('width', 650);   scribd_doc.write('mediaPlayer');  </script></div>
]]></content:encoded>
			<wfw:commentRss>http://www.brunocampagnolo.com/2009ip/2009/02/17/aula-00-17-e-18022009-apresentacao-da-disciplina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

