• Nenhum resultado encontrado

Implementação computacional

6.1 DEFINIÇÃO DO BLOCO ELEMENTAR

6.1.1 Implementação computacional

Como se pode observar por meio dos estudos de caso, os blocos elementares permitem produzir uma composição geométrica a partir da conexão com seus pares. Essa conexão, em geral, deve ser um elemento geométrico cuja informação sobre sua construção possa ser extraída por meio de parâmetros numéricos. No caso do Watercube, os três tipos de faces dos dois poliedros que compõem a espuma Weaire-Phelan são comuns aos dois sólidos. Assim, todo o conjunto de poliedros pode ser descrito de maneira numérica, por exemplo, pelas coordenadas dos vértices destas faces. No caso do Fedsquare, cujo bloco elementar é um elemento plano, a vinculação informacional entre os elementos é feita a partir dos lados do triângulo de mesma dimensão.

Sendo o ponto o elemento mais fundamental do espaço euclidiano, descrever essa conexão entre os componentes do bloco elementar a partir de coordenadas cartesianas (X, Y e Z) é um dos caminhos mais eficientes para obter uma informação clara sobre um bloco elementar. Outras estratégias de aquisição da informação sobre esses blocos podem ser adotadas, mas a cada incremento informacional eleva-se exponencialmente a quantidade de informação a ser

manipulada. Em termos práticos, o endereçamento de uma reta como argumento de um sistema generativo pode ser efetuado a partir das coordenadas de suas extremidades, ou das coordenadas de uma das extremidades mais a sua inclinação e seu comprimento. Na primeira alternativa as informações podem ser agrupadas dentro de um mesmo plano, utilizando os três pontos. Na segunda, a informação é relacional e sugere necessariamente o conhecimento da inclinação da reta em relação a um dos planos projetivos (XY, XZ ou YZ).

Na construção do sistema generativo também é necessário estabelecer um referencial entre o bloco elementar e o autômato, que permita vincular a informação extraída a partir do elemento geométrico com os elementos iteráveis do CA. Nos experimentos realizados com os estudos de caso, os centroides, tanto dos sólidos da espuma Weaire-Phelan quanto dos triângulos da construção Pinwheel Tiling, funcionaram como elemento de ligação entre o bloco elementar e o dispositivo iterativo. Desse modo, a ideia é descrever quaisquer elementos, ou conjuntos de elementos, a partir de um elemento simples, e que pode ser representado numericamente.

Além disso, no conceito por detrás das estruturas dos dois estudos de caso, os blocos elementares foram individualizados em elementos 3D ou 2D e, assim, para se produzir as faces bidimensionais (parece redundante) nas fachadas do Watercube ou as barras não coplanares no Fedsquare, recorreu-se a procedimentos adicionais que não tinham relação com a ideia inicial dos blocos elementares. No entanto, ao se endereçar os elementos geométricos de maneira numérica dentro de um sistema generativo, o mesmo bloco elementar pode conter versões nos ambientes 2D e 3D e, desse modo, permitir a adaptabilidade do autômato para efetuar o preenchimento da forma segundo superfícies planas ou não, dependendo da posição do centroide. Um exemplo desse procedimento poderia ser a definição de um bloco elementar argumentado numericamente pelos quatro vértices de coordenadas A: (0,0,0); B (0,6,0); C: (3,6,0); D: (3,2,6), cuja versão bidimensional altera a posição do centroide e suprime a posição de memória onde está alocado o vértice D (Figura 82).

Não existe apenas uma maneira de efetuar a vinculação entre o bloco elementar e o dispositivo iterativo. Todos os elementos fundamentais do CA podem ser descritos com valores numéricos, de modo que a correspondência entre a geometria do bloco geométrico e o autômato pode ser construída compatibilizando as dimensões numéricas dos dois. Em geral, a base numérica que suporta os elementos de um CA: estados, vizinhanças, instantes de tempo e gerações, é descrita

a partir de números naturais e, assim, esse conjunto de números pode ser utilizado para estabelecer essa relação.

a. Bloco elementar na versão tridimensional ABCD

b. Bloco elementar na versão bidimensional ABC

Figura 82: Mesmo bloco elementar podendo funcionar nas versões 3D e 2D.

As células são slots de informação que não estão preenchidas ou não existem, pelo menos não antes de iniciar qualquer processo de iteração, o que torna esse elemento o mais adequado para representar uma geometria por meio de um autômato. Uma vez que não está preenchida, a célula é passível de representar qualquer elemento geométrico descrito por informações, como números reais. Embora estes conjuntos numéricos sejam algumas vezes representados por números naturais, as posições específicas no plano cartesiano, como os pontos de coordenadas X, Y e Z, podem ser descritos como uma lista ordenada de números naturais que representa coordenadas com casas decimais.

