sexta-feira, 11 de outubro de 2013

Programar é ... recordar!

Depois de muitos anos a programar todos nós temos um conjunto de soluções para diferentes problemas. quando se nos depara um novo problema um reflexo natural é perguntar: já resolvi este problema? Já resolvi um problema parecido? Já resolvi um problema que não sendo parecido me pode inspirar no modo de resolver o problema novo? Para tornar as coisas mais concretas olhemos para a figura seguinte:
Cinco quadrados concêntricos, coloridos. O problema é o de desenvolver um programa que crie este desenho. Depois de pensar um pouco, recordo-me do problema do logotipo dos jogos olímpicos:
Qual é analogia? O mesmo objecto repetido cinco vezes, mas com cores, posição e dimensão diferentes. Então é tentador seguir a mesma abordagem que neste caso: primeiro um programa que desenha um quadrado colorido, numa dada posição e com um dado comprimento para o lado. Como no caso anterior podia resolver este problema por partes: primeiro, um quadrado com um dado lado, depois numa dada posição e, finalmente com uma dada cor. Acho que não me levarão a mal se eu colocar já a versão final. Afinal, é o que nos vai acontecer à medida que estamos à vontade com a programação!
def quadrado_cor(posx,posy,lado, cor):
    # Posiciona
    turtle.penup()
    turtle.goto(posx,posy)
    turtle.pendown()
    # Define cor
    turtle.pencolor(cor)
    # Desenha
    for i in range(4):
        turtle.forward(lado)
        turtle.left(90)
    turtle.hideturtle()
Agora a segunda parte: desenhar cinco, variando a posição, o lado e a cor. Vamos fazer um desenho para nos ajudar, desenho esse que mostre a relação entre dois quadrados em função da diferença de tamanho dos respectivos lados (que designamos por incremento):
A partir do desenho não é difícil o que temos que mudar na posição e no tamanho. Na posição, e tomando como referência o canto inferior esquerdo a posição do quadrado externo relativamente ao interno será:

posx_ext = posx_int - incremento / 2
posy_ext = posy_int - incremento / 2

Quanto ao tamanho:
lado_ext = lado_int + incremento
Resolvida esta questão vamos então resolver o que falta.
def quadrados_concentricos(posx, posy,lado,incremento):
    quadrado_cor(posx,posy,lado,'red')
    quadrado_cor(posx - incremento/2,posy - incremento/2,lado + incremento,'green')
    quadrado_cor(posx - incremento,posy -incremento,lado + 2*incremento,'blue')
    quadrado_cor(posx - 3*incremento/2,posy-3*incremento/2,lado + 3*incremento,'black')
    quadrado_cor(posx - 2 * incremento,posy- 2*incremento,lado + 4*incremento,'orange')
    
        
        
if __name__ == '__main__':
    quadrados_concentricos(0,0,50,20)
    turtle.exitonclick()
Antes de ir fazer outra coisa volte ao código do logotipo dos jogos olímpicos e veja as semelhanças...

Sem comentários:

Enviar um comentário