segunda-feira, 1 de novembro de 2010

Problema 4.21

Este problema fala-nos de quadrados concêntricos cujas cores alternam entre o vermelho e o azul. É-nos dito também a posição e o valor do lado do quadrado mais pequeno e, ainda o modo como o quadrado aumenta.

É muita coisa para pensar ao mesmo tempo. Vamos então por partes. Vamos supor que é apenas um quadrado e que a cor é irrelevante. O leitor atento notará logo que assim formulado, trata-se na realidade do problema 4.20. E é! Vamos então resolver o dito.

def quadrado(tartaruga,x,y,lado):
"""Desenha um quadrado."""
# prepara
tartaruga.up()
tartaruga.goto(x,y)
tartaruga.hideturtle()
tartaruga.down()
# desenha
for i in range(4):
tartaruga.forward(lado)
tartaruga.right(90)

Esta solução não tem nada de especial: o problema foi dividido em duas partes. Na primeira, colocamos a tartaruga no sítio apropriado. Na segunda, desenhamos o quadrado, através de uma repetição de desenho do lado e rotação de 90 graus. Pensemos agora num outro detalhe: a cor.

def quadrado_cor(tartaruga,x,y,lado,cor):
""" Desenha um quadrado colorido."""
tartaruga.color(cor)
quadrado(tartaruga,x,y,lado)

Trivial, certo? A partir daqui, vamos querer desenhar quadrados coloridos concêntricos. Quantos serão será um parâmetro do problema. E terei um ciclo for. Algo assim:

def quad_concentricos(n,tartaruga,x,y,lado,cor,d):
"""Desenha n quadrados coloridos concêntricos."""
for i in range(n):
#desenha novo quadrado colorido

Mas como os faço concêntricos? A ideia é dada pela imagem seguinte:




Ou seja. Conhecidas as coordenadas do canto inferior esquerdo do último quadrado desenhado, a do próximo resulta de eu alterar essas coordenadas retirando um dado valor a x e aumentando desse mesmo valor y (notar o modo como estão orientados os eixos!). Se eu fizer isso, resulta claro que o novo lado vale a + 2 *d, se a dor o valor do lado inicial. Daqui resulta o código:

def quad_concentricos(n,tartaruga,x,y,lado,cor,d):
"""Desenha n quadrados concêntricos em cores alternadas."""
for i in range(n):
quadrado_cor(tartaruga,x-i*d, y+i*d, lado+i*2*d,cor)

Uso o valor de i para controlar o incremento. E como alterno as cores??? Se pensarmos bem, veremos que não é difícil. vou usar o valor de i: se for par, azul, se for ímpar, vermelho!!! E chego ao programa final.

def quad_concentricos(n,tartaruga,x,y,lado, cor_1, cor_2,d):
"""Desenha n quadrados concêntricos em cores alternadas."""
for i in range(n):
if i % 2 == 0:
quadrado_cor(tartaruga,x-i*d, y+i*d, lado+i*2*d, cor_1)
else:
quadrado_cor(tartaruga,x-i*d, y+i*d, lado+i*2*d, cor_2)




3 comentários:

  1. Aqui, um antigo e atento aluno!

    Na última listagem, na linha 7 não deveria estar cor_2?

    Cumprimentos.

    ResponderEliminar
  2. Aqui, antigo aluno (e atento)!

    Na última listagem, na linha 7, não deveria ser cor_2?

    Cumprimentos!

    ResponderEliminar
  3. Certíssimo! É o que dá em programar de uma maneira e depois apresentar de outra, para efeitos pedagógicos ... sem testar! Vou emendar.

    ResponderEliminar