Dentre as possibilidades que a computação fornece para ordenar dados segundo uma lista, as matrizes estão entre as mais utilizadas e, no caso dos CA, pode-se utilizar os seus índices numéricos para identificar a proximidade entre as células. Uma célula identificada pelo índice 28 terá a sua esquerda a célula 27 e, a sua direita, a célula 29. De maneira mais geral, pode-se dizer que, para qualquer célula i, seus vizinhos são i - 1 e i + 1 e, desse modo, os pontos correspondentes de um bloco elementar podem ser endereçados pela posição que ocupam na configuração estrutural estabelecida.

No ambiente virtual, tanto as células quanto as regras podem ser programadas de maneira mais generalizada por meio de funções cuja estrutura básica pode permitir mudar o modo como operam. No Quadro 20 apresenta-se uma alternativa de endereçamento de blocos elementares

tanto para a estrutura Weaire-Phelan, como oito poliedros, quanto para uma estrutura piramidal, composta por meios octaedros.

Quadro 20: Alternativa de uma subrotina de programação na qual um CA pode ter suas células endereçadas a diferentes blocos elementares.

C# Porção de código

...

class CA { int[] celula; int[] regra; int w = 10; int geracao = 0;

// A variavel geracao vai receber o 0 inicialmente CA() { celula = new int[width/w]; regra = {0,1,0,1,1,0,1,0}; celula[celulas.length/2] = 1;

}

// Função para computar a nova geração

void geracao() {

int[] proxGer = new int[cells.length];

for (int i = 1; i < celulas.length-1; i++) { int left = celulas[i-1];

int me = celulas[i]; int right = celulas[i+1]; proxGer[i] = regra(esquerda, c, direita); }

celulas = proxgeracao;

// Incrementando um contador para a nova geração

geracao++; }

int regra(int a, int b, int c) { string s = "" + a + b + c;

int index = Integer.parseInt(s,2); return regra[index]; }

for (int i = 0; i < celula.length; i++) { if (celula[i] == 1) fill(0);

else fill(255);

// configurando a posicao y de acordo com a geração rect(i*w, geracao*w, w, w);

} } Fonte: Autor.

Nos experimentos efetuados com os estudos de caso, o endereçamento da geometria por pontos utilizou sempre malhas retangulares, uma vez que a forma global dos edifícios em questão era composta por elementos desse tipo. Nas células posicionadas nas bordas das malhas, isto é, de apenas um vizinho, a opção utilizada foi que as células se mantivesse estáticas, com o valor dos estados invariável. Isso funciona para a reprodução de estruturas como a do Watercube e do Fedsquare, que estão limitadas por superfícies planas e retangulares. Para outros tipos de superfície, é possível utilizar pelo menos duas estratégias:

 Bordas envolventes, imaginando o CA como um anel, isto é, a célula na borda esquerda é vizinha da célula da borda direita e vice-versa;

 As bordas têm regras específicas.

A primeira opção pode ser implementada utilizando um laço condicional que ignora as células nas bordas esquerda e direita, fazendo com que a iteração continue sendo mostrada entre a segunda e a penúltima. Nestas, a influência das três células vizinhas continua ocorrendo normalmente (Quadro 21).

Quadro 21: Sub-rotina que exclui as bordas do autômato.

C# Porção de código

...

for (int i = 1; i < celula.length-1; i++) {

//Um laço que não considera a primeira e a última célula int esquerda = celula[i-1];

int middle = celula[i]; int direita = celula[i+1];

int estadoSeguinte = regra(left,middle,right); celula[i] = estadoSeguinte;

} Fonte: Autor.

Nesta implementação, o mesmo o conceito de limites foi utilizado para propor restrições ao CA em pontos específicos de sua iteração. Graficamente, estes limites podem ser representados por semirretas, curvas, superfícies ou sólidos, que determinam locais onde o CA pode atuar durante o processo de iteração. Experimentalmente, utilizou-se uma curva conhecida interpolando pontos a partir de uma série de valores argumentados à função f(x) = sen θ e, assim, dispondo os valores de domínio e contradomínio como pontos cartesianos de coordenadas X e Z, respectivamente. A partir dessa curva-guia, buscou-se estratégias para definir limites para o sistema generativo.

