Suponham que lhe pedem um programa capaz de desenhar o símbolo do Yin-Yang: Por onde começar?? Olhando para a figura verificamos que é composta à base de circunferências e semi-circunferências a duas cores (preto e branco). Usando um princípio já nosso conhecido, tentemos simplificar a questão, esquecendo os círculos interiores e as cores:
1.
def
zen1(raio):
2.
turtle.setheading(
90
)
3.
turtle.circle(raio)
4.
turtle.circle(raio
/
2
,
-
180
)
5.
turtle.setheading(
90
)
6.
turtle.circle(raio
/
2
,
180
)
01.
def
zen11(raio):
02.
turtle.setheading(
90
)
03.
turtle.circle(raio,
180
)
04.
turtle.fillcolor(
'black'
)
05.
turtle.begin_fill()
06.
turtle.circle(raio
/
2
,
-
180
)
07.
turtle.setheading(
270
)
08.
turtle.circle(raio
/
2
,
180
)
09.
turtle.circle(raio,
-
180
)
10.
turtle.end_fill()
01.
def
zen12(raio):
02.
turtle.setheading(
90
)
03.
turtle.circle(raio,
180
)
04.
turtle.fillcolor(
'black'
)
05.
turtle.begin_fill()
06.
turtle.circle(raio
/
2
,
-
180
)
07.
turtle.setheading(
270
)
08.
turtle.circle(raio
/
2
,
180
)
09.
turtle.circle(raio,
-
180
)
10.
turtle.end_fill()
11.
# círculos pequenos
12.
# esquerdo
13.
turtle.setx(turtle.xcor()
+
raio
/
2
-
raio
/
10
)
14.
turtle.fillcolor(
'white'
)
15.
turtle.begin_fill()
16.
turtle.circle(raio
/
10
)
17.
turtle.end_fill()
18.
# direito
19.
turtle.penup()
20.
turtle.setx(turtle.xcor()
+
raio)
21.
turtle.pendown()
22.
turtle.fillcolor(
'black'
)
23.
turtle.begin_fill()
24.
turtle.circle(raio
/
10
)
25.
turtle.end_fill()
26.
turtle.hideturtle()
Mas será que é a única forma de resolver o problema? Será que ficamos satisfeitos??? Olhando para a solução acima o que podemos dizer? Bem, que há muita coisa “fixa”: a posição, a orientação, as cores. Embora estas duas últimas façam parte da definição clássica da imagem, podemos procurar libertar-mo-nos e permitir uma versão mais geral. Por outro lado, e talvez mais importante, o modo como construímos a solução usa componentes de baixo nível e não olha para a imagem como sendo composta por duas que se distinguem … pela posição, orientação e cores!!! Vamos tentar então uma segunda abordagem.
01.
def
zen(raio,x_cor,y_cor,orient, cor_1,cor_2):
02.
"""
03.
Desenha uma componente.
04.
"""
05.
# corpo principal
06.
vai_para_or(x_cor,y_cor,orient)
07.
turtle.fillcolor(cor_1)
08.
turtle.begin_fill()
09.
turtle.circle(raio,
-
180
)
10.
#vai_para_or(x_cor,y_cor,orient)
11.
turtle.circle(raio
/
2
,
-
180
)
12.
turtle.setheading(turtle.heading()
+
180
)
13.
turtle.circle(raio
/
2
,
180
)
14.
turtle.end_fill()
15.
# restaura
16.
vai_para_or(x_cor,y_cor,orient
+
90
)
17.
# círculo pequeno
18.
turtle.penup()
19.
turtle.forward(
3
*
raio
/
2
-
raio
/
10
)
20.
turtle.pendown()
21.
turtle.fillcolor(cor_2)
22.
turtle.setheading(orient)
23.
turtle.begin_fill()
24.
turtle.circle(raio
/
10
)
25.
turtle.end_fill()
26.
turtle.hideturtle()
1.
def
yin_yang(raio,posx,posy):
2.
zen(raio,posx,posy,
90
,
'black'
,
'white'
)
3.
zen(raio,posx
-
2
*
raio,posy,
270
, ‘white
','
black')
1.
def
zen_rose(raio,posx,posy,orientacao,cor_1, cor_2, num):
2.
for
i
in
range(num):
3.
zen(raio,posx,posy,orientacao,cor_1,cor_2)
4.
orientacao
=
orientacao
+
360
/
num
1.
def
zen_rose_2(raio,posx,posy,orientacao,cor_1, cor_2, num):
2.
for
i
in
range(num):
3.
if
i
%
2
=
=
0
:
4.
zen(raio,posx,posy,orientacao,cor_1,cor_2)
5.
else
:
6.
zen(raio,posx,posy,orientacao,cor_2,cor_1)
7.
orientacao
=
orientacao
+
360
/
num
1.
def
zen_rose_tutti(raio,posx,posy,orientacao, num):
2.
turtle.colormode(
255
)
3.
for
i
in
range(num):
4.
cor_1
=
(random.randint(
0
,
255
),random.randint(
0
,
255
),random.randint(
0
,
255
))
5.
cor_2
=
(random.randint(
0
,
255
),random.randint(
0
,
255
),random.randint(
0
,
255
))
6.
zen(raio,posx,posy,orientacao,cor_1,cor_2)
7.
orientacao
=
orientacao
+
360
/
num
01.
def
zen_voa(raio,posx,posy,orientacao, num):
02.
turtle.speed(
10
)
03.
turtle.colormode(
255
)
04.
for
i
in
range(
1
,num
+
1
):
05.
cor_1
=
(random.randint(
0
,
255
),random.randint(
0
,
255
),random.randint(
0
,
255
))
06.
cor_2
=
(random.randint(
0
,
255
),random.randint(
0
,
255
),random.randint(
0
,
255
))
07.
zen(raio,posx,posy,orientacao,cor_1,cor_2)
08.
#orientacao = orientacao + 360/num
09.
posx
=
posx
+
i
*
raio
/
5
10.
posy
=
posy
+
i
*
raio
/
5