sexta-feira, 11 de outubro de 2013

Olhar ... e ver

Dominar a complexidade é uma das questões mais importantes na resolução informática de problemas. Existem diferentes maneiras de o fazer, isto é, de reduzir a dificuldade em resolver um problema, como por exemplo começar por resolver uma versão mais simples do problema, esquecendo alguns detalhes da especificação e depois completar a solução adicionando o que falta, ou decompondo o problema em sub-problemas mais simples que são resolvidos separadamente, ficando para uma segunda fase agrupar as soluções parciais na solução desejada. Vamos exemplificar retomando o exemplo do desenho do logotipo dos jogos olímpicos.
Olhando para o desenho o que vemos? Cinco circunferências, com o mesmo raio, a mesma espessura do traço, mas cores e posições diferentes. A pergunta que devemos fazer é: se eu souber desenhar uma circunferência com um dado raio, espessura, cor e posição tenho a vida facilitada para desenhar as cinco? Claramente. Vamos então meter mãos à obra, resolvendo o problema de um modo geral para podermos posteriormente usar para as cinco situações diferentes. Podemos começar por esquecer vários dos atributos que devemos considerar e pensar apenas em desenhar uma circunferência com um dado raio. Simples, certo?
def circunferência(raio):
 turtle.circle(raio)
Acrescentemos agora a posição.
def circunferência(posx, posy,raio):
 # Posição
    turtle.penup()
     turtle.goto(posx, posy)
     turtle.pendown()
 # Desenha
 turtle.circle(raio)
Procedendo de igual modo para os outros atributos chegamos à versão final completa.
def circunferencia(posx, posy, cor, raio, espessura):
    # Define atributos
    turtle.penup()
    turtle.goto(posx, posy)
    turtle.pendown()
    turtle.pencolor(cor)
    turtle.width(espessura)
    # Desenha e Esconde tartaruga
    turtle.circle(raio)
    turtle.hideturtle()
Este programa permite desenhar uma circunferência podendo ser controladas a posição, o raio, a cor e a espessura. Fica por fazer dispor cinco circunferências em posições precisas. A figura que se segue ajuda-nos nos cálculos.
Assim se a posição da circunferência central da linha de cima for (x,y) as coordenadas das restantes são:

cima, à direita: (x+ 2*raio + delta, y)
cima, à esquerda: (x - 2*raio - delta,y)
baixo, à direita: (x + raio + delta/2, y - raio)
baixo, à esquerda: (x - raio - delta/2, y - raio)

Daí a parte que falta para a solução:
def olimpo(x,y,raio, espessura, delta):
    circunferencia(x,y, 'black', raio, espessura)
    circunferencia(x+2*raio+ delta, y, 'red', raio, espessura)
    circunferencia(x-2*raio-delta, y, 'blue', raio, espessura)
    circunferencia(x+raio+(delta/2), y-raio, 'green', raio, espessura)
    circunferencia(x-raio-delta/2, y-raio, 'yellow', raio, espessura)
    
   
if __name__ == '__main__':
    aneis(0,0,50, 3, 5)
    turtle.exitonclick()

Sem comentários:

Enviar um comentário