Visualizar - Polis Educacional
Transcrição
Visualizar - Polis Educacional
Anderson Aparecido de Assis R.A. 0502004 UTILIZAÇÃO DE TÉCNICAS DE GEOMETRIA FRACTAL PARA GERAÇÃO DE IMAGENS Jaguariúna 2008 Anderson Aparecido de Assis R.A. 0502004 UTILIZAÇÃO DE TÉCNICAS DE GEOMETRIA FRACTAL PARA GERAÇÃO DE IMAGENS Monografia apresentada à disciplina Trabalho de Graduação, do Curso de Ciência da Computação da Faculdade de Jaguariúna, sob a orientação do Prof. Ms. Silvio Petroli Neto, como exigência essencial à conclusão do curso de graduação. Jaguariúna 2008 1 Aos meus pais, famíliares e amigos que sempre motivaram e apoiaram meus estudos. E também à Janaina Pimentel por sua paciência, apoio e dedicação. 2 AGRADECIMENTOS A realização desta Monografia só foi possível pelo apoio de inúmeras pessoas. A todos manifesto minha sincera gratidão. E de modo particular: Ao Professor e orientador Silvio Petroli Netto pela orientação dedicada e pelo constante estímulo em todas as fases de realização deste trabalho e durante as fases do meu estudo. 3 Viver é enfrentar um problema atrás do outro. O modo como você o encara é que faz a diferença. (Dr. Lair Ribeiro) 4 DE ASSIS, Anderson Aparecido. ESTUDO DE TÉCNICAS DE GEOMETRIA FRACTAL. Monografia (Bacharelado em Ciência da Computação) – Curso de Ciência da Computação da Faculdade de Jaguariúna, Jaguariúna. Resumo Este projeto apresenta uma visão geral sobre fractais, bem como formas e métodos utilizados para demonstrá-los. Mostra como os métodos como Sistema-L e Sistemas de Funções Iterativas são de grande utilidade para o desenvolvimento na área de estudos cientificos. Para tal projeto será vista a sua utilização ao se unir os métodos de criação de imagens fractais e as técnicas de computação gráfica, resultando em códigos responsáveis pela geração das imagens ao invés do armazenamento da própria imagem, porém com maior exigência da máquina ou computador, quanto ao tempo de processamento necessário para tal geração. Situação esta de se armazenar a própria imagem, torna-se necessária para os casos de se criar uma imagem através de ferramentas de criação de imagem de forma interativa com o usuário. Palavra-chave: Computação Natural, Geometria Fractal, Sistemas de Funções Iterativas, Sistema-L, ferramenta de programação matemática. 5 Sumário 1. INTRODUÇÃO..................................................................................................................9 2. COMPUTAÇÃO NATURAL ..........................................................................................11 2.1 Computação inspirada na natureza. .......................................................................... 12 2.1.1 Redes neurais artificiais........................................................................................ 13 2.1.2 Algoritmos evolutivos. ......................................................................................... 14 2.1.3 Inteligência coletiva ou swarm intelligence. ........................................................ 14 2.1.4 Sistemas imunológicos artificiais. ........................................................................ 15 2.2 Estudo sobre a natureza através da computação....................................................... 16 2.2.1 Vida artificial........................................................................................................ 17 2.2.2 Geometria computacional (fractal) da natureza.................................................... 17 3. GEOMETRIA FRACTAL ...............................................................................................18 3.1 Auto-similaridade estrita; ......................................................................................... 19 3.2 Auto-similaridade estatística (auto-afinidade); ........................................................ 19 3.4 Os primeiros fractais................................................................................................. 20 3.5 O conjunto de cantor................................................................................................. 20 3.6 A curva de Koch (floco de neve).............................................................................. 21 3.7 O triângulo de Sierpinski.......................................................................................... 23 3.8 A curva de Peano...................................................................................................... 23 3.9 Dimensão euclidiana e dimensão fractal .................................................................. 24 3.10 Sistemas de Lindenmayer (Sistemas-L) ................................................................... 25 3.10.1 Sistema-DOL (DOL-Systems) ............................................................................. 26 3.11 Sistemas de funções iterativas (IFS – Iterated Function Systems)........................... 27 4. CONCEITOS SOBRE COMPUTAÇÃO GRÁFICA ......................................................30 4.1 Translação....................................................................................................................... 31 4.2 Escalonamento................................................................................................................ 32 4.3 Reflexão.......................................................................................................................... 33 4.4 Rotação ........................................................................................................................... 34 5. APLICAÇÃO DE TECNICAS DE GEOMETRIA FRACTAL ......................................36 5.1 Criação de árvore utilizando o Sistema-L ...................................................................... 36 5.2 Criação de árvore utilizando o Sistema de Funções Iterativas ....................................... 38 5.3 Criação das imagens unindo os modelos fractais em um mesmo algoritmo .................. 40 5.4 Criação da imagem através da Ferramenta PAINT ........................................................ 41 5.5 Comparativo entre os dois métodos utilizados, para a criação de uma mesma imagem. .............................................................................................................................................. 42 6. CONCLUSÃO..................................................................................................................45 7. REFERÊNCIAS BIBLIOGRÁFICAS .............................................................................46 8. ANEXOS ..........................................................................................................................47 6 Lista de Siglas DIFS .JPG IFS .M RNAs SIA Deterministic Iterated Function System Joint Photographic Group Iterated Function Systems Extensão de arquivos gerados e excutados de uma ferramenta de programação matemática Redes Neurais Artificiais Sistemas Imunológicos Artificiais 7 Lista de Figuras Figura 1 - Exemplo de auto-similaridade na natureza [Castro, 2007]...................................... 19 Figura 2 - Exemplo de auto-similaridade estrita [Castro, 2007]. ............................................. 19 Figura 3 - Exemplo de auto-similaridade estatística ou auto-afinidade [Castro, 2007]. .......... 20 Figura 4 - Exemplo dos primeiros passos do Conjunto de Cantor [Castro, 2007]. .................. 21 Figura 5 - Exemplo dos primeiros passos da Curva de Koch [Castro, 2007]........................... 22 Figura 6 - Exemplo da Ilha de Koch, também conhecida como Floco de Neve ...................... 22 Figura 7 - Exemplo dos primeiros passos na construção do Triângulo de Sierpinski.............. 23 Figura 8 - Exemplo dos primeiros passos na construção da Curva de Peano [Castro, 2007]. . 24 Figura 9 - Exemplos de plantas geradas através da técnica do Sistema de Lindenmayer. ....... 25 Figura 10 - O Arbusto de Barnsley, gerado pelo código da Tabela 02. ................................... 29 Figura 11 - Modelo Conceitual sobre Computação Gráfica [Vianna, 2002]............................ 30 Figura 12 - Exemplo de translação ........................................................................................... 32 Figura 13 - Exemplo de escalonamento ................................................................................... 33 Figura 14 - Exemplo de reflexão .............................................................................................. 34 Figura 15 - Exemplo de rotação da imagem (rotacionando a folha 30º sentido horário)......... 35 Figura 16 – Exemplo de sistemas L ......................................................................................... 37 Figura 17 – Imagem gerada através da duplicação da figura gerada pelo Sistema-L, na forma de reflexo. ......................................................................................................................... 38 Figura 18 – Reprodução de várias folhas formando uma árvore, através das coordenadas dos pontos ou pixels de uma folha, armazenados em uma matriz. ......................................... 39 Figura 19 - Imagens geradas a partir do código ....................................................................... 40 Figura 20 - Imagem gerada através da ferramenta PAINT, de forma prática e interativa. ...... 41 8 1. INTRODUÇÃO Há tempos, matemáticos eram reconhecidos pelos cálculos clássicos, nos quais havia a possibilidade imediata de aplicação. Raros eram os que buscavam saber o real valor para tais fórmulas e cálculos. Em tempos mais recentes, este tipo de pensamento vem sendo mudado, pois há um interesse maior em se descobrir com maior detalhe a formação, por exemplo, de estruturas da natureza como: uma montanha, uma nuvem, uma costa marítima, pois estas não podem ser reproduzidas com formas de esferas, cones, nem mesmo círculos. Como se sabe, as formas de geometria pura ou geometria Euclidiana descrevem formas como caixas sendo cubos, lápis sendo cilindros, bolas sendo esferas. Porém, esta geometria não tem capacidade para descrever a forma de um floco de neve, por exemplo. Para isso, a geometria fractal, que vem do Latin “fractus” e corresponde ao verbo quebrar, ou seja, criar formas irregulares vem sendo aprimorada, criando-se modelos matemáticos oriundos dos padrões sintéticos da natureza. Através de estudos de técnicas de modelagens e sínteses de padrões naturais comprovou-se que a Natureza é fractal. Estas pesquisas vêm sendo auxiliadas pela computação gráfica, tornando possível tais descobertas de maneira cada vez mais prática [CASTRO, 2007]. Desta forma, podem-se ter ferramentas que auxiliam na formação de novas formas de plantas ou até mesmo de reprodução de espécies raras ou extintas. Atualmente vê-se a geometria fractal como uma forma de reproduzir arte, com imagem (fotografias) nunca antes vislumbradas, ou até mesmo utilizando-se da mesma para criar maior realismo em filmes que reproduzem o mundo real virtualmente. Dentre os métodos e algoritmos criados para a obtenção destas reproduções da Natureza, será abordado o Sistema-L e o Sistema de Funções Iterativas. O Sistema-L é um dos mais compactos e práticos modelos de fractais, recebeu a letra “L” devido o nome do biólogo alemão A. Lindenmayer, que introduziu o conceito de autômatos celulares para descrever os processos de crescimento de organismos constituídos por células, através da matemática. Sistema-L pode ser também discutido como um algoritmo de desenvolvimento, que consiste em descrever todo um processo de desenvolvimento multicelular, ou seja, da passagem de um determinado organismo desde sua fase embrionária até sua maturidade [CASTRO, 2007]. 9 Sistemas de Funções Iterativas (IFS - Iterated Function Systems) foram desenvolvidos por J. Hutchinson, M. Barnsley e S. Demko. Os IFS consistem basicamente da aplicação recursiva de um conjunto de transformações, que após um determinado período de iterações, haverá uma certa configuração geométrica. Esta aplicação pode também ser conhecida como mapeamentos contrativos, na qual é gerada uma imagem sobre ela mesma, havendo sempre uma convergência para o mesmo ponto. Ambos os métodos, Sistema-L e Sistemas de Funções Iterativas, são bastante úteis para desenho e modelagem de paisagens naturais, ornamentais e ilustrações botânicas entre outras. No decorrer deste projeto, será visto mais a fundo os métodos, Sistema-L e Sistemas de Funções Iteraticas, efetuando testes utilizando uma ferramenta de programação matemática na criação de imagens gráficas, demonstrando boas práticas e suas utilidades no campo da computação científica. Unindo as técnicas Sistema-L e Sistema de Funções Iterativas com uma ferramenta de programação matemática para criação de imagens gráficas, também criando imagens semelhantes através da ferramenta da Microsoft, o PAINT, será possível realizar o objetivo principal deste projeto que será, através dos resultados obtidos, analisar as vantagens e desvantagens em se otimizar dados, armazenando apenas linhas de códigos responsáveis pela reprodução da imagem, de forma a aproveitar o processamento do computador. Será observado também a vantagem em se armazenar as imagens criadas através da ferramenta PAINT, utilizando pouco processamento da máquina, porém ocupando mais espaço no armazenamento. 10 2. COMPUTAÇÃO NATURAL A computação natural vem cada vez mais se aproximando dos conceitos utilizados na natureza. Hoje, há a possibilidade, por exemplo, de se desenvolver um sistema especialista que absorva informações a ponto de obter inteligência por si só. Aprende-se com a natureza e seus fenômenos, métodos que resolvem e/ou criam grandes possibilidades para se criar novas tecnologias que auxiliam em muitas áreas, como a engenharia, botânica, além de criar eletroeletrônicos ou eletrodomésticos “inteligentes” em que auxiliam até mesmo no cotidiano de pessoas comuns. Fundamentalmente, a computação natural é constituída por novas abordagens computacionais caracterizadas por uma maior proximidade com a natureza. Segundo Castro (2007): Desenvolver ferramentas matemáticas e computacionais para a solução de problemas complexos em diversas áreas do conhecimento; Projetar dispositivos (computacionais) que simulam, emulam, modelam e descrevem sistemas e fenômenos naturais; Sintetizar novas formas de vida, denominadas de vida artificial; Utilizar mecanismos naturais, como cadeias de DNA e técnicas de engenharia genética, como novos paradigmas de computação. Estes novos paradigmas vêm suplementar e/ou complementar os computadores atuais baseados em tecnologia de silício e arquitetura de Von Newmman. A visão que se pode ter atualmente sobre o que é a computação natural é a de que trata-se de um processo de análise ou extração de idéias, mecanismos, fenômenos e da síntese da natureza para se desenvolver sistemas “artificiais”. É importante salientar que a palavra “artificial” no contexto de computação natural, significa apenas que os sistemas e dispositivos resultantes são desenvolvidos por seres humanos ao invés de serem produtos diretos da evolução das espécies. A área da computação natural pode ser dividida em três grandes subáreas na qual patrocinam a proposição de poderosas ferramentas computacionais para a solução de problemas complexos da engenharia e têm permitido a geração de novos paradigmas de computação, são elas: 11 2.1 • Computação inspirada na natureza; • Estudos sobre a natureza através da computação; • Computação com mecanismos naturais; Computação inspirada na natureza. A computação inspirada na natureza é apenas um ramo de estudo voltado à computação, porém esta observação da natureza estudada permitiu o desenvolvimento de diversas leis e teorias sobre os comportamentos da mesma. Alguns exemplos que foram primordiais para o desenvolvimento cientifico, voltados à física como: • Leis do movimento (leis de Newton); • Leis do eletromagnetismo (leis de Maxwell); Há também exemplos de objetos inspirados na natureza que compõem o dia-a-dia, alguns exemplos: • Velcro inspirado nas plantas; • Coletes a prova de bala são inspirados nas teias de aranha; • Sonares são inspirados em morcegos ao qual utilizam como meio de se orientarem em seus percursos; • Aviões são inspirados em pássaros; • Submarinos são inspirados em peixes; O mais antigo e bem consolidado, portanto mais conhecido ramo da computação natural, a computação inspirada na natureza, surgiu através da descoberta de princípios e teorias sobre a natureza. Com isso, pesquisadores da área de engenharia e computação viram 12 uma grande oportunidade de tirar proveito desta, na elaboração de sistemas computacionais capazes de resolverem problemas complexos. A computação inspirada na natureza compreende principalmente: • Redes neurais artificiais; • Algoritmos evolutivos; • Inteligência coletiva; • Sistemas imunológicos artificiais; 2.1.1 Redes neurais artificiais. O primeiro trabalho voltado a computação inspirada na natureza surgiu em 1943 por McCulloch & Pitts, introduzindo o primeiro modelo matemático (lógico) de um neurônio. Este modelo conhecido como neurônio artificial foi quem deu origem a linha de pesquisa conhecida atualmente como redes neurais artificiais. O cérebro é reconhecido como o órgão mais complexo e também mais cobiçado em relação a pesquisas pelos cientistas. É ele que contém a maior parte do controle do corpo e por isso ele é um especialista em desempenhar funções como reconhecimento de padrões, controle motor, percepção, inferência, intuição, adivinhações, etc. Sabe-se que os neurônios são considerados as unidades básicas de processamento do cérebro. Baseando-se neste comportamento é que as redes neurais artificiais (RNAs) se inspiram, utilizando-se de uma grande quantidade de unidades simples de processamento (neurônios artificiais) interligados entre si de forma bastante distribuída. O conhecimento de uma rede neural se dá pela aprendizagem, que é realizada através de uma considerável modificação nas sinapses dos neurônios. Sinapse é o nome dado à conexão entre um neurônio e outro que armazenam as informações que, mediante seu peso, as transportam até o neurônio receptor. 13 2.1.2 Algoritmos evolutivos. Outra abordagem baseada na computação inspirada na natureza usa idéias da biologia evolutiva como forma de desenvolver algoritmos úteis para tarefas de busca e otimização para a resolução de problemas complexos e simular processos evolutivos naturais. A idéia de algoritmos evolutivos surgiu na década de 60 por I. Rechenberg (1973), H. P. Schwefel (1965), L. Fogel (1966) e J. Holland (1975). Baseado na teoria de Darwin, que se baseia principalmente na “seleção natural” como forma de manutenção das variações favoráveis através da seleção natural, na qual, ao longo de um grande espaço de tempo acarretará o aparecimento de novos organismos que são tão distintos de seus antecessores que acabam por se caracterizarem como uma nova espécie. No caso da teoria da evolução através da seleção natural, os principais processos algorítmicos envolvidos são: • Reprodução com herança genética; • Variação genética; • Seleção natural; 2.1.3 Inteligência coletiva ou swarm intelligence. O temo inteligência coletiva ou de “enxame” surgiu na década de 80 e busca a idéia de tentativa de projeção de algoritmos ou dispositivos distribuídos baseados em comportamentos de insetos e outras sociedades animais para resolver problemas. A inteligência coletiva possui duas frentes principais de pesquisa: • Algoritmos baseados no comportamento coletivo de insetos sociais: este tipo de algoritmo busca desenvolver soluções de problemas de otimização combinatória, agrupamento de dados, robótica coletiva, etc. 14 • Algoritmos baseados na habilidade das sociedades humanas em processar conhecimento: para este caso de algoritmo, os mesmos são eficazes para a realização de buscas em espaços contínuos. A idéia principal neste caso é buscar o crescimento mútuo em uma sociedade, cujo conhecimento se dará como um todo e ao mesmo tempo será descentralizado de algum tipo de poder, sendo distribuídas todas as responsabilidades por igual, ou seja, será valorizada a responsabilidade de cada um, sendo vantajoso para todos em relação a enriquecimento cultural. 2.1.4 Sistemas imunológicos artificiais. Os sistemas imunológicos artificiais possuem idéias extraídas do sistema imunológico dos seres vertebrados e tem sua aplicação desde a biologia até a robótica. Esta área de pesquisa bastante nova, surgiu por volta da década de 80 e busca utilizar um dos sistemas mais complexos da natureza. Uma das principais funções deste sistema é defender o organismo contra infecções causadas por patógenos, que são seres causadores de doenças, como vírus, bactérias, fungos e parasitas. O sistema imunológico pode ser dividido em duas partes: • Sistema inato: Este sistema é a primeira barreira contra os patógenos, elas servem para emitir sinais para outras células, caso uma das células do sistema inato reconheça algum patógeno. • Sistema adaptativo: Como nem todos os patógenos são reconhecidos pelo sistema inato, o sistema adaptativo é responsável por reconhecer os mesmos, já que este sistema adapta-se com os antígenos, criando anticorpos específico para combater o mesmo e também pode manter uma memória dos patógenos reconhecidos para combater os mesmos, caso haja um novo ataque no futuro. 15 Baseando-se principalmente na idéia de sistema adaptativo foi que os sistemas imunológicos artificiais (SIA) surgiram com o propósito de resolver um determinado problema baseado nas características do próprio problema, aplicando-a na obtenção da solução. 2.2 Estudo sobre a natureza através da computação. Este ramo da computação, ao contrário da computação inspirada na natureza, busca utilizar mecanismos computacionais para o estudo de organismos artificiais, ou seja, estudar novos fenômenos que podem nunca ter sido observados na natureza, mas que possuem características suficientes para serem denominados e/ou qualificados de “naturais”. O estudo da natureza através da computação busca simular e emular fenômenos naturais de maneira não-determinística. Quando se fala em simulação, o estudo busca desenvolver, ou seja, criar fenômenos que podem vir a ser semelhantes ou até idênticas as existentes na natureza, mas de uma forma virtual, como a criação de uma imagem de determinadas plantas existentes na natureza, ou até mesmo de algumas espécies que já se extinguiram, ou ainda do que poderia existir futuramente de acordo com as condições reais existentes hoje na natureza, por exemplo. Na emulação, o ato de emular se dá ao fato de criar fenômenos similares (concorrentes) aos encontrados na natureza, por exemplo, as colônias de formigas, que são estudos de uma característica presente na natureza e que, através de estudos ciêntificos, foi possível que se utilizasse a mesma técnica para determinados problemas, como forma de solução e sem ter que utilizar literalmente as formigas para tal função. Este estudo contém duas principais frentes de pesquisa, são elas: • Vida artificial; • Geometria computacional (fractal) da natureza; A pesquisa em vida artificial e a geometria computacional da natureza vêm permitindo a criação de modelos realistas da natureza e a simulação e/ou emulação de diversas espécies de plantas e animais, inclusive em mídias como cinema e televisão, e têm contribuído para a síntese e conseqüente estudo de fenômenos naturais [CASTRO, 2007]. 16 2.2.1 Vida artificial. A vida artificial tem como objetivo tentar recriar a vida natural de uma maneira virtual ou sintética, ou seja, por eventos que não são causados pela natureza e sim pela criação do homem através de sistemas complexos. Estas pesquisas surgiram na década de 80 pelo pesquisador Cristopher Lagon e diferente da Computação Inspirada na Natureza ela não busca resolver problemas encontrados em determinadas áreas cientificas, mas procura demonstrar de maneira artificial, a vida como forma de estendê-la melhor. A vida artificial busca dar ênfase ao desenvolvimento cientifico. 2.2.2 Geometria computacional (fractal) da natureza. O termo “fractal” que do latim significa fractus, que corresponde ao verbo quebrar e apesar de ser um estudo já há bastante tempo estudado por matemáticos e cientistas, recebeu este nome através do matemático Benoit Mandelbrot (1983). Mandelbrot não só criou o termo “fractal” como também elaborou padrões e modelos de fractais. A geometria fractal surgiu como um meio de revolucionar a geometria euclidiana, na qual só é possível modelar objetos artificiais. Esta nova geometria busca formas irregulares e fragmentadas da natureza, como fonte de inspiração para a criação de imagens artificiais das mesmas, além de um estudo de formas “possíveis” de vida no planeta. 17 3. GEOMETRIA FRACTAL A partir da obra “The Fractal Geometry of the Nature” (A Geometria Fractal da Natureza), foi que o matemático Benoit Mandelbrot, no ano de 1983, criou a chamada geometria fractal. A também conhecida Geometria da Natureza, através de suas irregularidades e estruturas complexas, teve um grande avanço na computação gráfica, tornando-se um grande aliado na construção de imagens e animações, além de estruturas naturais com grande realismo. Com esta eficiência, a utilização do fractal na computação gráfica trouxe um grande avanço em pesquisas científicas, sendo de grande utilidade para a criação de paisagens naturais, plantas existentes ou mesmos extintas, estudo de processos de desenvolvimento e crescimento. A Geometria Fractal auxiliou também na modelagem e síntese de diversos padrões e formas naturais, através de grandes estudiosos. Através das descobertas de novas formas geométricas, foi possível criar padrões e algoritmos que auxiliassem na formação de tais fractais, como o Sistema-L, criado por A. Lindenmayer. Além desta técnica, há muitas outras existentes, como os Sistemas de Funções Iterativas (Iterated Function Systems). Na natureza, observamos que suas formas são infinitamente irregulares, não se assemelhando em nada a geometria euclidiana ou geometria clássica, que é encontrada em objetos uniformes cunhados artificialmente. A Geometria Fractal tem como principal objetivo ser útil na representação da natureza como terrenos, plantas, nuvens, montanhas, raios, arbustos, costas marítimas, ou até mesmo de organismos complexos como pulmões, cérebro, rins, etc. Em resumo, os fractais são irregulares, contendo o mesmo grau de irregularidade em todas as escalas, além de poderem ser auto-similares, ou seja, os fractais parecem os mesmos quando observado de muito perto ou a distância. Um exemplo bastante encontrado em literaturas para descrever a auto-similaridade na Natureza de maneira intuitiva é a representação do brócolis (Figura 1), sendo a primeira imagem um brócolis fotografado por inteiro e na segunda imagem, apenas uma pequena parte retirada do brócolis, onde a menor parte sofre muito poucas variações sobre a imagem do todo: 18 Figura 1 - Exemplo de auto-similaridade na natureza [Castro, 2007]. Há dois tipos de auto-similaridade com uma sutil diferença entre si: 3.1 Auto-similaridade estrita; Para um fractal, cujas partes sejam uma cópia exata (réplica) de seu todo, a auto- similaridade é dita estrita. Vejamos o fractal dado na figura 2, no qual suas partes são idênticas à sua imagem por inteiro: Figura 2 - Exemplo de auto-similaridade estrita [Castro, 2007]. 3.2 Auto-similaridade estatística (auto-afinidade); A Auto-similaridade estatística, também conhecida como auto-afinidade tem uma ligeira diferença em relação à auto-similaridade estrita, pois no exemplo abaixo percebe-se que a imagem do todo da árvore é formada a partir do tronco por duas partes com afinidade com a arvore como um todo. Sendo estas “filiais” com afinidade ao todo da árvore, define-se 19 que a propriedade de auto-similaridade é restringida as filiais desta árvore, pois não mantêm fixas as proporções originais da mesma, como mostra a figura 3. Figura 3 - Exemplo de auto-similaridade estatística ou auto-afinidade [Castro, 2007]. 3.4 Os primeiros fractais Mesmo antes de se pensar na existência ou do auxílio da computação como forma de desenvolver as imagens de forma mais prática, deixando a parte de processamento para que a máquina se encarregue de desenvolver tal papel, já havia estudos e funções sendo desenvolvidas por estudiosos, na maioria matemáticos, que buscavam resolver problemas ainda antes não questionados ou resolvidos. Os primeiros fractais foram descobertos por K. Weierstrass, G. Cantor, H. von Koch, W. Sierpinski, entre outros. O primeiro fractal foi descoberto por K. Weierstrass em 1861, que descobriu uma função contínua que não é diferenciável em ponto algum, ou seja, uma curva constituída somente por “cantos”. Apesar de ter sido uma teoria genérica, esta função deu origem a várias outras idéias, auxiliando na expansão dos estudos sobre fractais. 3.5 O conjunto de cantor O fractal conhecido como Conjunto de Cantor foi introduzido pelo russo Georg Ferdinand Ludwig Philip Cantor em 1883. É obtido a partir da subdivisão do intervalo, ou seja, de maneira prática o processo se dá como visto na figura 4, inserir uma linha, logo após, 20 quebrar esta linha em três partes iguais, retirando a parte do meio gerando assim um novo passo. A seguir, deve-se repetir o mesmo procedimento para as duas partes agora existentes, gerando um novo passo com uma quantidade exponencialmente maior de linhas. Este processo se dá de forma infinita. Figura 4 - Exemplo dos primeiros passos do Conjunto de Cantor [Castro, 2007]. Segundo Castro, o Conjunto de Cantor tem algumas características interessantes: Não possui comprimento algum ou interior; Cada uma de suas partes é constituída basicamente de buracos; É totalmente formado por pontos desconexos; Contém a mesma quantidade de pontos que a curva da qual ele é derivado; Cada um de seus pontos é um ponto limite, ou seja, existe uma quantidade infinita de outros pontos do conjunto na sua vizinhança. 3.6 A curva de Koch (floco de neve) Outro fractal, conhecido como Curva de Koch, foi inventado pelo matemático sueco Niels Fabian Helge Von Koch, em 1904 tem como característica dividir uma linha reta em três partes iguais, pegando a terceira parte (central) e substituindo-a por duas de tamanhos iguais a desta parte substituída, formando um triângulo eqüilátero sem base. No segundo passo, será efetuado o mesmo processo, separando as novas linhas retas em três partes iguais e substituindo a terceira parte por duas partes, formando um outro triângulo eqüilátero sem base para cada linha reta. 21 Figura 5 - Exemplo dos primeiros passos da Curva de Koch [Castro, 2007]. Segundo Castro, a Curva de Koch tem algumas características interessantes: No limite a curva de Koch não possui segmento algum de reta; a curva é inteiramente constituída por cantos; Portanto a curva não apresenta derivada (tangente) em ponto algum; Embora ela se inicie a partir de uma reta de comprimento V, seu comprimento é infinito; No passo t a curva possui 4t segmentos, cada qual com comprimento 1/3t. Portanto, o comprimento total da curva é (4/3)t; Dando seqüência a curva de Koch, será notado que em um determinado momento esta curva tornará uma ilha, mas que sua implementação continuará sendo infinita, ou seja, uma curva de comprimento infinito pode ser colocada em uma área finita [Castro, 2007]. Figura 6 - Exemplo da Ilha de Koch, também conhecida como Floco de Neve [Castro, 2007]. 22 3.7 O triângulo de Sierpinski O matemático V. Sierpinski introduziu seu fractal no ano de 1916, o qual ficou conhecido como Triângulo de Sierpinski. Embora os princípios adjacentes já serem conhecidos por milênios, a idéia de implementação de uma forma fractal se torna mais recente, na qual divide-se um triângulo eqüilátero em quatro pequenas partes dentro dele, seguindo o mesmo procedimento para os demais passos, pegando uma das pequenas partes e dividindo-a em outras quatro menores partes dentro desta, obtendo pequenas cópias do todo, como na figura 7. Figura 7 - Exemplo dos primeiros passos na construção do Triângulo de Sierpinski. 3.8 A curva de Peano Por volta do ano de 1800, Giuseppe Peano e David Hilbert apresentaram uma curva capaz de preencher o espaço, no qual este fractal efetua um processo de preenchimento dos espaços não sendo necessariamente dentro da área fechada. Este fractal ficou conhecido como a Curva de Peano. Na Curva de Peano, conhecida como a curva que preenche o espaço, cada passo no processo de construção será consistido por nove pequenos segmentos de linhas para cada linha gerada através do passo anterior. Como no exemplo abaixo, a Curva de Peano procura preencher os espaços ainda não utilizados ocupando, a cada iteração um espaço maior, porém sem expandir sua dimensão. 23 Figura 8 - Exemplo dos primeiros passos na construção da Curva de Peano [Castro, 2007]. Este fractal se baseia na idéia de organização de organismos, pois um organismo deve ser feito para suportar suas substâncias necessárias como água, sangue e oxigênio. Este organismo, apesar de estar preenchido por suas substancias terá, através de sua estrutura de organização, uma otimização no espaço para ser usado em algumas funções. A Curva de Peano trouxe certo desconforto para os matemáticos da época, pois, hoje se sabe que o mesmo pode auxiliar na resolução de problemas de como organizar uma estrutura complicada de maneira eficiente [Castro, 2007]. 3.9 Dimensão euclidiana e dimensão fractal A dimensão da qual temos conhecimentos através dos primeiros anos de estudos escolares, apresenta dimensões conhecidas através da geometria euclidiana, usualmente denominada dimensão topológica. Como se sabe, esta dimensão mostra que pontos possuem dimensão 0, linhas e curvas possuem dimensão 1, planos e superfícies possuem dimensão 2 e sólidos possuem dimensão 3. De forma simplificada, a dimensão topológica é definida como um conjunto possuindo dimensão d se d variáveis independentes (coordenadas) são necessárias para descrever a vizinhança de cada ponto [Castro, 2007]. Quanto à dimensão fractal, a complexidade em definí-lo torna-se um problema, pois os fractais observados acima como a Curva de Koch, por exemplo, contêm dimensões nos quais 24 os pontos não são definidos entre uma dimensão e outra na perspectiva da geometria Euclidiana, podendo ser um número entre as dimensões 1 e 2, ou seja, o comprimento entre quaisquer dois pontos da curva é infinito, pois entende-se que esta dimensão é muito grande para ser unidimensional e pequena demais para ser bidimensional [Castro, 2007]. 3.10 Sistemas de Lindenmayer (Sistemas-L) A. Lindenmayer, biólogo alemão introduziu em 1968 um conceito matemático, na intenção de simular o desenvolvimento de organismos multicelulares (autômatos celulares), que ficou conhecido como Sistemas-L (L-Systems) ou algoritmos de desenvolvimento (developmental algorithms). O desenvolvimento multicelular consiste na geração de estruturas através da divisão, crescimento, diferenciação e morte celular. Ele corresponde a uma série de mudanças que os organismos sofrem durante sua passagem do estado embrionário para a maturidade. [Castro, 2007]. t = 8, δ = 22.5º ω: G G = F+[[G]-G]]-F[-FG]+G F = FF Figura 9 - Exemplos de plantas geradas através da técnica do Sistema de Lindenmayer. 25 A teoria matemática do Sistema-L foi desenvolvida tendo como principal objetivo a modelagem de plantas, além de reconstrução de plantas extintas ou projetos de novas variedades de plantas, criação de paisagens, projetos ornamentais e ilustração botânica. Porém, com sua praticidade na geração de imagens realistas, o Sistema-L também é utilizado para o auxilio nos estudos científicos de um modo geral, como desenvolvimento biológico, a microbiologia, biodiversidade, agronomia e ecologia, além de outros. 3.10.1 Sistema-DOL (DOL-Systems) As formas geométricas (fractais) a serem estudadas são palavras em uma linguagem formal paralela. As gramáticas em Sistemas-L são similares às gramáticas formais apresentadas anteriormente, porém as produções são aplicadas simultaneamente (paralelamente) e não existe distinção entre símbolos terminais e não-terminais [Castro, 2007]. Um exemplo de Sistema-L pode ser observado da seguinte forma, sendo o alfabeto G = {a,b,c}, onde c é o axioma (ponto de partida). • a→c • b → ac • c→b Partindo-se do axioma (ponto de partida) que consiste na letra c, o primeiro passo é substituir o axioma utilizando a regra 3 (c → b). Portanto o axioma c é substituído por b. No segundo passo substitui-se b por ac utilizando a regra 2 (b → ac), e assim por diante de acordo com a Tabela 01. Este processo de aplicação das regras é denominado de processo de derivação ou de reescrita, no qual se dá por um processo infinito, contendo reescrita de forma infinita [Castro, 2007]. 26 Iteração Palavra 0 c 1 b 2 ac 3 cb 4 bac 5 accb 6 cbba 7 bacaccb 8 accbcbbac 9 cbbacbacaccb 10 bacaccbaccbcbbac Tabela 01 – Exemplo de Iteração partindo do axioma, ao qual consiste a letra c. 3.11 Sistemas de funções iterativas (IFS – Iterated Function Systems) Uma outra forma de se construir fractais é através do Sistema de Funções Iterativas, também conhecido como mapeamentos contrativos, que foi desenvolvido a partir de 1986 por J. Hutchinson, M. Barnsley e S. Demko. O IFS (do inglês, Iterated Function Systems), foi criado como uma ferramenta para geração de uma imagem criada através de uma aplicações recursivas de uma imagem sobre si mesma, executando em um determinado número de iteração especificado a princípio, onde ao final dessa iteração será gerado uma imagem através de uma forma geométrica. Uma propriedade importante de contrações é que independentemente do ponto inicial, a aplicação iterativa do mapeamento contrativo resulta sempre na convergência para o mesmo ponto, denominado de atrator [Castro, 2007]. 27 Para se entender melhor sobre os passos de funcionamento de uma transformação através do IFS, deverá ser compreendido que, uma transformação sobre X é uma função f: X → X que especifica exatamente um ponto f(x) X a cada ponto x X. Sendo assim, a forma w(x1,x2) = (ax1 + bx2 + e, cx1 + dx2 + f), onde a, b, c, d, e, e f são números reais é denominada de transformação afim (bi-dimensional). Em notação matricial: x1 a b x1 e + = Ax + t w( x ) = w = x c d x2 f 2 (01) w a b c d e f p 1 0 0 0 0.16 0 0 0.01 2 0.85 0.04 -0.04 0.85 0 1.6 0.85 3 0.2 -0.26 0.23 0.22 0 1.6 0.07 4 -0.15 0.28 0.26 0.24 0 0.44 0.07 Tabela 02 – Tabela específica para criação do Arbusto de Barnsley. 28 Figura 10 - O Arbusto de Barnsley, gerado pelo código da Tabela 02. Com a utilização da equação (01) unindo-se aos valores padrão da tabela 02, tornou-se possível gerar, através de um determinado número de interação realizado no algortimo, o arbusto de Barnsley. Este resultado também pode ser armazenado em matrizes, sendo possível a sua reutilização como será observado mais adiante, no decorrer do trabalho. Algoritmo genérico para implementação de um IFS: procedimento [ ] = RIFS (max_it, x0, W, p) x ← x0; t←1 enquanto t < Max_it faça, j ← selecionar (p) // selecionar um mapeamento j // com uma probabilidade pj x ← x j (x) desenhar(x) t ←t + 1 fim enquanto fim procedimento // aplique mapeamento j em x // imprima o ponto x Estas transformações possuem propriedades algébricas e geométricas importantes. As quatro principais transformações afim são translação, escalamento, reflexão e rotação. 29 4. CONCEITOS SOBRE COMPUTAÇÃO GRÁFICA A Computação Gráfica é uma área da Ciência da Computação que, derivada de outras áreas como Física, Matemática, Engenharia, Arquitetura, etc., estuda a geração, manipulação e interpretação de modelos e imagens de objetos utilizando computadores para dados em dispositivos gráficos e vice-versa. Figura 11 - Modelo Conceitual sobre Computação Gráfica [Vianna, 2002]. Imagens Gráficas são basicamente formadas por códigos que contêm cálculos para a interpretação do computador na geração da imagem. Mesmo utilizando de ferramentas que facilitam a geração de tais imagens, é extremamente necessário ter o entendimento sobre os conceitos básicos da Computação Gráfica para a execução deste projeto. 30 Para a geração das imagens, o algoritmo apoiado por uma ferramenta de programação matemática, gera imagens através de combinações de cálculos de pequenos pontos coloridos conhecidos como pixels ou pontos, no qual são associados números à esses pontos como forma de coordenadas (x,y). Será visto a seguir e utilizado para a manipulação das imagens gráficas fractais no plano 2D, quatro transformações essenciais da computação gráfica, são elas a translação, escalonamento, reflexão e rotação. 4.1 Translação A translação é a alteração da posição inicial de um ponto através da soma de constantes, deslocando suas coordenadas, é normalmente aplicada sobre todos os pontos de uma figura, de maneira a possibilitar a sua movimentação no espaço. Para a translação das imagens gráficas fractais utilizadas neste projeto, será utilizado a seguinte fórmula: x` x Tx P`= P + T = = + y` y Ty (02) Onde P(x,y), sendo P um vetor com coordenadas de vários pontos responsáveis pela geração de uma imagem. T(Tx,Ty), sendo T um vetor com valores de deslocamento dos pontos em P. P’ é o resultado da soma dos pontos contidos no vetor P com unidades contidas no vetor de deslocamento T. 31 Ou seja, x e y são as coordenadas da localização de um ponto e Tx é uma variável de unidades em relação ao eixo x, assim como Ty é uma variável de unidades em relação ao eixo y. Figura 12 - Exemplo de translação 4.2 Escalonamento O escalonamento é uma transformação, onde o resultado da multiplicação das coordenadas de um ponto por valores de variáveis de escalonamento, resulta na alteração do tamanho da imagem de um todo em relação a imagem original, ou seja, as coordenadas x e y de cada ponto será multiplicada pelas variáveis de escalonamento Sx e Sy respectivamente, produzindo então as coordenadas transformadas x’ e y’. 32 [x` y `] = [x S x y] 0 0 S y (03) A alteração dos valores destes pontos, que juntamente formam a imagem, não resultam em uma imagem diferente ou deforme, mas apenas na alteração do tamanho desta imagem, sendo que, caso os valores de Sx e Sy forem maiores que um, haverá o aumento do tamanho da imagem. Caso estes valores forem menores que um, a imagem será reduzida. Figura 13 - Exemplo de escalonamento 4.3 Reflexão Reflexão é a obtenção da visualização da imagem por um outro ângulo, como se observasse esta através de um espelho. A obtenção do reflexo da imagem se faz através de cálculos da coordenada dos pontos que compõem a imagem gráfica fractal. 33 Para se obter o resultado esperado nesta transformação, é necessário que o vetor que contenha as coordenadas dos pontos desta imagem P(x,y), seja multiplicado pela matriz R(-1,0;0,1) resultando no vetor transformado P’(x’,y’). x` x − 1 0 P`= P * R = = y ` y 0 1 (04) Figura 14 - Exemplo de reflexão 4.4 Rotação A rotação é o giro de um determinado ângulo de um ponto em torno de um ponto de referência, não havendo alteração da distância entre eles. Estes ângulos são comumente encontrados com valores fixos como 90° e 180°, porém há a possibilidade de efetuar a rotação 34 para qualquer valor de ângulo, desde que seja respeitada a regra da função de multiplicação de vetores de coordenadas vista a seguir. x` x cos(θ ) sen(θ ) y` = y − sen(θ ) cos(θ ) (05) Figura 15 - Exemplo de rotação da imagem (rotacionando a folha 30º sentido horário) 35 5. APLICAÇÃO DE TECNICAS DE GEOMETRIA FRACTAL Com a combinação entre Técnicas de Geometria Fractal, entendimento sobre conceitos de Computação Gráfica e uma ferramenta de programação matemática, para geração das imagens, tornou-se possível desenvolver uma combinação de reprodução destas imagens possibilitando construir, por exemplo, uma árvore utilizando as informações de uma folha contidas em um vetor. 5.1 Criação de árvore utilizando o Sistema-L Para a criação do algoritmo de criação de imagens fractais utilizando o método de Sistemas-L, houve uma facilidade em sua construção, pois na ferramenta de programação matemática há um auxilio na geração de linhas a partir de dois pontos dados como coordenada. Porém, esta solução da ferramenta no intuito de auxiliar o usuário da mesma, torna-se pouco flexível quando se necessita aplicar cálculos de novas coordenadas como as utilizadas neste projeto (translação, escalonamento, reflexão e rotação), no intuito de se gerar uma nova imagem, reaproveitando as informações da imagem original. Para que haja um maior aproveitamento da imagem é necessário obter a coordenada dos pontos ou pixels. Para tal problema, houve a necessidade de se armazenar todo o percurso de um ponto a outro dos galhos e folhas em uma matriz. Onde existia a linha criada automaticamente pela ferramenta de programação matemática, houve um mapeamento e gravação dessas coordenadas para então utilizá-la posteriormente. 36 Figura 16 – Exemplo de sistemas L (a) galhos e folhas gerados com linhas (b) criado através de plotagem Através do processamento para a criação da imagem fractal, baseada no modelo do Sistema-L e o armazenamento destes pontos em uma matriz, torna-se possível criar outras imagens a partir destas coordenadas, sem a necessidade de reproduzi-las novamente, gerando uma nova matriz, mas apenas reutilizando estes pontos para criar imagem semelhantes, porém com tamanho, posicionamento e graus diferentes em relação a imagem original. 37 Figura 17 – Imagem gerada através da duplicação da figura gerada pelo Sistema-L, na forma de reflexo. Com o armazenamento das coordenadas de cada ponto ou pixel em um matriz, tornase possível a geração de imagens das mais variadas formas sem a necessidade de se gerar uma matriz para cada imagem. Reutilizando a matriz gerada e adicionando os conceitos de Computação Gráfica, torna-se possível a geração de imagens como a da Figura 17. 5.2 Criação de árvore utilizando o Sistema de Funções Iterativas Para a criação de uma imagem em Sistema de Funções Iterativas, utilizou-se um algoritmo responsável pela criação do Arbusto de Barnsley. 38 Com o armazenamento em uma matriz destas coordenadas dos pontos ou pixels responsáveis pela criação da imagem do Arbusto de Barnsley, tornou-se possível à criação de uma árvore, apenas com a reutilização destas coordenadas. Torna-se possível observar que a idéia de reaproveitamento das coordenadas, geradas através de uma interação pode ser praticada para ambos os modelos de geração de fractais utilizados neste trabalho. Figura 18 – Reprodução de várias folhas formando uma árvore, através das coordenadas dos pontos ou pixels de uma folha, armazenados em uma matriz. Para a elaboração da árvore, através do Sistema de Funções Iterativas, utilizou-se de um determinado tempo para se resolver o problema de harmonia entre as folhas ou arbustos, buscando resultar este grupo de folhas em uma árvore. Com isso houve a necessidade de se criar um caule, além de escalonar, transladar e rotacionar as folhas ou arbustos, em busca de um melhor posicionamento. 39 5.3 Criação das imagens unindo os modelos fractais em um mesmo algoritmo No momento da união dos algoritmos com métodos distintos, Sistema de Funções Iterativas e o Sistema-L, há a necessidade de se definir um tamanho padrão para ambas as imagens, tendo também a necessidade de se corrigir o algoritmo responsável pela criação do caule, onde o tamanho do mesmo deve acompanhar as folhas geradas pelo algoritmo de Sistemas de Funções Iterativas. Com o tamanho das imagens já definidos nos algoritmos, o próximo passo é o posicionamento das imagens, de forma que cada uma ocupe seu plano sem que não haja uma imagem sobrescrevendo outra. (a) (b) (c) (d) Figura 19 - Imagens geradas a partir do código (a) Imagem gerada através do código contendo o modelo de Sistema de Funções Iterativas; (b) Imagem gerada através do código contendo o modelo de Sistema-L; (c) Imagem gerada através do código contendo o modelo de Sistema-L; (d) Imagem gerada através do código contendo o modelo de Sistema de Funções Iterativas; Logo após a criação do algoritmo que gera a figura 20, torna-se necessário apenas o armazenamento deste código gerador da imagem, não necessitando o armazenamento da imagem gerada, que por sua vez ocupa mais espaço de armazenamento de dados. Sendo 40 assim, será poupado espaço de armazenamento, mas haverá maior exigência da máquina ou computador sempre que houver a necessidade de se gerar a imagem novemente. 5.4 Criação da imagem através da Ferramenta PAINT Com uma ferramenta específica para tratamento de imagens como a ferramenta básica PAINT da Microsoft, o ato de construir uma imagem torna-se uma tarefa mais prática e iterativa, onde o usuário não necessita de conhecimentos sobre codificação de algoritmos, pois as ferramentas deste gênero dão ao usuário, a sensação de estar manuseando de fato um objeto. Com a utilização de ferramentas de construção de imagens iterativas, a geração de uma imagem consome menos tempo de processamento de máquina em relação à geração de imagens através de algoritmos, utilizando modelos de criação de imagens fractais onde o mesmo baseia-se em algoritmos recursivos, que por sua vez, são algoritmos responsáveis por aproveitar mais tempo de processamento e menos trabalho humano, ou seja, transferir todo o trabalho para a máquina ou computador. (a) (b) (c) (d) Figura 20 - Imagem gerada através da ferramenta PAINT, de forma prática e interativa. (a) Imagem gerada no PAINT de forma interativa simulando o Sistema de Funções Iterativas; (b) Imagem gerada no PAINT de forma interativa, simulando o Sistema-L; (c) Imagem gerada no PAINT de forma interativa, simulando o Sistema-L; (d) Imagem gerada no PAINT de forma interativa simulando o Sistema de Funções Iterativas; 41 Através desta prática de criação de imagens de forma prática, há a necessidade de se armazenar esta imagem, ao contrário da prática vista anteriormente, onde se armazena o algortimo responsável por gerar a imagem e não a imagem gerada. Com tal prática, torna-se necessário a utilização de maior espaço em armazenamento de dados, porém sendo menos exigido o tempo de processamento de tal máquina ou computador. 5.5 Comparativo entre os dois métodos utilizados, para a criação de uma mesma imagem. Para testar o tempo de processamento necessário na criação de imagens fractais através de uma ferramenta de programação matemática, responsável por gerar imagens através de algoritmos e compará-las ao tempo de criação de imagens semelhantes, porém utilizando-se da ferramenta Paint para criá-las, foi utilizado um Notebook da HP (Compaq nx6125) com as seguintes configurações: Hardware: • Processador 1.6 GHz; • Memória RAM DDR (333 Mhz) de 512 MB (duas de 256 MB cada); • Placa de video compartilhada (NVIDIA) de 128 MB; • Hard Disk com capacidade de 40 GB. • Sistema Operacional Windows XP Professional (Service Pack 3); • Ferramenta de programação matemática; • Paint (Microsoft). Software: 42 Para a obtenção dos resultados obtidos na Tabela 03, foi efetuado testes através da geração da Figura 19 por uma ferramenta de programação matemática. EXECUÇÃO 1 2 3 4 MÉDIA FINAL TEMPO DE PROCESSAMENTO (EM SEGUNDOS) TEMPO DE PROCESSAMENTO (PADRÃO HH:MM:SS) 83,953 83,312 82,281 84,859 83,60125 00:01:24 00:01:23 00:01:22 00:01:25 00:01:23 Tabela 03 – Tabela de testes de processamento para criação das imagens fractais através de uma ferramenta de programação matemática. No caso da criação da mesma imagem utilizando a ferramenta PAINT, não há um consumo de tempo de processamento relevante da máquina ou computador, já que o mesmo é uma ferramenta interativa. Vale lembrar que o arquivo .JPG, gerado pela ferramenta PAINT é a própria imagem gerada, enquanto que o arquivo .M é o código que contém apenas o algoritmo responsável pela geração da imagem. NOME DA IMAGEM GERADO TAMANHO GERADO TIPO DE DOS ATRAVÉS DO ATRAVÉS ARQUIVO MÉTODO DO MÉTODO ARQUIVOS GERADO TRADICIONAL FRACTAL (EM KB) Figura 19 (a) Figura 20 (a) X X .M 5 KB .JPG 69 KB TAMANHO DOS ARQUIVOS (EM %) 7,24% do tamanho total do arquivo .JPG 1380% maior que o arquivo .M Tabela 04 – Testes comparativos com as imagens (a) de ambos os métodos de criação. 43 NOME DA IMAGEM GERADO GERADO TAMANHO TIPO DE ATRAVÉS DO ATRAVÉS DO DOS ARQUIVO MÉTODO MÉTODO ARQUIVOS GERADO TRADICIONAL FRACTAL (EM KB) Figura 19 (b) Figura 20 (b) X X .M 7 KB .JPG 150 KB TAMANHO DOS ARQUIVOS (EM %) 4,66% do tamanho total do arquivo .JPG 2143% maior que o arquivo .M Tabela 05 – Testes comparativos com as imagens (b) de ambos os métodos de criação. NOME DA IMAGEM GERADO GERADO TAMANHO TIPO DE ATRAVÉS DO ATRAVÉS DO DOS ARQUIVO MÉTODO MÉTODO ARQUIVOS GERADO TRADICIONAL FRACTAL (EM KB) Figura 19 (c) Figura 20 (c) X X .M 7 KB .JPG 147 KB TAMANHO DOS ARQUIVOS (EM %) 4,76% do tamanho total do arquivo .JPG 2100% maior que o arquivo .M Tabela 06 – Testes comparativos com as imagens (c) de ambos os métodos de criação. NOME DA IMAGEM GERADO TAMANHO GERADO TIPO DE ATRAVÉS DO ATRAVÉS DO DOS ARQUIVO MÉTODO MÉTODO ARQUIVOS GERADO TRADICIONAL FRACTAL (EM KB) Figura 19 (d) Figura 20 (d) X X .M 5 KB .JPG 70 KB TAMANHO DOS ARQUIVOS (EM %) 7,14% do tamanho total do arquivo .JPG 1400% maior que o arquivo .M Tabela 07 – Testes comparativos com as imagens (d) de ambos os métodos de criação. Importante ressaltar também que, havendo a necessidade de aumentar o número de imagens, esta alteração não afeta o tamanho do arquivo (contendo o código) .M da mesma proporção em que será afetado o tamanho do arquivo (contendo a imagem) .JPG. 44 6. CONCLUSÃO Como demonstrado, com os avanços contínuos da tecnologia e o crescimento exponencial da capacidade dos hardwares, torna-se bastante aceitável o fato de se aproveitar cada vez mais estas tecnologias, ao mesmo tempo poupando espaço de armazenamento de dados, possibilitando um maior número de códigos responsáveis por gerações de imagens. Com a combinação de modelos de geometria fractal, o Sistema de Funções Iterativas e o Sistema-L, aliado aos estudos de conceitos de computação gráfica resultaram na possibilidade de se criar imagens fractais, permitindo o reaproveitamento das mesmas armazenando as informações das coordenadas destas imagens em matrizes. Através destas informações, há possibilidade de reprodução de várias outras imagens provenientes da original, apenas pela inserção de algumas linhas de códigos. Porém, o resultado da geração destas imagens pode conter um crescimento considerável. Confrontando-se com um problema ainda existente no meio da informática, como enviar um arquivo por e-mail, sabendo-se que há um determinado limite de tamanho deste arquivo para envio, variando de acordo com cada prestador deste tipo de serviço, poderia se pensar em utilizar fractais para compactação da imagem a ser enviada, embora não tenha sido o problema abordado no trabalho. O mesmo problema não ocorre quando se trata do arquivo que contém o algoritmo responsável pela geração desta imagem, desde que haja por parte do receptor, a ferramenta responsável pela transformação deste código em uma imagem. 45 7. REFERÊNCIAS BIBLIOGRÁFICAS DEITEL, H.M; DEITEL P.J. Java: Como programar. 4ª Ed. Porto Alegre: Bookman, 2003. 893p. CASTRO, Leandro Nunes; CAMPELLO, Ricardo J. G. B.; HRUSCHKA, Eduardo R.; ROSATELLI, Marta C.. Computação Natural: Uma Breve Visão Geral. Programa de Mestrado em Informática da Universidade Católica de Santos, Santos, S.P., BR. Disponível via URL pelo LABORATÓRIO DE INTELIGÊNCIA COMPUTACIONAL APLICADA em: http://www.eletrica.ufsj.edu.br/~nepomuceno/ensino/complex/castro_nanobio.pdf. Acesso em 08/03/2008. LABORATÓRIO VIRTUAL DE COMPUTAÇÃO NATURAL. Geometria Fractal. Disponível via URL em: http://lsin.unisantos.br/lvcon. Acesso em 17/05/2008. CASTRO, Leandro Nunes. Fundamentals of Natural Computing: Basic Concepts, Algorithms and Applications. Local: Chapman & Hall/Crc, 2007. CASTRO, Leandro Nunes de. Inteligência de Enxame. http://lsin.unisantos.br/lvcon/tema?tema=6. Acesso em 15/03/2008. Disponível UNIVERSIDADE FEDERAL DO PARANA. Fractais: Propriedades e Construção. Disponível http://gauss.mat.ufpr.br/~karas/geralic2003.pdf. Acesso em 25/05/2008. via via URL URL em: em: ZUBEM, Professor Fernando J. Von. Introdução a Computação Natural. Disponível via FTP para download em ftp://ftp.dca.fee.unicamp.br/pub/docs/vonzuben/ia013_1s07/topico8_07.pdf. Acesso em 18/06/2008. PONTÍFICA UNIVERSIDADE CATÓLICA DO RIO GRANDE DO SUL. Origens da Computação Gráfica. Disponível via URL em: http://www.inf.pucrs.br/~pinho/CG/Aulas/Intro/intro.htm. Acesso em 13/07/2008. VIANNA, Arlindo Cardarett. Computação Gráfica. Disponível via URL em: http://www.inf.ufes.br/~thomas/graphics/www/apostilas/CIV2801AcvCompGraf.pdf. Acesso em 27/07/2008. VOLANTE, La Hoja. Disponível via URL em: http://www.uam.es/otros/hojavol/hoja12/fractales12.html. Acessado em 10/10/2008. MAPLE, Introduction to MATLAB, Disponível via URL http://www.math.tamu.edu/%7Eboas/courses/math696/matlab-introduction.html. Acesso em 30/08/2008. em: MATCH WORKS, Accelerating the pace of engineering and science. Disponível via URL em: http://www.mathworks.es/matlabcentral/index.html. Acesso em 06/09/2008. 46 8. ANEXOS %############################################################## % ALGORITMO RESPONSAVEL PELA GERACAO DA FIGURA 19 # %############################################################## % %############################################################## % CRIAÇAO DO SISTEMA-L # %############################################################## clear all; clf; aux = []; % tic %inicio da marcaçao do tempo % % Parte 0. Variaveis de Entrada %=============================== % Inclusao de regras para a construçao das imagens rule(1).vorher = 'F'; rule(1).danach = 'FF'; rule(2).vorher = 'G'; rule(2).danach = 'F-[[G]+G]+F[+FG]-G'; n_Rules = length(rule); % angulo: '+' = rotaciona sentido anti-horario; % angulo: '-' = rotaciona sentido horario. alpha = 25; % (angulo) % tamanho das linhas F e G length_F = 0.5; length_G = 0.1; % inicializando o string axiom = 'G'; % iteraçao (escolha somente de 1 a 7, >= 8 n_Repeats = 7; % Parte 1. Calcular a STRING %================================= %#################################################### hold on % armazena todas as plotagens durante o processamento # %#################################################### for i = 1:n_Repeats axiomINcells = cellstr(axiom'); for j = 1:n_Rules % encontrar todas as ocorrencias daquele axioma hit = findstr(axiom, rule(j).vorher); if (length(hit) >= 1) for k = hit axiomINcells{k} = rule(j).danach; end end end axiom = []; for j = 1:length(axiomINcells) % colocar todos os strings juntos 47 axiom = [axiom, axiomINcells{j}]; end end % % Parte 2. - PLOTAR %=================== % inicializaçao xT = 0; yT = 0; aT = 0; da = alpha/180*pi; % converter em raio stkPtr = 1; % for i = 1:length(axiom) cmdT = axiom(i); switch cmdT % é possivel adicionar multiplos casos aqui. case 'F' newxT = xT + length_F*cos(aT); newyT = yT + length_F*sin(aT); % plotar caracteristicas da linha % plotagem original das linhas sem salvamento dos pontos %line([yT newyT], [xT newxT],'color',[.3 .3 0], 'linewidth',2); % inicio da coleta de pontos dos galhos %alteraçao para salvar cada plotagem ponto-a-ponto dos galhos for y = 1:200 aux = [newyT;newxT]; end; % var_vet_1 = aux; var_vet_1 = var_vet_1 + [200;0]; % transladar a esquerda do eixo central var_vet_2 = [-1,0;0,1]*aux; % refletir imagem var_vet_2 = var_vet_2 + [-200;0]; % transladar a direira do eixo central % plot(var_vet_1(1,1),var_vet_1(2,1),'g.'); plot(var_vet_2(1,1),var_vet_2(2,1),'r.'); % final da coleta de pontos xT = newxT; yT = newyT; case 'G' newxT = xT + length_G*cos(aT); newyT = yT + length_G*sin(aT); % plotar caracteristicas da linha %line([yT newyT], [xT newxT],'color','g', 'linewidth',2); % inicio da coleta de pontos das folhas %alteraçao para salvar cada plotagem ponto-a-ponto das folhas for y = 1:200 aux = [newyT;newxT]; end; % var_vet_1 = aux; var_vet_1 = var_vet_1 + [200;0]; % transladar a esquerda do eixo central var_vet_2 = [-1,0;0,1]*aux; % refletir imagem var_vet_2 = var_vet_2 + [-200;0]; % transladar a direira do eixo central % plot(var_vet_1(1,1),var_vet_1(2,1),'m.'); plot(var_vet_2(1,1),var_vet_2(2,1),'k.'); % final da coleta de pontos xT = newxT; 48 yT = newyT; case '+' % rotacionar sentido anti-horario aT = aT + da; case '-' % rotacionar sentido horario aT = aT - da; case '[' % salvar a posicao corrente stack(stkPtr).xT = xT ; stack(stkPtr).yT = yT ; stack(stkPtr).aT = aT ; stkPtr = stkPtr +1 ; case ']' % retornar a posiçao de inicio (ultima posicao salva) stkPtr = stkPtr -1 ; xT = stack(stkPtr).xT ; yT = stack(stkPtr).yT ; aT = stack(stkPtr).aT ; otherwise disp('error'); return end end % %############################################################## % CRIAÇAO DOS CAULES # % ############################################################# caule_a = []; caule_b = []; y = 0.0; x = 0.0; k=1; for i = 1:10 for j = 1:20 caule_a(k,:)=[x,y]; caule_b(k,:)=[x,y]; y = y + 1; k=k+1; end x = x + 0.5; y = 0.000; end [tamanho_vetor,qqcoisa] = size(caule_a(:,1)); caule_a(:,1) = caule_a(:,1)+70; % transladar caule caule_b(:,1) = caule_b(:,1)-74; % transladar caule for i=1:tamanho_vetor plot(caule_a(i,1),caule_a(i,2), 'g.'); plot(caule_b(i,1),caule_b(i,2), 'g.'); end; % %############################################################# % CRIAÇAO DAS FOLHAS # %############################################################# it_max = 5000; x=[0;5]; % M=[ 0, 0, 0, 0.16, 0, 0, 0.01; 0.85, 0.04, -0.04, 0.85, 0, 1.6, 0.85; 0.2, -0.26, 0.23, 0.22, 0, 1.6, 0.07; 49 -0.15, 0.28, 0.26, 0.24, 0, 0.44, 0.07]; % vet = []; for i=1:it_max p= int8(1+(100-1)*rand); if p<=M(1,7)*100 L=1; else if p>M(1,7)*100 & p<=M(1,7)*100+M(2,7)*100 L=2; else if p>M(1,7)*100+M(2,7)*100 & p<=M(1,7)*100+M(2,7)*100+M(3,7)*100 L=3; else if p>M(1,7)*100+M(2,7)*100+M(3,7)*100 & p<M(1,7)*100+M(2,7)*100+M(3,7)*100+M(4,7)*100 L=4; end end end end w1(1,1)=M(L,1); w1(1,2)=M(L,2); w1(2,1)=M(L,3); w1(2,2)=M(L,4); w2(1,1)=M(L,5); w2(2,1)=M(L,6); x = w1*x+w2; vet(:,i) = x; end % for i=1:it_max %============================================================================== %= FORMAR IMAGENS DAS FOLHAS A PARTIR DO CAULE FORMANDO UMA PLANTA = %============================================================================== % folhas da arvore B (esquerda) folha_d1_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao % rotacionar folha horario folha_d1_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d1_b; folha_d1_b = folha_d1_b + [0;1]; % transladar folha folha_d1_b = folha_d1_b * 10; % escalonar % % rotacionar folha horario folha_e1_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e1_b = folha_e1_b + [0;1]; % transladar folha folha_e1_b = folha_e1_b * 10; % escalonar % folha_d2_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao % rotacionar folha horario folha_d2_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d2_b; folha_d2_b = folha_d2_b + [0;5]; % transladar folha folha_d2_b = folha_d2_b * 8; % escalonar % % rotacionar folha horario folha_e2_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e2_b = folha_e2_b + [0;5]; % transladar folha folha_e2_b = folha_e2_b * 8; % escalonar % folha_d3_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao 50 % rotacionar folha horario folha_d3_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d3_b; folha_d3_b = folha_d3_b + [0;11]; % transladar folha folha_d3_b = folha_d3_b * 6; % escalonar % % rotacionar folha horario folha_e3_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e3_b = folha_e3_b + [0;11]; % transladar folha folha_e3_b = folha_e3_b * 6; % escalonar % folha_d4_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao % rotacionar folha horario folha_d4_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d4_b; folha_d4_b = folha_d4_b + [0;22]; % transladar folha folha_d4_b = folha_d4_b * 4; % escalonar % % rotacionar folha horario folha_e4_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e4_b = folha_e4_b + [0;22]; % transladar folha folha_e4_b = folha_e4_b * 4; % escalonar % folha_d5_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao % rotacionar folha horario folha_d5_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d5_b; folha_d5_b = folha_d5_b + [0;51]; % transladar folha folha_d5_b = folha_d5_b * 2; % escalonar % % rotacionar folha horario folha_e5_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e5_b = folha_e5_b + [0;51]; % transladar folha folha_e5_b = folha_e5_b * 2; % escalonar % folha_d6_b = [-1,0;0,1]*vet(:,i); % receber informacao da imagem padrao % rotacionar folha horario folha_d6_b = [cos(50*(pi/180)),sin(50*(pi/180));-sin(50*(pi/180)),cos(50*(pi/180))]*folha_d6_b; folha_d6_b = folha_d6_b + [0;110]; % transladar folha % % rotacionar folha horario folha_e6_b = [cos(-50*(pi/180)),sin(-50*(pi/180));-sin(-50*(pi/180)),cos(-50*(pi/180))]*vet(:,i); folha_e6_b = folha_e6_b + [0;110]; % transladar folha % % reutilizar as folhas formadas para a criaçao de novas arvores % %folhas da arvore A (direita) folha_d1_a = folha_d1_b + [72;0]; % transladar folha folha_e1_a = folha_e1_b + [72;0]; % transladar folha folha_d2_a = folha_d2_b + [72;0]; % transladar folha folha_e2_a = folha_e2_b + [72;0]; % transladar folha folha_d3_a = folha_d3_b + [72;0]; % transladar folha folha_e3_a = folha_e3_b + [72;0]; % transladar folha folha_d4_a = folha_d4_b + [72;0]; % transladar folha folha_e4_a = folha_e4_b + [72;0]; % transladar folha folha_d5_a = folha_d5_b + [72;0]; % transladar folha folha_e5_a = folha_e5_b + [72;0]; % transladar folha folha_d6_a = folha_d6_b + [72;0]; % transladar folha folha_e6_a = folha_e6_b + [72;0]; % transladar folha % %folhas da arvore A (esquerda) folha_d1_b = folha_d1_b + [-72;0]; % transladar folha folha_e1_b = folha_e1_b + [-72;0]; % transladar folha 51 folha_d2_b = folha_d2_b + [-72;0]; folha_e2_b = folha_e2_b + [-72;0]; folha_d3_b = folha_d3_b + [-72;0]; folha_e3_b = folha_e3_b + [-72;0]; folha_d4_b = folha_d4_b + [-72;0]; folha_e4_b = folha_e4_b + [-72;0]; folha_d5_b = folha_d5_b + [-72;0]; folha_e5_b = folha_e5_b + [-72;0]; folha_d6_b = folha_d6_b + [-72;0]; folha_e6_b = folha_e6_b + [-72;0]; % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % transladar folha % % plotar pontos das folhas da planta B plot(folha_d1_b(1,1),folha_d1_b(2,1),'g.'); plot(folha_e1_b(1,1),folha_e1_b(2,1),'g.'); plot(folha_d2_b(1,1),folha_d2_b(2,1),'g.'); plot(folha_e2_b(1,1),folha_e2_b(2,1),'g.'); plot(folha_d3_b(1,1),folha_d3_b(2,1),'g.'); plot(folha_e3_b(1,1),folha_e3_b(2,1),'g.'); plot(folha_d4_b(1,1),folha_d4_b(2,1),'g.'); plot(folha_e4_b(1,1),folha_e4_b(2,1),'g.'); plot(folha_d5_b(1,1),folha_d5_b(2,1),'g.'); plot(folha_e5_b(1,1),folha_e5_b(2,1),'g.'); plot(folha_d6_b(1,1),folha_d6_b(2,1),'g.'); plot(folha_e6_b(1,1),folha_e6_b(2,1),'g.'); % % plotar pontos das folhas da planta A plot(folha_d1_a(1,1),folha_d1_a(2,1),'g.'); plot(folha_e1_a(1,1),folha_e1_a(2,1),'g.'); plot(folha_d2_a(1,1),folha_d2_a(2,1),'g.'); plot(folha_e2_a(1,1),folha_e2_a(2,1),'g.'); plot(folha_d3_a(1,1),folha_d3_a(2,1),'g.'); plot(folha_e3_a(1,1),folha_e3_a(2,1),'g.'); plot(folha_d4_a(1,1),folha_d4_a(2,1),'g.'); plot(folha_e4_a(1,1),folha_e4_a(2,1),'g.'); plot(folha_d5_a(1,1),folha_d5_a(2,1),'g.'); plot(folha_e5_a(1,1),folha_e5_a(2,1),'g.'); plot(folha_d6_a(1,1),folha_d6_a(2,1),'g.'); plot(folha_e6_a(1,1),folha_e6_a(2,1),'g.'); % end % % sets data aspect ratio daspect([1,1,1]); % tempo = toc 52
Documentos relacionados
fractais – a linguagem do caos
folhas e com outros ainda, poderíamos gerar 'estranhas criaturas aquáticas' de um realismo preocupante. Este tipo de questões e muitas outras, podem levar-nos a pensar, até que ponto, os princípios...
Leia mais