[ CAPÍTULO 8 ]
O Código Transcendente
Libertação

O Caminho do Zen é um pequeno guia escrito pelo filósofo, escritor e orador Alan Watts, que pincela histórias[1] do Budismo e do Taoismo até o desenvolvimento do Zen Budismo. Em uma de suas páginas podemos encontrar uma parábola em que um mestre, que toma chá com dois de seus estudantes, joga um leque para um deles e pergunta: "O que é isso?". Em vez de responder, o jovem abre o leque e se abana. O mestre responde - "Nada mal." - e passa para o outro aluno - "Agora você.". O estudante fecha o leque e coça o pescoço com ele. Em seguida, abre-o novamente, coloca um pedaço de bolo em cima e o oferece ao mestre. Isso é considerado ainda melhor, pois quando não há nomes, o mundo não é mais "classificado por limites ou barreiras". Veja que esse texto louva o pragmatismo ao expor que, quando deixamos de atribuir rótulos aos conceitos que aprendemos, estamos desbloqueando seu potencial, não ortodoxo, de uso. Mesmo sendo cuidadoso ao passar as lições, o fenômeno da restrição também acomete o livro que você está lendo, afinal foi utilizada a metodologia da teoria com foco na prática. Nesta última lição cabe a você combater essa mentalidade sendo como um aluno do Caminho Zen, imparcial, questionador e aberto, nutrindo-se da filosofia do Gestalt, da "visão do todo".

Agora que você chegou ao final de sua jornada você é capaz de associar os tópicos que aprendeu no livro com os tipos de imagens e padrões que eles podem gerar. Por exemplo, você pode usar relações trigonométricas para desenhar círculos e, mais genéricamente, polígonos, figuras radialmente simétricas e espirais. Linhas e retas, quando formatadas de maneira inteligente, criam imagens complexas, curiosas aos olhos de quem vê. A programação recursiva que é um ponto chave em muitas técnicas de soluções de problemas numéricos na matemática, na arte gerativa é empregada para formar figuras autossimilares, os fractais. Você presenciou como regras simples repetidas ao longo de uma escala espacial dão forma a essas estruturas altamente elaboradas. Ainda no tópico de que o simples é capaz de conceber o complexo, você estudou a emergência, amplamente encontrada na natureza e em nossa própria sociedade. Ela é a manifestação suprema de como pequenas ações descorrelacionadas e locais podem explodir em eventos globais entrelaçados. No ápice de todos esses tópicos, você pôde testemunhar como o caos penetra no cerne da programação criativa, liberando o não determinismo. Sua principal consequência no gerativo é a multiplicação ao infinito dos detalhes e formas em seus padrões, tornando-os virtualmente únicos cada vez que você executar seu código.

Mesmo sabendo de tudo isso, assim como na parábola de Watts, nenhum desses tópicos é exclusivamente autocontido, eles não são feitos apenas para as tarefas aqui citadas. Trigonometria não desenha só círculos, fractais são apenas uma perna da recursividade e assim por diante. Os exemplos apresentados neste livro são os casos clássicos do uso dessas técnicas e não devem ser os limitadores de suas ideias, e sim os impulsionadores. Este último capítulo é dedicado a mostrar outras maneiras de se empregar as técnicas aprendidas e, paralelamente, obras de programadores/artistas que não tiveram a pretensão de explicar como usar a programação, apenas a usam com o intuito singular de criar. É neste estágio que o fator humano realmente é revelado.

Absorva as informações deste capítulo de forma puramente conceitual, uma inspiração do que pode ser atingido com a programação (criativa ou não). Em alguns momentos serão usadas funções e lógicas que implorariam por explicações aprofundadas, mas que infelizmente não cobriremos dada a própria premissa do livro. Tal fato será contrabalançado por exemplos simples que servirão como fomentadores de projetos e faróis de guia em suas futuras jornadas.

8.1 Tratamento de imagens

