Desenhando uma Flor

 

Vamos, agora, explorar a tarefa de desenhar uma flor, conforme apresentado ao lado. Há algumas regularidades que, se observadas, facilitam enormemente a resolução deste problema. A mais importante é perceber que a flor é composta por um conjunto de pétalas e que as folhas presas no caule seguem o mesmo padrão, apesar de terem tamanhos e cor diferentes. Se soubermos, então, como desenhar uma pétala, praticamente resolvemos a questão.

Para se desenhar uma petála há pelo menos duas abordagens possíveis. A primeira delas é utilizarmos a técnica conhecida por tentativa e erro, ou seja, tentar construir uma pétala, e se não der certo, testar uma outra estratégia até finalmente conseguirmos.

A segunda  abordagem passa por revermos alguns conceitos de geometria. Note que as duas curvas que definem uma pétala (ou folha) são arcos de uma circunferência e são simétricas. Sendo assim, o problema de desenhar uma pétala recai em desenharmos dois arcos de circunferência iguais, porém simétricos.

Nós já sabemos como desenhar uma circunferência, fato que facilita a tarefa de desenhar um arco de circunferência: basta desenhar apenas uma parte dela. Uma forma interessante de definir um arco é indicarmos o ângulo correspondente, sabendo que uma circunferência tem 3600 em sua totalidade (um arco de 3600 é a própria circunferência). Na figura ao lado, por exemplo, em azul aparece um arco de circunferência correspondente a 600 da circunferência.

arco: umAngulo raio: umRaio

    "Desenha um arco de circunferência tendo
              umAngulo (um número inteiro positivo)
              e umRaio como parâmetros"

    |lado|

    lado := (2 * Float pi * umRaio) / 360.
    umAngulo vezesRepita: [
        caneta anda: lado;
               gira: 1
    ].

A ação para desenhar um arco é basicamente a mesma de desenho da circunferência. Para facilitar a implementação, contudo, optamos por desenhar um polígono regular de 360 lados (consequentemente a caneta gira 1 gráu a cada iteração), de forma que o ângulo do arco (um número inteiro) é diretamente o número de lados do polígono regular necessários para se desenhar o arco.

Agora podemos desenhar uma pétala. Como precisamos de pétalas de tamanhos diferentes, vamos manter o ângulo como parâmetro.

petala: umAngulo

    "Desenha uma pétala tendo umAngulo
       (um número inteiro positivo)
       como parâmetro"

    caneta arco: umAngulo raio: 40;
           gira: 180 - umAngulo;
           arco: umAngulo raio: 40.

A ação resume-se a desenhar dois arcos, havendo um giro intermediário para se obter a simetria. Note que as pétalas são sempre desenhadas com um raio constante de 40 unidades. Este valor pode ser modificado se com o número 40 não obtivermos pétalas com o formato desejado.

O desenho à direita foi obtido pela execução do comando: "caneta petala: 100", estando inicialmente a caneta apontando para cima (900). Como está, esta ação tem dois defeitos relevantes. Em primeiro lugar, a pétala está inclinada para a direita. Em segundo lugar, há o efeito colateral de modificar a direção e a posição da caneta. Não há nada de errado com a ação, mas parece muito mais sensato que a pétala seja desenha na direção para a qual a caneta está apontando no momento anterior à execução da ação. Também parece bastante interessante que a caneta volte para a situação em que ela se encontrava antes da ação ser executada. A implementação que se segue mostra como obter esta situação.

petala: umAngulo

    "Desenha uma pétala tendo umAngulo 
        (um número inteiro positivo)
        como parâmetro"

    caneta gira: umAngulo / -2;
           arco: umAngulo raio: 40;
           gira: 180 - umAngulo;
           arco: umAngulo raio: 40;
           gira: 180 - (umAngulo / 2 ).

Foram acrescentados dois giros, um no ínicio e outro no final da ação. A figura ao lado apresenta o estado inicial da caneta (bem a esquerda) e, da esquerda para a direita, o estado da caneta após a execução de cada uma das linhas da ação #petala:, considerando o comando: "caneta petala: 100".

As ações abaixam completam o desenho da flor. A ação de desenhar a flor  inicia com a modificação da espessura dos rastros da caneta para 3 unidades. De forma a facilitar sua compreensão ela foi decomposta em duas ações mais simples: petalas e caule.

flor

    "Desenha uma flor"

    caneta fixaEspessura: 3;
           petalas;
           caule.
petalas

    "Desenha as pétalas da flor"

    caneta fixaCorDosRastros: VerdeMar.
    4 vezesRepita: [
           caneta petala: 100;
                  gira: 90
    ].
    caneta fixaCorDosRastros: VerdeEscuro;
           gira: 45.
    4 vezesRepita: [
           caneta petala: 100;
                  gira: 90
    ].
    caneta gira: -45.
caule

    "Desenha o caule da flor"

    caneta gira: 180;
           fixaCorDosRastros: Marrom;
           anda: 140;
           gira: 180;
           anda: 30;
           gira: -45;
           petala: 70;
           gira: 45;
           anda: 10;
           gira: 45;
           petala: 50;
           gira: -45;
           anda: 100.