Um tetraedro de faces triangulares foi definido como bloco elementar cujo ponto de menor cota, denominado de base, se encontra 3 unidades abaixo dos outros três A, B e C e estes descrevem um plano paralelo ao plano horizontal XY. Desse modo, o bloco elementar possui quatro faces iguais, triangulares, e com uma altura de 3 unidades. Além disso, determinou-se o centroide do tetraedro, que será utilizando como argumento do CA. A ideia foi vincular a curva-guia ao bloco elementar alinhando os pontos dessa curva aos centroides dos sólidos e delimitando a área de iteração do autômato a partir das distâncias entre os dois elementos (Figura 83).

a. Curva-guia para o sistema generativo.

b. Bloco elementar utilizado definido a partir dos pontos Base (3, 2, 0); A (3,6,3); B (6,0,3); C (0,0,3).

c. Vinculação entre o bloco elementar e os centroides.

Figura 83: Elementos do sistema generativo. Fonte: Autor.

Conforme se pode observar, a linha que passa por cada centroide intercepta a curva-guia em apenas um ponto e neste ponto a iteração deve ser interrompida por outra regra. Utilizando instruções condicionais, os pontos da curva podem ser vinculados aos pontos do bloco elementar por meio de linhas. As instruções consistem em determinar uma distância ou passo para células iteráveis a partir da posição que ocupam em relação à curva. Como o comando snap, comum em aplicativos de modelagem e que permite que o cursor se posicione apenas dentro de intervalos definidos, o snap da iteração deve ser a altura do bloco elementar. Desse modo, o CA opera em quaisquer quantidades de células, mas somente os blocos elementares inteiros são considerados como elemento da estrutura. Nesse caso, a instrução considerará somente as células (c) abaixo da curva e com distâncias em Z inferiores a 3 unidades: cviva = hinterseção – 3.

Portanto tem-se três grupos de dados numéricos: os centroides (verde), os pontos da curva (vermelho) e os nós da estrutura (azul). Os centroides são as células vivas iteráveis sobre as quais pode-se programar qualquer CA, 1D ou 2D, similares aos implementados nos estudos de caso, a fim de explorar configurações diversas. Os pontos da curva não iteráveis passam a fazer parte da estrutura e são vinculados aos blocos elementares de maneira automatizada, a partir de suas posições de memória. Por fim, os nós da estrutura são os vértices do bloco elementar que se conectam a partir de linhas e estas serão as barras da estrutura.

Nesta implementação, além de ajustar o CA dentro do espectro de busca definido pela curva- guia, buscou-se ainda uma segunda alternativa procurando correlacionar a própria curva-guia com as dimensões do bloco elementar. Isso pode ser feito correlacionando o intervalo de iteração baseado na altura do bloco elementar (snap) com os pontos de interseção na curva. Nesse caso se produz um abatimento da curva produzindo uma solução estrutural um pouco

distante da forma inicial pretendida. Por outro lado, tem-se uma configuração estrutural ainda mais racional, composta apenas de blocos inteiros ou meios blocos, podendo também ser efetuada sem o auxílio da curva-guia, apenas sugerindo valores para a instrução condicional (Quadro 22).

Quadro 22: Geração de estruturas a partir do sistema generativo. Grasshopper3D Porção de código

 Centróides (Células)

 Pontos na curva

 Nós da estrutura

Implementação

computacional por meio de componentes gráficos

Estrutura gerada pela curva seno e CA1D: Regra 255

Amortecimento da curva adaptando-a às dimensões do bloco elementar.

Fonte: Autor.

A partir desse conceito, soluções estruturais podem ser exploradas dentro de outros contextos arquitetônicos, cujas formas globais de um edifício podem ser delimitadas por superfícies ou por planos, como no caso dos estudos de caso. Nesse processo de pesquisa da forma estrutural, três estratégias devem estar claras: 1) definição de um ou mais blocos elementares, estabelecendo dimensões e determinando os elementos que funcionarão como argumentos do sistema generativo; 2) definição do espaço de busca da solução, que pode ser definido por espaços numéricos ou elementos geométricos, sendo que estes últimos também devem ser descritos de modo numérico e; 3) estabelecimento das regras nas bordas do autômato, a fim de

definir comportamentos que vão além dos limites de iteração baseado no bloco elementar (snap).

Os comportamentos apresentados pelos CA nas suas diferentes modalidades: uniformidade, periodicidade, complexidade e outros, podem ser utilizados como testes para o conceito apresentado dentro do ambiente de projeto. Como ferramenta criativa, esse método permitirá produzir diferentes candidatos a solução de projeto, os quais são passíveis de serem avaliados também dentro das plataformas de projetação paramétricas. Isso permite que a solução estrutural seja construída paulatinamente, em conjunto com as possibilidades não só da forma global do objeto arquitetônico, mas também do bloco elementar, incorporando, ao longo desse processo, soluções que contemplam estes campos correlatos de conhecimento.