APPLICATIONSCREATION GRAPHIQUE ★ TÉCNICAS FRACTAIS ★

Fractais CPC (Amstrad Magazine)Applications Creation Graphique
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Recursão e fractais são dois tópicos muito comuns nos dias de hoje. A listagem 1 é uma breve rotina que ilustra bem estes conceitos, desenhando uma curva denominada “o dragão” e produzindo gráficos complexos com muito poucas linhas.

A recursão pode implementar-se de forma simples utilizando linguagens estruturadas que permitam definir procedimentos e funções com variáveis locais, como por exemplo o PASCAL ou o C, ou ainda alguns dialectos BASIC. No entanto, como o BASIC do Amstrad CPC não nos facilita esses recursos, teremos que realizar alguns truques.

Um procedimento é similar a uma subrotina, mas acede-se a ele pelo seu nome em vez do seu número de linha. Por exemplo, em vez de usar-se a instrução GOSUB 1000 utiliza-se uma instrução, suponhamos, PROCprint, sendo este o nome do procedimento que concebemos para uma tarefa de impressão concreta. Deste modo, o nome do procedimento converte-se em mais uma instrução da linguagem que estivermos a utilizar.

As variáveis locais diferenciam-se das globais (no BASIC do CPC são sempre globais) na medida em que, ainda que ambas sejam acessíveis de qualquer parte do programa, qualquer coisa que façamos numa variável local se desfaz quando o programa sai do procedimento.

Daqui se deduz que se um procedimento utiliza uma variável local, x por exemplo, então o procedimento chama-se assim mesmo (isso é a recursão) e existirão duas variáveis locais em fun-

cionamento. Não obstante, como ambas são locais, qualquer coisa que aconteça a x neste segundo nível de recursão não afectará a variável x do primeiro nível de recursão. Deste modo, as variáveis x são totalmente independentes apesar de terem o mesmo nome.

Os programas recursivos necessitam das variáveis locais por este motivo. A listagem 2 é um exemplo de como se poderia calcular o factorial de um número com um BASIC que admitisse definição de procedimentos com variáveis locais. Isto é impossível no BASIC Locomotive. Substituir os procedimentos por subrotinas é bastante fácil no Amstrad, mas as variáveis locais representam um grave problema. Na verdade, não há forma de conseguir verdadeiras variáveis locais, mas podemos simulá-las utilizando uma matriz.

Um inconveniente desta é que necessitamos de conhecer de antemão quantos níveis de recursão utilizará o programa para dimensionar a matriz com esse número de elementos. Na listagem 1 chamamos à matriz "stack”.

Para que a subrotina não interfira com uma variável que não lhe pertença, fazemos com que a subrotina, num nível n-ésimo de recursão, utilize o n-ésimo elemento da matriz como variável local. O nível de recursão armazena-se na variável sp (advindo do registo SP do microprocessador) e está limitado pelo númerode vezesque o BASIC permite acolher subrotinas. Neste programa o limite é de 75, e se o ultrapassamos o computador deterá a execução do programa com uma mensagem de erro “Memory full”. A variável sp aumentaemumaunidadecadavezque chamamos a subrotina e diminui em uma unidade quando saimos da subrotina.

A curva desenhada pelo programa é do tipo conhecido como “fractais", e uma das suas características consiste em que, quanto mais de perto examinamos uma secção, mais padrões semelhantes encontramos repetindo-se a si mesmos numa escala menor. É aqui que entra a recursão e quanto maior for a profundidade de recursão alcançada mais detalhada será a curva.

O traçado da curva corresponde às linhas entre a 150 e a 210 e utiliza dois parâmetros: sz, que é global, e stack(sp) que é local. O primeiro fixa o comprimento da linha e o segundo diz ao programa se deve ou não desenhar uma secção da curva.

Para evitar que o Amstrad fique "pendurado” (ou até que se produza um erro), cada vez que a subrotina se chama a si mesma, a variável local reduz-se de uma unidade, de forma que chegará um momento em que valerá zero, altura em que desenhará uma linha e continuará. Esta é a “escada" pela qual as subrotinas podem “trepar” para sair do buraco que elas próprias cavaram.