O tratamento de fotos e imagens é uma atividade inconscientemente consolidada em nosso cotidiano. Hoje ela não é mais restrita aos profissionais do mundo da fotografia que usavam softwares avançados e crípticos, ela é presente como funcionalidade em redes sociais e álbuns digitais. Tais programas contam com inúmeros filtros de correção de contraste, saturação e luminosidade, em adição aos filtros artísticos de realce de cores ou estilização da foto. Do ponto de vista computacional, esses programas são capazes de alterar elementos visuais através de informações que extraem das próprias imagens, tais como cores e posicionamento espacial do pixel. Estes, por sua vez, são usados como entradas para um algoritmo responsável por, a nível atômico, executar operações pixel a pixel respeitando uma lógica interna. A manipulação de imagens é, atualmente, assunto de vários artigos científicos que buscam melhorias na velocidade e qualidade do processamento.

A linguagem Processing conta com variáveis e funções destinadas à leitura e escrita de arquivos de imagens (.gif, .jpg e .png dentre outros) e é preparada para buscar propriedades das mesmas. Esta é uma grande vantagem uma vez que permite que desenvolvamos nossas próprias rotinas de experimentação, combinação ou alteração de imagens por meio de filtros customizados. No cenário da arte computacional encontramos artistas que compartilham desse sentimento exploratório como o espanhol Sergio Albiac, que conta com uma expressiva coleção de peças que brilhantemente fundem a fotografia clássica com técnicas gerativas. O resultado, figura 8.1, são imagens de natureza elusiva, não delimitadas, reflexo de uma incubação enraizada no caos.

Figura 8.1 - Statistical beauty a, cortesia do próprio artista, Sergio Albiac.
a Licenciada sobre Creative Commons BY-NC-ND.

Demonstraremos a capacidade do Processing replicando uma técnica simultaneamente simplória e mesmerizante, o pontilhismo, desenvolvida no final de 1880 por Georges Seurat e Paul Signac como uma vertente do Impressionismo. Ela é caracterizada pela reprodução de uma imagem através da deposição de tinta por pontos, exercício incrivelmente repetitivo e demorado na arte tradicional em que, por outro lado, o computador se sobressai. No código abaixo é carregado um arquivo de imagem, intitulado "Imagem.png" [2], através da função loadImage(), armazenando seu conteúdo na classe PImage [3]. Em seguida um pixel aleatório dentro dessa imagem tem sua cor amostrada através do método público get() e utilizada para preencher um ponto de densidade constante, representado por uma elipse, em sua mesma posição. O processo é completado ao repetirmos esses mesmos passos milhares de vezes, veja o resultado em 8.2.

Código 8.1 -

// Estrutura de dados que armazena arquivos de imagem:
PImage imagem;

// Tamanho do ponto:
float r = 5;

// Número de pontos que compõem o pontilhismo:
int n = 100000;

void setup() {
size(360,300);
background(255);
noStroke();

// Carrega o arquivo de foto que está dentro da pasta "data":
imagem = loadImage("Imagem.jpg");

for(int i = 0; i < n; i++) {
// Escolhe um pixel aleatório da imagem carregada e obtém sua cor:
int x = round(random(imagem.width-1));
int y = round(random(imagem.height-1));
color c = imagem.get(x,y);

// Colore e posiciona o ponto (representado por uma elipse)
// no local em que foi amostrado:
fill(c);
ellipse(x,y,r,r);
}
}
Figura 8.2 - Imagem original.
Figura 8.3 - Pontilhismo.
Figura - 8.2 - Baseado em: "Hipopótamo", presente de Edward S. Harkness, 1917, cortesiab do Metropolitan Museum of Art, New York.
b Todos os direitos reservados pela instituição.

8.2 Áudio/Visual

O gerativo como uma peça estática foi amplamente explorado neste livro, mas ele também pode ser empregado em instalações áudio visuais vivas que incessantemente se regeneram e mutam, dando vida a peças de longa duração. Neste tipo de programa, áudio e vídeo trabalham sinergicamente, com papéis complementares, enriquecendo a obra de maneira singular. Trabalhos assim podem ser encontrado ecléticamente decorando shoppings, projetados em fachadas de prédios e até acompanhando músicas em casas noturnas. Um dos exemplos mais belos e bem executados dessa integração é do artista chinês Ruiwen Guo, conhecido como Raven Kwok. Ele desenvolveu uma série de algoritmos cujas saídas são visualizações, figura 8.4, que respondem a notas e batidas em músicas de um álbum[4] completo, efetivamente certificando a versatilidade de códigos gerativos.

