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.
01.def quadrado(tartaruga,x,y,lado):
02.    """Desenha um quadrado."""
03.    # prepara
04.    tartaruga.up()
05.    tartaruga.goto(x,y)
06.    tartaruga.hideturtle()
07.    tartaruga.down()
08.    # desenha
09.    for i in range(4):
10.     tartaruga.forward(lado)
11.     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.
1.def quadrado_cor(tartaruga,x,y,lado,cor):
2.    """ Desenha um quadrado colorido."""
3.    tartaruga.color(cor)
4.    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:
1.def quad_concentricos(n,tartaruga,x,y,lado,cor,d):
2.    """Desenha n quadrados coloridos concêntricos."""
3.    for i in range(n):
4. #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:
1.def quad_concentricos(n,tartaruga,x,y,lado,cor,d):
2.    """Desenha n quadrados concêntricos em cores alternadas."""
3.    for i in range(n):
4. 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.
1.def quad_concentricos(n,tartaruga,x,y,lado, cor_1, cor_2,d):
2.    """Desenha n quadrados concêntricos em cores alternadas."""
3.    for i in range(n):
4. if i % 2 == 0:
5.  quadrado_cor(tartaruga,x-i*d, y+i*d, lado+i*2*d, cor_1)
6. else:
7.  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