sábado, 10 de dezembro de 2011

Problema Complementar 1.4

Um dos problemas complementares que vos foi proposto consistia em usar o módulo turtle para fazer um gráfico de barras. Vamos ilustrar como podemos resolver o problema.

O problema vai ser dividido em dois: primeiro desenvolvemos um programa para desenhar uma barra, a partir de uma dada posição e com um certo tamanho. Podemos também controlar a cor e a espessura da barra; depois, usamos este programa como auxiliar a ser usado pelo programa que desenha todas as barras contidas numa lista.

Vamos então ao primeiro sub-problema.

Também este pode ser dividido em três faes: posiciona a tartaruga; define os parâmetros (cor, espessura, etc.) e desenha.

01.def barra(pos,tamanho, cor,width):
02.    """ Desenha uma barra na posição pos de altura tamanho."""
03.    # posiciona
04.    turtle.up()
05.    turtle.goto(pos)
06.    turtle.setheading(90)
07.    # parâmetros
08.    turtle.colormode(255)
09.    turtle.pencolor(cor)
10.    turtle.width(width)
11.    # desenha
12.    turtle.down()
13.    turtle.forward(tamanho)
14.    turtle.hideturtle()

Simples não é?

Agora o mais complicado. Ou será que não é assim tão difícil? Se analisar o código abaixo verá que não é assim tão complexo. Temos que inicialmente desenhar o eixo horizontal e defginir os parâmetros para esse eixo (cor, espessura,...) e desenhar o eixo. Como a tartaruga fica fora do local inicial temos a seguir de a reposicionar e preparar para desenhar. Finalmente um ciclo que se serve da nossa função auxiliar para desenhar de modo iterativo cada uma das barras.


01.def plot_barras(lista):
02.    # Define o eixo dos Xs
03.    numero = len(lista)
04.    largura = 10
05.    tamanho_recta = numero * largura
06.    # Define parâmetros do eixo dos Xs
07.    turtle.width(5)
08.    turtle.pencolor('blue')
09.    turtle.setheading(0)
10.    turtle.goto((-tamanho_recta/2, 0))
11.    # desenha eixo
12.    turtle.down()
13.    turtle.forward(tamanho_recta)
14.    # reposiciona a tartaruga
15.    turtle.up()
16.    turtle.goto((-tamanho_recta/2,0))
17.    turtle.hideturtle()
18.    # Prepara para desenhar
19.    turtle.down()
20.    turtle.setheading(90)
21.    pos = (-tamanho_recta/2) + largura/2
22.    # desenha as barras
23.    for indice in range(numero):
24. barra((pos,0), lista[indice], 'red',5)
25. pos = pos + largura

Falta testar e ver o efeito.
1.if __name__ == '__main__':
2.    plot_barras([50,30,20,40,32,7,5,77,67])
3.    turtle.exitonclick()




Moral da história: quando um problema aparenta ser complexo o melhor é pensar primeiro como o podemos dividir em sub-problemas mais simples!