TRABALHO DE MAMI - Gerador Automático de Arte
Objetivos
1.selecione uma série específica de obras de um artista à sua escolha.
2.analise matematicamente as características (quantidades de elementos, formas, cores, ângulos, dimensões, espaçamentos, proporções, gradações, divisões, ...) geralmente presentes nas obras da série escolhida.
3.crie uma aplicação que gera automaticamente obras com base em quatro das características analisadas (armazenadas em variáveis globais).
4.em um post específico em seu blog, apresente todo o processo de desenvolvimento, demonstrando e discutindo diferentes resultados da aplicação criada.
1.Artista escolhido : Sol Lewitt


2. Caracteristicas do conjunto de obras:
Quantidade de Elementos:
- linhas, cores, formas, moldura.
Formas:
-Triangulo, arcos, semi-elipses e retas(verticais, horizontais e diagonais).
Cores:
- A obra padrão do autor costuma aceitar 5 padrões de cores.
Angulos:
- A grande maioria dos angulos das linhas é de 90º e das retas em diagonal é 45º.
Dimensões e Proporção
-As obras são é composto por uma moldura que envolve os quadros, o formato mantem uma dimensão 1:1. A grande maioria das linhas estão posicionadas centralizadas ou a 1/3 de distancia de algumas das bordas.
Espaçamentos:
Espaçamentos:
- Em 1/4 da tela existem cerca de 20 retas sendo criadas.
Divisões:
- Os quadros podem não trazer nenhuma linha divisória ou são divividas em 3 ou 4 quadrantes.
3. Características Adotadas e a Aplicação:
Elementos adotados: Foi mantido no código a moldura branca, das linhas apenas linhas com um angulo reto e foi mantido um padrão de 4 quadrantes, entretanto diferente da obra original, os quatro quadrantes foram construídos onde inicialmente existiam apenas 3. ou seja as linhas que aparecem cruzam o quadro de uma ponta à outra. Existe também a possibilidade de quadros que não possuem nenhuma reta. Em relação ao numero de cores, novas cores foram adicionadas, mudando de 5 para 8, mas tentando não perder as características da obra.
O Código:
É na declaração de variaveis que encontramos os primeiros valores gerados randomicamente. "lVertical" e "lHorizontal" vão definir como ocorrerá a divisão da tela.
A Obra é chamada toda no Setup, não houve necessidade de usar o 'draw' , visto que a obra é estatica.
O Setup vai chamar tres funções: ChamadaFormas(), nela será possivel definir que forma aparecerá em cada espaço.
Devido problemas durante a programação da criação de arcos foi criada uma função chamada Sorteador de Arcos();
A Obra é chamada toda no Setup, não houve necessidade de usar o 'draw' , visto que a obra é estatica.
O Setup vai chamar tres funções: ChamadaFormas(), nela será possivel definir que forma aparecerá em cada espaço.
Devido problemas durante a programação da criação de arcos foi criada uma função chamada Sorteador de Arcos();
Quando os arcos eram inicialmente sorteados junto com as retas corria o risco de na obra aparecerem somente retas, observado o conjunto escolhido é possível reparar que quase todas as obras apresentam pelo menos um arco ou semi-arco.
Foi corrigida essa deficiência com a função, apesar de no modelo original algumas imagens possuírem mais de um arco. Nesse caso especificamente todas as figuras que possuírem mais de 1 linha desenhadas vão receber um quadrante preenchido por uma coleção de arcos concêntricos.
A função cores a priori recebia dentro do sorteio uma variável chamada cor e os valores em color eram divididos em três variáveis (R,G,B). Isso tornou o código extremamente longo e Causou problema durante a programação quando dentro de uma função coloquei outras variáveis locais que recebiam o mesmo nome, as cores ficavam desfiguradas.
Um modelo Elegante foi usar o 'color' ele guarda como numa especie de vetor os elementos do RGB. Isso fez com que o código diminuísse varias linhas e ficasse menos repetitivo dentro de outras funções. Onde era necessário ficar chamando a cor randomicamente varias vezes.
Um modelo Elegante foi usar o 'color' ele guarda como numa especie de vetor os elementos do RGB. Isso fez com que o código diminuísse varias linhas e ficasse menos repetitivo dentro de outras funções. Onde era necessário ficar chamando a cor randomicamente varias vezes.
Com Relação as cores mesmo, as 5 cores fazem referencia as cores principais, como na imagem analisada existem varias cores que se mixam devido a sua proximidade, para uma tela maior optei por adcionar outras duas cores, um tom de rosa e um tom de verde marinho. Existia também a necessidade de aumentar a diversidade de cores, pois não consegui criar um algorítimo que evitasse cores de se repetirem. Assim as formas tiveram de continuar com o contorno que não existe na obra original.
Na imagem acima temos 4 funções:
As funções linhasVerticais e linhasHorizontais sorteiam as posições de cada linha nos respectivos eixos. As linhas verticais são chamadas dentro das linhas verticais para evitar que apenas uma linha fosse sorteada e a tela fosse partida em duas. Fazendo assim se na lvertical o valor for igual a zero, o código já irá randomizar figuras especificas que não são associadas a padrões.
As funções elipses e triângulos no centro são exatamente a mostra desses padrões da tela sem linhas.
Existem alguns problemas com a criação dos triângulos, apesar de concêntricos eles não estão crescendo em proporções perfeitas.
Na função elipse o raio possui um valor muito maior que a tela pois devido ao corpo arredondado, nos cantos da tela ficava um espaço vazado e sem preenchimento.
As funções elipses e triângulos no centro são exatamente a mostra desses padrões da tela sem linhas.
Existem alguns problemas com a criação dos triângulos, apesar de concêntricos eles não estão crescendo em proporções perfeitas.
Na função elipse o raio possui um valor muito maior que a tela pois devido ao corpo arredondado, nos cantos da tela ficava um espaço vazado e sem preenchimento.
Outras formas essenciais para o funcionamento do código estão representadas nas seguintes funções.
retangulosHZT cria retângulos com a orientação Horizontal e o retangulosVTC cria com a orientação vertical. Os códigos são bastante semelhantes e recebem esses valores M e L que definidos em outra parte do código mostram a distancia no eixo X e Y que as funções podem preencher. Essas variáveis são extremamente importantes pois praticamente todos os dados gerados no código são aleatórios e elas resolvem a conversão dos valores.
Uma grande dificuldade na hora da programação e um dos pontos decisivos foi optar por não fazer retas inclinadas e nem arcos q surgissem em qualquer direção. Havia um grande risco de partes da obra ficar vazando para outros espaços e como todas as posições são randômicas, não havia a possibilidade de optar por um espaço ser desenhado primeiro do que outro. Assim uma solução para construir os arcos foi fazer com que eles sempre estivessem sendo criados de "dentro pra fora" ( o processo não é bem assim porque os arcos menores seriam sobrepostos).
retangulosHZT cria retângulos com a orientação Horizontal e o retangulosVTC cria com a orientação vertical. Os códigos são bastante semelhantes e recebem esses valores M e L que definidos em outra parte do código mostram a distancia no eixo X e Y que as funções podem preencher. Essas variáveis são extremamente importantes pois praticamente todos os dados gerados no código são aleatórios e elas resolvem a conversão dos valores.
Uma grande dificuldade na hora da programação e um dos pontos decisivos foi optar por não fazer retas inclinadas e nem arcos q surgissem em qualquer direção. Havia um grande risco de partes da obra ficar vazando para outros espaços e como todas as posições são randômicas, não havia a possibilidade de optar por um espaço ser desenhado primeiro do que outro. Assim uma solução para construir os arcos foi fazer com que eles sempre estivessem sendo criados de "dentro pra fora" ( o processo não é bem assim porque os arcos menores seriam sobrepostos).
Chega o momento de começar a organizar os elementos dentro do código.
A função quadrante vai delimitar exatamente quantos elementos podem ser criados por quadrante e as respectivas posições em que cada coisa pode aparecer.
Umas das vantagens de trabalhar com 4 quadrantes foi conseguir gerar uma certa ordem de lógica para a criação dos elementos.
Nos quadrantes são criados somente as funções com retas. Apos serem criados é chamado no Setup a função sorteadordeArcos() como já foi explicado no começo da discussão. E que é ilustrado na próxima figura.
A função quadrante vai delimitar exatamente quantos elementos podem ser criados por quadrante e as respectivas posições em que cada coisa pode aparecer.
Umas das vantagens de trabalhar com 4 quadrantes foi conseguir gerar uma certa ordem de lógica para a criação dos elementos.
Nos quadrantes são criados somente as funções com retas. Apos serem criados é chamado no Setup a função sorteadordeArcos() como já foi explicado no começo da discussão. E que é ilustrado na próxima figura.
Como os Arcos gerados sempre vão partir de uma direção dentro da obra. Nessa função os arcos estão divisos por quadrante.
Se todas as peças fossem criadas juntas fariam uma grande elipse.
Com o sistema de sorteio pelo menos um dos arcos será criado.
E Por ultimo a função que define os parâmetros para a criação de todos os elementos, a função chamadaForma().
Está definido que quando não existe nenhuma aresta podem ser criados triângulos concêntricos, uma grande elipse concêntrica ( que foi um estilo adicional ao programa , visto que nas obras não existe esse modelo especificamente, mas criei baseado na tela dos triângulos), e o ultimo exemplo que cria três arcos que se sobrepõem, da mesma forma como na ultima obra de referencia do Sol Lewitt.
Está definido que quando não existe nenhuma aresta podem ser criados triângulos concêntricos, uma grande elipse concêntrica ( que foi um estilo adicional ao programa , visto que nas obras não existe esse modelo especificamente, mas criei baseado na tela dos triângulos), e o ultimo exemplo que cria três arcos que se sobrepõem, da mesma forma como na ultima obra de referencia do Sol Lewitt.
Nessa parte final do código houve um trabalho grande para mensurar exatamente a criação e os valores de cada variável. As linhas verticais serviram como o principal parâmetro.
Nesse esquema j vai representar o eixo x dentro de algumas funções, e o h representa a altura. M e L definem as direções de crescimento das funções e o tamanho máximo que as formas podem alcançar.
A função quadrantes é chamada nessa parte do código e recebe os valores de cada condição que ocorra delas se encaixarem.
.
.
.
.
.
.
.
.
.
.
.
.
.
4- Resultados
As quatro caracteristicas mantidas e que são geradas randomicamente: existencia de quadros com ou sem arestas, presença de arestas verticais e horizontais, formas diferentes e cores randomicas.
Amostras coletadas com o código podem ser observadas nas ilustrações abaixo. O codigo pode ser baixado no LINK.
Quando não existem arestas
Com arestas em diferentes posições
Comentários
Postar um comentário