Figura 8.4 - Stickup Screenshot 09 c, cortesia do próprio artista, Raven Kwok.
c Todos os direitos reservados pelo artista original.

O Processing possuí módulos externos[5] para carregar arquivos de som, viabilizando a reprodução, sequenciamento, mixagem e até mesmo análise de frequência sonora através da FFT[6]. Cabe ressaltar que, assim como o processamento de imagens, a análise de áudios é um tema contemporâneo, prestigiado por muitos pesquisadores e, por enquanto, ainda não é uma ciência integralmente desbravada. Notas musicais e batidas são conceitos complexos do ponto de vista de sinais de dados, com formas de ondas heterogêneas, que requerem o uso de princípios como detecção de energia e segmentação em tempo/frequência, além de sofrerem sobreposições e múltiplas interferências nas gravações[7]. No projeto citado de Kwok as imagens gerativas são produtos do Processing, mas o ato colossal de separar e escrever o sequencial sonoro das faixas foi, em sua maioria, manualmente levantado pelo artista. Somente com essa estratégia ele conseguiu garantir o sincronismo perfeito entre áudio e vídeo.

O potencial para desenvolver peças completamente automatizadas na esfera do reativo ao áudio, ainda que limitado no Processing, é válido de ser demonstrado em sua forma básica. O primeiro passo é instalar a biblioteca de áudio seguindo o descritivo mostrado na seção 1.3. Ao abrir a janela de importação, digite "Minim" no campo de filtro, clique em Install e, quando terminar, reinicie o PDE. Foi dada preferência a essa biblioteca no lugar da Sound por apresentar, em geral, uma melhor compatibilidade com os sistemas operacionais. As funções da Minim só serão habilitadas após sua inclusão explícita em um programa através do comando import ddf.minim.* . O código abaixo é um dos mais simples que pode ser escrito para expor as operações com áudio. Nele carregamos[8] um arquivo de música, "Audio.mp3" [9], e dinamicamente projetamos a amplitude RMS[10] do sinal na janela de exibição, figura 8.5.

Código 8.2 -

// Biblioteca e variáveis Minim
import ddf.minim.*;
Minim minim;
AudioPlayer audio;

void setup() {
size(300, 300);
background(255);

// Cria o objeto minim - obrigatório para o funcionamento correto:
minim = new Minim(this);

// Carrega o arquivo de áudio que está dentro da pasta "data" e faz o playback:
audio = minim.loadFile("Audio.mp3", 1024);
audio.loop();
}

void draw() {
// O sinal de áudio em cada instante é dividido em 1024 amostras com
// valores entre -1 e 1 para cada canal (direito e esquerdo).
// Aqui fazemos uma média dos canais e armazenamos o valor para
// posteriormente desenhar o padrão.
float[] sinalAudio = new float[1024];
for(int i = 0; i < sinalAudio.length - 1; i++) {
float mediaAtual = (audio.left.get(i) + audio.right.get(i))/2.0;
sinalAudio[i] = mediaAtual;
}

strokeWeight(2);
stroke(random(255),random(255),random(255));

// Transforma a amplitude RMS do sinal para pontos em um círculo:
float divAngulo = 360.0/1024.0;
for(int i = 0; i < sinalAudio.length - 1; i++) {
float x1 = width/2 + (80 + 80*sinalAudio[i])*cos(i*radians(divAngulo));
float y1 = height/2 + (80 + 80*sinalAudio[i])*sin(i*radians(divAngulo));
point(x1,y1);
}
}
Figura 8.5 - Pontos em um círculo reagindo ao som.

8.3 Visualização de dados

