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.


def barra(pos,tamanho, cor,width):
""" Desenha uma barra na posição pos de altura tamanho."""
# posiciona
turtle.up()
turtle.goto(pos)
turtle.setheading(90)
# parâmetros
turtle.colormode(255)
turtle.pencolor(cor)
turtle.width(width)
# desenha
turtle.down()
turtle.forward(tamanho)
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.



def plot_barras(lista):
# Define o eixo dos Xs
numero = len(lista)
largura = 10
tamanho_recta = numero * largura
# Define parâmetros do eixo dos Xs
turtle.width(5)
turtle.pencolor('blue')
turtle.setheading(0)
turtle.goto((-tamanho_recta/2, 0))
# desenha eixo
turtle.down()
turtle.forward(tamanho_recta)
# reposiciona a tartaruga
turtle.up()
turtle.goto((-tamanho_recta/2,0))
turtle.hideturtle()
# Prepara para desenhar
turtle.down()
turtle.setheading(90)
pos = (-tamanho_recta/2) + largura/2
# desenha as barras
for indice in range(numero):
barra((pos,0), lista[indice], 'red',5)
pos = pos + largura

Falta testar e ver o efeito.

if __name__ == '__main__':
plot_barras([50,30,20,40,32,7,5,77,67])
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!