Se se quiser ver com detalhe o que acontece quando se executa a listagem 1, pode imprimir-se o valor de sp no começo da subrotina. Utilize um comando LOCATE para que apareça sempre na mesma posição no ecrã e inclua um curto espaço de tempo para que se possa ler o valor de sp.

Os fractais reflectem o modo de comportamento de certos acontecimentos naturais, e isto observa-se em fenómenos tão diversos como o estuário do Nilo e a actividade magnética do Sol. Os fractais são bastante interessantes, e as técnicas recursivas facilitam a sua programação.

A listagem 3 é outra variação sobre este tema. Experimente utilizar as variáveis para ver efeitos diversos.

Geometria fractal e o conjunto de Mandelbrot

A listagem 4 é um programa concebido para desenhar diversas áreas da região relacionada com um conjunto de números conhecido como O Conjunto de Mandelbrot, assim chamado em homenagem a B.B.Mandelbrot, que realizou importantes trabalhos no campo das matemáticas fractais.

Podemos pensar no conjunto de Mandelbrot como uma forma em duas dimensões que se pode ver na figura 1. O mais interessante sobre este conjunto é que se ampliamos uma das suas orlas observamos que os pequenos bolbos são formados por outros ainda mais pequenos. Um maior nível de ampliação revela uma disposição intrincada de fibras finas e formas arredondadas unidas à forma principal do conjunto de Mandelbrot.

Algumas destas fibras são como pequenas versões em miniatura da forma principal. Podemos ampliar uma orla uma e outra vez para alcançar um detalhe cada vez maior. Ainda que a área da forma de Mandelbrot seja finita, a sua orla é infinitamente complexa e de comprimento infinito. Na terminologia matemática a forma é “fractal".

Falar de orlas infinitamente complexas pode soar como se produzir o conjunto de Mandelbrot estivesse muito para além das capacidades do pobre Amstrad CPC, pois levaria um tempo infinito. No entanto, o método ou algoritmo para conseguiros números que formam o conjunto é surpreendentemente simples. Falando matemáticamente, o conjunto de Mandelbrot é o conjunto dos números complexos o para os quais a interacção z=z T 2+c converge.

Se isto lhe soa muito confuso, veja-o deste modo. Tomemos dois números, digamos x e y, que utilizaremos como constantes, e duas variáveis, a e b, que trocaremos e modificaremos num ciclo. A forma para actualizar a e b é a seguinte:

novo a= (velho a) q² - (velho b) ↑ 2 +x

novo b= 2* (velho a)*(velho b) + y

Os valores iniciais de a e b são zero. Estas formulas proporcionam-nos novos valores de a e b que de novo se introduzem nas fórmulas na seguinte interacção do ciclo.

Se fazemos isto repetidamente pode ocorrer uma destas duas coisas:

  1. a ou b podem afastar-se até ao infinito.
  2. a e b podem tender a valores constantes.

O que fazemos é tomar muitos valores diferentes para x e y e utilizar o ciclo para ver que tipo de resultado nos proporcionam. Se for do primeiro tipo, colorimos o ponto das coordenadas (x,y) de branco, e se for do segundo tipo colorimos de negro. Procedendo desta maneira, para os valores adequados de x e y obteremos uma forma como a da figura 1.

O funcionamento do programa é o seguinte: primeiro seleccionamos uma margem de valores de x e y a examinar. Depois colorimos cada pixel do ecrã da cor adequada, dependendo do resultado do ciclo para cada par de valores x e y.

Para adicionar alguma variedade ao desenho, em vez de colorir o caso 1 apenas com branco, utilizaremos uma cor que depende de quão rápido a e b tendem ao infinito. Isto proporciona um interessante efeito de cor ao redor da orla negra do conjunto de Mandelbrot.