O amanhecer da era da informação trouxe consigo uma série de facilidades para nossa sociedade. Um leve movimento de nossos dedos nos faz receber notícias de qualquer lugar do mundo ou compartilhar partes de nossas vidas por meios digitais. Lamentavelmente ela também acarreta em um inconveniente, vivemos em um ciclo no qual somos bombardeados e produzimos uma avalanche de informações cujo volume é tão monumental que a torna impossível de ser processada por completa. A construção da informação ocorre através de interpretações e associações de sua unidade básica, o dado, que assume a forma de números, letras, palavras, símbolos, imagens, sons e assim por diante. Entender como apresentá-lo de maneira correta para produzir uma mensagem de valor é uma missão desafiadora que requer sua própria especialidade. A visualização de dados é uma vertente das ciências da informação incumbida do tratamento, processamento e exposição efetiva de dados. Atualmente é uma das mais cobiçadas áreas em nossa era da informação. Um dos principais motivos de sua importância é que virtualmente tudo que fazemos hoje pode ser convertido para um tipo de dado e utilizado para gerar conhecimento ou tomar uma decisão.

O elemento primário de trabalho, o dado, é, em geral, derivado de uma medição ou amostragem de um episódio, evento ou objeto, caracterizando sua natureza determinística. Felizmente isso não é um contratempo uma vez que podemos aplicar a dimensão do gerativo caracterizada pelo mapeamento entre domínios[11] ou, em outras palavras, pela transformação de uma grandeza em outra[12]. Esses elementos podem ser explorados ainda mais profundamente se organizarmos ou propositadamente desorganizarmos suas relações, originando resultados visuais elaborados. Ilustraremos brevemente nesta subseção como a escolha da preparação de um dado impacta em sua exibição[13] em vez de abordarmos diretamente o gerativo. No exemplo a seguir são mostradas quatro maneiras de se interpretar[14] os dez mil primeiros algarismos que compõem as casas decimais do número π. A figura 8.6 representa um histograma, em forma de arco, da densidade dos números 0 a 9 que constituem a constante. Em 8.7, esses mesmos números correspondem ao ângulo de direção de um agente que se desloca no espaço. A visualização 8.8 exibe uma colorização de qual par numérico é mais recorrente ao selecionarmos como amostra dois números sequenciais de π. Por último, 8.9, demonstra conexões em forma de curva entre os sucessivos algarismos dos decimais de π.

Figura 8.10 - Parte da constante Pi.
Figura 8.6 - Histograma em arcos.
Figura 8.7 - Deslocamento espacial.
Figura 8.8 - Densidade de sequências numéricas.
Figura 8.9 - Conexões entre dígitos.
Figura - 8.11 - Visualização de dez mil casas decimais do número π.

Veja que nenhuma dessas visualizações, com exceção da primeira, são particularmente "úteis" ou efetivas, podendo ser classificadas mais como artísticas do que científicas. Também é curioso que as imagens geradas são excepcionalmente imprevisíveis, mesmo fazendo o uso de dados 100% determinísticos, fato justificado pela nossa capacidade limitada de interpretar ou abstrair uma grande quantidade de variáveis e interações.

Esse fenômeno pode ser confirmado ao observarmos tanto obras de natureza artística quanto científica, como a de Martin Krzywinski que combina dados, visualizações criativas e estratégias inteligentes ao invés de se apoiar nas funções random() e noise(). Em seu projeto, The Universe: Supercluesters & Voids, ele transformou uma lista dos mais conhecidos superaglomerados de galáxias de nosso universo em um mapa que contempla mais de dois bilhões de anos luz no sistema supergaláctico de coordenadas. O trabalho dele se mostra impressionante ao incluir constelações, estrelas, vazios e supervazios, explodindo em uma paisagem espetacular, figura 8.12, em que a ordem expira o caos.

Figura 8.12 - The Universe: Supercluesters & Voids d, cortesia dos próprios autores, Martin Krzywinski do Centro de Ciências do Genoma, Vancouver, Canada, e Viorica Hrincu.
d Todos os direitos reservados pelos autores originais.

