4.8. Triângulo de Sierpinski

Outro fractal que exibe a propriedade da auto-similaridade é o Triângulo de Sierpinski. Um exemplo é mostrado na Figura 3. O triângulo de Sierpinski ilustra um algoritmo recursivo de três vias. O procedimento para desenhar um triângulo de Sierpinski à mão é simples. Comece com um único triângulo grande. Divida este triângulo em quatro novos triângulos ligando o ponto médio de cada lado. Ignorando o triângulo do meio que acabou de criar, aplique o mesmo procedimento a cada um dos três triângulos nos cantos. Cada vez que você criar um novo conjunto de triângulos, recursivamente aplique este procedimento para os três triângulos menores nos cantos. Você pode continuar a aplicar este procedimento indefinidamente se tiver um lápis bastante afiado. Antes de continuar lendo, tente desenhar um triângulo de Sierpinski usando esse método.

../_images/sierpinski.png

Figura 3: O Triângulo de Sierpinski

Como podemos continuar aplicando o algoritmo indefinidamente, qual é o caso base? Vamos ver que o caso base é definido arbitrariamente como o número de vezes que queremos dividir o triângulo em pedaços. As vezes nós chamamos esse número de “grau” do fractal. Cada vez que fazemos uma chamada recursiva, subtraímos 1 do grau até chegarmos a 0. Quando atingirmos o grau 0, paramos de fazer chamadas recursivas. O código que gerou o Triângulo de Sierpinski na Figura 3 é mostrado no ActiveCode 1.

O programa no ActiveCode 1 segue as idéias descritas acima. A primeira coisa que a função sierpinski faz é desenhar o triângulo externo. Em seguida, são feitas três chamadas recursivas, uma para cada um dos novos triângulos que obtemos nos cantos quando conectamos os pontos médios. Mais uma vez fazemos uso do módulo turtle, nativo do Python. Você pode aprender todos os detalhes dos métodos disponíveis no módulo de turtle usando help('turtle') do prompt do Python.

Olhe para o código e pense na ordem em que os triângulos serão desenhados. Enquanto a ordem exata dos cantos depende de como o conjunto inicial for especificado, vamos supor que os cantos estejam ordenados como inferior esquerdo, superior e inferior direito. Por causa da maneira como a função sierpinski chama a si mesma, sierpinski desenha até o menor triângulo permitido no canto inferior esquerdo e, em seguida, começa a preencher o resto dos triângulos no caminho de volta. Então preenche os triângulos no canto superior, desenhando até o menor e mais alto triângulo. Finalmente, ele preenche o canto inferior direito, desenhando até o menor triângulo no canto inferior direito.

Às vezes é útil pensar em um algoritmo recursivo em termos de um diagrama de chamadas de função. A Figura 4 mostra que as chamadas recursivas são sempre feitas para a esquerda. As funções ativas são delineadas em preto, e as chamadas de função inativas estão em cinza. Quanto mais longe você for em direção ao final da Figura 4, tanto menor serão os triângulos. A função termina desenhando um nível de cada vez; uma vez que ela termina com a parte inferior esquerda, ela se move para a parte inferior do meio, e assim por diante.

../_images/stCallTree.png

Figura 4: Construindo um Triângulo de Sierpinski

A função sierpinski depende muito da função getMid, que recebe como argumentos dois pontos extremos e retorna o ponto posicionado no meio entre eles. Além disso, o ActiveCode 1 tem uma função que desenha um triângulo preenchido usando os métodos begin_fill e end_fill do módulo turtle.

Next Section - 4.9. Problemas Recursivos Complexos