Um bom método para decidir se a e b convergem até um valor fixo é colocar um controle no ciclo para ver se a soma dos quadrados excede o valor 4.

Deste modo, o número de vezes que se tem de executar o ciclo para que isto ocorra pode ser usado como medida de quão rapidamente a e b tendem ao infinito. Se não se ultrapassa o valor de 4 depois de 100 execuções do ciclo, pode considerar-se, com certeza total, que tendem para um valor fixo.

É facil realizar um programa que faça tudo isto em BASIC, mas o elevado número de cálculos necessários, especialmente as 100 interacções para os valores do conjunto de Mandelbrot, farão com que o resultado seja demasiado lento. Para obter bons resultados num tempo razoável, os ciclos que realizarão o calculo principal e a impressão de pontos, estão escritos em código máquina, com um pouco de BASIC para inicializar quadros e outras tarefas.

Isto permite obter a maioria dos gráficos em poucas horas. Considerando que o programa trabalha em MOD01 e que calcula a cor de uns 58.000 pixels não está nada mal...

O código máquina armazena-se em linhas de DATA e se se comete algum erro na sua digitação o programa dirá em que linha se encontra o erro. No entanto, não deixa de ser uma boa ideia gravar o programa antes de o experimentar pela primeira vez.

Uma vez executado o programa é preciso esperar alguns segundos antes de este se inicializar, e de seguida aparecerá um menu na parte inferior do ecrã. As opções disponíveis são:

Gravar: Salvaguarda a imagem actual na disquete. As informações de cor e parametros ficam também gravadas.

Carregar: Carrega uma imagem gravada previamente.

Executar: Cria uma imagem a partir dos parametros introduzidos através do teclado. O programa calcula o último valor de y para manter o gráfico nas suas proporções correctas.

Zoom: Permite ampliar uma área do desenho actual. É preciso definir o canto inferior esquerdo e o canto superior direito, utilizando as teclas de cursor, e digitando ENTER para confirmar. O programa encarrega-se de manter as proporções correctas da área.

CORES: Digitando as teclas 1,2 ou 3 do teclado principal mudamos de forma ciclíca as cores correspondentes através de toda a palete de cores à excepção do negro.

Uma boa forma de explorar o conjunto de Mandelbrot é usar primeiro a opção EXECUTAR para obter uma imagem completa do conjunto. Introduza então x1 =-2.3, x2=1.1, y1 =-1.19 e quando o desenho estiver terminado salvaguarde-o.

Este desenho servirá como mapa do território fractal, de modo que poderá ampliar as áreas mais interessantes com a opçã o ZOOM. Em geral, as áreas próximas do conjunto de Mandelbrot são as visualmente mais atractivas, devendo incluir-se algo da zona negra no desenho.

Também é aconselhável fazer com que a diferença entre x1 e x2 seja maior que 0.002 para evitar mutilar as formas com erros de arredondamento de calculo. O quadro 1 mostra algumas boas coordenadas para experimentar.

Devido à natureza dos fractais o programa pode ser utilizado para observar literalmente milhões de zonas interessantes em torno do conjunto de Mandelbrot. Uma vez que se tenham criado e gravado desenhos fractais, a listagem 5 servirá para produzir fascinantes ecrãs animados. Facilmente poderá executar um ecrã e escolher os valores das cores para que os anéis do desenho pareçam fluir do próprio ecrã.

Amstrad Magazine

★ PUBLISHER: Amstrad Magazine (Publinfor)
★ ANNÉE: 1988
★ CONFIG: 64K + AMSDOS
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEUR(S): ???
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» Fractais  CPC    (Amstrad  Magazine)    LISTING    PORTUGUESEDATE: 2021-02-02
DL: 246
TYPE: PDF
SiZE: 893Ko
NOTE: 7 pages/PDFlib v1.6

» Fractais  CPC    (Amstrad  Magazine)    PORTUGUESEDATE: 2018-08-27
DL: 198
TYPE: PDF
SiZE: 1009Ko
NOTE: 7 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 556 millisecondes et consultée 1144 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.