Em programas cujo objetivo é a visualização de informações, tem-se como premissa a disponibilidade dos dados. Eles podem ser de natureza on-line, medidos e atualizados constantemente, ou off-line, provenientes de uma base histórica. A leitura de um arquivo se encaixa nessa segunda modalidade e usaremos um texto como a fonte de sinais de entrada. No Processing podemos consultar um arquivo com extensão .txt (.csv, .ini, .dat) através da função loadStrings() [15] , que retorna um vetor multidimensional do tipo String com o seu conteúdo. O primeiro índice desse vetor armazena uma linha completa do arquivo e o segundo índice o carácter na posição dessa respectiva linha. A variável íntegra, neste estado, é crua, composta pela aglomeração de letras, números e símbolos, usualmente necessitando de pós-processamentos que incluem a substituição de caracteres indesejados e a quebra da linha em palavras ou letras através de outras funções. No exemplo abaixo carregamos um arquivo nomeado "Texto.txt" [16] e exibimos seu conteúdo[17] letra a letra, ciclicamente, na janela de exibição.

Código 8.3 -

// Arquivo de texto:
String conteudoArquivo[];
char linhaArquivo[];
int indiceLinha = 0, indiceLetra = 0;

float x = 0, y = 25;

void setup() {
size(800,200);
background(255);

// Carrega o arquivo de texto que está dentro da pasta "data":
conteudoArquivo = loadStrings("Texto.txt");

// Transfere a linha do arquivo da posição "indiceLinha" para um vetor
// contendo os caracteres dela:
linhaArquivo = conteudoArquivo[indiceLinha].toCharArray();
}

void draw() {
// Escreve a letra na tela:
fill(0);
text(linhaArquivo[indiceLetra],x,y);

// Atualiza as variáveis de desenho:
x += 7;
y += 10*(0.5 - noise(x));

// Se chegar ao final da janela, volta para o início:
if(x >= width) {
x = 0;
}

// Atualiza a posição da próxima letra da linha do arquivo:
indiceLetra++;

// Se chegar ao final da linha do arquivo, pula para a próxima:
if(indiceLetra >= linhaArquivo.length) {
indiceLetra = 0;
indiceLinha++;
linhaArquivo = conteudoArquivo[indiceLinha].toCharArray();
}
}
Figura 8.13 - Arquivo de texto sendo exibido na janela de saída.

8.4 Design computacional

O advento da simplificação de novas tecnologias permitiu cada vez mais que elas se tornassem amigáveis para os usuários, passando a ser moldadas em ferramentas de auxílio a áreas técnicas e artísticas. O design auxiliado por computador (CAD, do inglês, Computer Aided Design) é um domínio que continuamente vem se beneficiando de softwares de desenho, projeto, simulação e análise que aceleram a velocidade de trabalho de profissionais das mais abrangentes especialidades. O espectro coberto pela palavra CAD em si é muito amplo, e inclui o computador como aliado na execução de tarefas que englobam desde esquematizações arquitetônicas a otimizações em paletas de turbinas eólicas.

O gerativo pode ser empregado como um colaborador no CAD, aumentando exponencialmente a quantidade e variedade de protótipos e cenários. Uma indústria que se favorece imensamente com essa prática é a dos jogos digitais, em que é possível aplicar sinais caóticos e, paralelamente, formular leis que alimentam um algoritmo capaz de estruturar mundos de maneira inteiramente automática, tornando cada experiência única. Um exemplo concreto do design gerativo são os diversos produtos oferecidos pelo estúdio de design Nervous System . Em sua linha de iluminação encontramos a Hypae, figura 8.14 , uma luminária desenhada completamente por um software dotado de funções que emulam uma expansão orgânica. A peça literalmente cresce a partir de uma base ao seguir um algoritmo de venação foliar guiado por superfícies paramétricas e costurado por triangulações tridimensionais. O resultado é uma obra gerativa fascinante com contornos naturais e detalhes exclusivos entalhados em cada unidade.

Figura 8.14 - Hyphae Lamp e, cortesia da própria empresa que fabrica as peças, Nervous System.
e Todos os direitos reservados pelo artista original.

Citando especificamente softwares CAD, como aqueles desenvolvidos pela Autodesk, temos uma recente comercialização[18] que inclui módulos gerativos. Essa interface costuma receber um modelo medular do projetista e progressivamente o reforma por meio de técnicas que incorporam agentes autônomos, algoritmos evolucionários e redes neurais artificiais. O resultado são de dezenas a milhares de alternativas que satisfazem as restrições de projeto. Uma abordagem similar que caminha lado a lado com o gerativo é a do design paramétrico, no qual se parametrizam certas propriedades do projeto através de variáveis e regras bem definidas, contidas em um universo finito de possibilidades. O computador, então, itera sobre todas as combinações existentes, formando uma população de modelos candidatos.

Talvez seja natural que os próprios profissionais dos setores criativos da indústria questionem sobre práticas que se baseiam na automação, argumentando que não envolveria o recurso humano, tornando a peça resultante menos completa do que ela realmente poderia ser. No entanto, utilizar de técnicas gerativas ou paramétricas para auxiliar no design de um produto, ou qualquer que seja a obra final, não implica em obrigatoriamente escolher o item gerado pelo computador. O gerativo é um grande aliado ao fornecer inúmeros modelos microvariados que podem ser utilizados para expandir a visão do profissional. Sob este foco, o gerativo abraça o papel de inspirador em vez do substituto.

O processo do design, intrinsecamente falando, é uma tarefa com uma elevada dose de fator humano. Parte dessa necessidade vem das perguntas que devem ser respondidas antes mesmo de se começar: Qual o objetivo do design, é um produto, uma mensagem, uma obra, etc. Como será idealizado o projeto, qual o público, o meio de divulgação, etc. São incontáveis as "variáveis" que esculpem os limites da fabricação final, sendo quase impossível exemplificar um caso concreto sem dissertar extensamente sobre ele. Não obstante, é de grande valor podermos analisar como usar o código para auxiliar na visualização de possibilidades de um design e, para tal propósito, iremos usar um caso hipotético e extremamente simplificado. Considere uma empresa que deseje firmar sua identidade visual através de um símbolo[19] formado por três triângulos inscritos dentro de um círculo[20]. A cliente não sabe exatamente como esses triângulos devem estar dispostos, o que leva a infinitas combinações nas posição dos vértices e, consequentemente, no número de possibilidades. Aplicar uma tática puramente paramétrica, que itera sobre todos os casos, não é vantajoso pelo motivo citado acima. Iremos tratar o problema usando um plano híbrido, em que os vértices dos triângulos serão parametrizados, mas assumirão valores aleatórios dentro do conjunto válido que é a borda do círculo. O código abaixo desenha o símbolo contemplando as regras definidas pela empresa e o seu resultado é ilustrado na figura 8.15:

Código 8.4 -

void setup() {
size(300,300);
background(255);
desenhaSimbolo(100);
}

// Função para desenhar o símbolo:
// Regra: Três triângulos inscritos em um círculo
void desenhaSimbolo(float _raio) {
noFill();

ellipse(width/2,height/2,2*_raio,2*_raio);

// Como são três triângulos, são necessárias três repetições
for(int j = 0; j < 3; j++) {

// Armazena os ângulos dos pontos dos triângulos:
float[] a = new float[3];

// Cada triângulo é composto por três pontos, posicionados na
// superfície de um círculo com ângulos aleatórios (0 a 360 graus)
for(int i = 0; i < 3; i++) {
a[i] = radians(random(360));
}

// Desenha o triângulo
triangle(width/2 + _raio*cos(a[0]), // Ponto 1, coord. x
height/2 + _raio*sin(a[0]), // Ponto 1, coord. y
width/2 + _raio*cos(a[1]), // Ponto 2, coord. x
height/2 + _raio*sin(a[1]), // Ponto 2, coord. y
width/2 + _raio*cos(a[2]), // Ponto 3, coord. x
height/2 + _raio*sin(a[2]) // Ponto 3, coord. y
);
}
}
Figura 8.15 - Três triângulos inscritos em um círculo.

Veja que ele foi escrito prontamente a partir de conceitos explicados nas seções passadas, nenhum particularmente complicado, resultando em protótipos brutos, mas cujos objetivos foram estritamente cumpridos. Isso significa que a forma pode ser posteriormente trabalhada e aperfeiçoada até o produto final. Claro que, mesmo do ponto de vista do design paramétrico, este exemplo foi reduzido ao máximo: uma única regra. Veja a figura 8.16 em que se empilharam múltiplas leis distintas, ampliando a utilidade deste tipo de estratégia.

Figura 8.16 - Etapas do refinamento das regras paramétricas.

A versão gerativa deste mesmo estudo de caso é formulada através da concepção de um agente autônomo análogo aquele do capítulo 7, com a diferença de que a região limite em que ele deve se manter dentro será um círculo em vez de um retângulo. Com o auxílio de formatações condicionais conseguimos resultados, figura 8.17, muito parecidos com os do paramétrico, apesar de serem técnicas fundamentalmente distintas. A figura 8.18 mostra uma extrapolação da segunda forma de 8.17 em que foram realizadas mudanças de cores, espelhamentos e rotações, todas respeitando as condições de projeto, para criar o logotipo da empresa Drakein [21]. Este caso fortifica o papel do gerativo como um assessor na idealização de suas próprias produções.

Figura 8.17 - Família de símbolos gerados através de agentes autônomos.
Figura 8.18 - Logotipo da empresa Drakein.

Para finalizar esta seção é relevante evidenciar o papel do código como aquele que de fato talvez seja esperado dele, o de ferramenta técnica e objetiva. Assim como qualquer outra linguagem de programação, o Processing pode ser utilizado para suprir necessidades ou metas específicas. Por exemplo, no código 8.5, resultado na figura 8.19, foi desenvolvido um contador em que, cada vez que o usuário clicar no centro da janela do programa, o número de contagens incrementa em um. Não há nada de artístico ou criativo nisso, ele existe apenas para efetuar uma tarefa: contar. Em 8.20, usamos a linguagem para desenvolver um software bem mais complexo do ponto de vista técnico[22]. Ele constrói um modelo tridimensional de um objeto ou equipamento cilindricamente simétrico e, a partir de interpolações de leituras de temperaturas de instrumentos[23] em campo, traça um perfil térmico de fácil visualização. Tal solução poderia ser usada em aplicações que incluem desde altos fornos da indústria siderúrgica até em silos de grãos da alimentícia. Em ambos os casos o Processing foi configurado como uma aplicação de engenharia, com métricas de expectativas, conformação e resultados. Porém, note um ponto interessante, projetar um framework para trabalhos desse tipo se beneficia de um experiência prévia com o código criativo visto que existe a manipulação da exposição da informação (cores, formas e demais elementos que fazem parte da formatação e visualização efetiva dos dados) e posicionamentos espaciais (auxiliado pela distribuição de figuras geométricas). A emergência do gestalt , de uma visão holística da diversidade e associações entre áreas do conhecimento, é fundamental para aprimorar suas obras independente de seu propósito: arte, ciência, ou talvez como os sábios renascentistas faziam, uma mistura dos dois.

Código 8.5 - Programa contador -

int contador = 0;

void setup() {
size(310,640);
textAlign(CENTER);
}

void draw() {
background(204);

// Desenha os botões de interface:
fill(255);
rect(10,160,290,150);
rect(10,320,290,150);
rect(10,480,290,150);

// Escreve os textos do aplicativo:
fill(0);
textSize(40);
text("Contador: ", 155, 64);
text(contador, 155, 125);
textSize(100);
text("+",155,260);
text("-",155,425);
text("0",155,590);
}

// Trata os cliques sobre os botões (eixo x desconsiderado):
void mousePressed() {
if(mouseY > 160 && mouseY < 310) {
contador++;
}
else {
if(mouseY > 320 && mouseY < 470) {
contador--;
}
else {
if(mouseY > 480 && mouseY < 630) {
contador = 0;
}
}
}
}
Figura 8.19 - Contador manual sendo executado em um dispositivo Android.
Figura 8.20 - Distribuição térmica em um modelo de alto-forno.
Figura - 8.21 - Processing utilizado como software de engenharia.

8.5 Sumário

Este capítulo foi dedicado à explorar uma visão pragmática da programação, na qual os tópicos previamente estudados foram reinterpretados e moldados em composições não ortodoxas. As subseções ilustram áreas em que a programação criativa encontra seu espaço, protagonizando soluções que impressionam com a versatilidade de suas aplicações. É um capítulo desafiador de ser exemplificado sem entrar em um labirinto de explicações e considerações subjetivas. Cada ideia apresentada facilmente evolui para iniciativas que envolvem múltiplas áreas de conhecimento e sofrem sucessivas alterações até suas formas, questionavelmente, finalizadas; como atribuído a Leonardo da Vinci, "A arte nunca é terminada, apenas abandonada".

 

 


[1] Alan Watts, auto proclamado "animador espiritual", não é um autor clássico quando o assunto é Zen Budismo, mas o ponto aqui é ilustrar como a linguagem ou o próprio meio de ensino, qualquer que seja, pode limitar nossa capacidade de abstração se não formos críticos em nossas análises e interpretações.

[2] Este arquivo deve estar dentro da pasta "data" no diretório em que você salvou o programa. Isso pode ser feito acessando a barra de menus do PDE do Processing, depois em Sketch e Adicionar Ficheiro.... Na janela que abrirá, escolha o seu arquivo de imagem. O procedimento foi detalhado na seção 1.3.

[3] A classe PImage, nativa do Processing, tem como propósito guardar imagens e facilitar o acesso aos atributos e pixels da mesma. Ela ainda conta com métodos de manipulação de imagens do tipo máscara, filtros, combinações e redimensionamento.

[4] New Age | Dark Age por Karma Fields.

[5] O PDE nativo não incluí o processamento de arquivos de som, funcionalidades adicionadas pelas bibliotecas Minim, de Fede e Mills, ou Sound da Processing Foundation.

[6] Transformada Rápida de Fourier ou, do inglês, Fast Fourier Transform.

[7] Müller, M. et al. (2011). Signal Processing for Music Analysis. IEEE Journal of Selected Topics in Signal Processing 5(6): pags.1088-1110.

[8] Este arquivo deve ser importado para o seu programa usando o mesmo procedimento citado na seção anterior.

[9] Faixa "Horizon Ending", cortesia do artista Soft and Furious. Licenciada sobre Creative Commons CC0 1.0 Universal.

[10] Raiz do Valor Quadrático Médio ou, do inglês, Root Mean Square.

[11] Galanter, P. (2006). Generative art and rules-based art. Vague Terrain (3).

[12] Por exemplo, valor de temperatura para uma cor, ou dados do mercado de ações em sons.

[13] inclusive, esse é um dos principais fatores dos quais temos que estar atentos durante a leitura de informações provenientes de meios que se estendem desde revistas e jornais, até livros e artigos científicos

[14] Inspirado em trabalhos como os de Martin Krzywinski e Cristian Ilies Vasile.

[15] A função loadStrings() é desaconselhada na leitura de textos muito extensos, pois ele será carregado integralmente na memória do computador. Uma opção mais adequada seria a classe BufferedReader para ler os arquivos aos poucos e não sobrecarregar o sistema.

[16] Este arquivo deve ser importado para o seu programa usando o mesmo procedimento descritos nas seções anteriores.

[17] Excerto de vinte mil léguas submarinas de Jules Verne, domínio público, parte do Projeto Gutenberg.

[18] Alternativas gratuitas incluem o Generative Components e o Rhino-Grasshopper.

[19] Representação gráfica de uma marca de uma empresa.

[20] O motivo do porquê dessa forma específica pode ser justificado por respostas de uma série de perguntas conforme mostrado anteriormente, mas o escopo deste livro é programação e não teoria de design e, portanto, isto não será discutido aqui.

[21] O nome e o símbolo representados na figura 8.18 são completamente fictícios e foram inventados pelo autor com o objetivo único de proporcionar um exemplo para este livro. O autor se dedicou a pesquisar o nome e, até a data de publicação do texto original, não encontrou nenhuma referência comercial a ele.

[22] O software desenvolvido contempla funções como triangulamentos, conexões com banco de dados e ajustes de câmera para visão tridimensional.

[23] Termopares, termistores e termorresistências são alguns deles.