Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como desenhar em Python usando turtle graphics?

+1 voto
3,918 visitas
perguntada Mar 15, 2017 em Ciência da Computação por Caue (231 pontos)  
editado Mar 15, 2017 por Caue

Segundo o wikipedia: Gráficos tartaruga é um termo em Computação Gráfica para um método de programar desenhos vetoriais usando um cursor relativo (tartaruga) em um plano cartesiano.
Como utilizar esse método em Python?

Wikipedia: Turtle_graphics

Compartilhe

1 Resposta

+1 voto
respondida Mar 15, 2017 por Caue (231 pontos)  
editado Abr 12, 2017 por Caue

O Python possui uma biblioteca que implementa esse método de desenho, chamada turtle [Ref. 1].

O método turtle é popular para ensinar fundamentos de programação para crianças, mas nem por isso deixa de ser uma ferramenta muito interessante de desenho, inclusive para estruturas complexas e fractais.

Por exemplo, o livro The Algorithmic Beauty of Plants [Ref. 2], de Przemyslaw Prusinkiewicz e Aristid Lindenmayer, faz referência ao método turtle para implementar o sistema Lindenmayer, ou L-System [Ref. 3], e desenhar plantas como as abaixo:

A imagem será apresentada aqui.

O código abaixo é bem simples e intuitivo para entender os fundamentos do turtle:

from turtle import *  # importa a biblioteca
color('blue', 'green')  # escolhe a cor do traco e do preenchimento
begin_fill()  # inicia o desenho na posicao (0,0)
forward(200)  # move 200 passos a frente
left(90)  # vira a esquerda 90 graus
forward(200)  # move 200 passos a frente
left(90)  # vira a esquerda 90 graus
forward(200)  # move 200 passos a frente
left(90)  # vira a esquerda 90 graus
forward(200)  # move 200 passos a frente
end_fill()  # preenche o desenho
done()  # encerra o processo

Lembre-se que a repetição de trechos de código é uma péssima prática. O exemplo acima contém repetição para efeitos didáticos da ferramenta. O código apresentado na documentação do turtle [Ref. 1] é muito mais interessante:

from turtle import *
color('red', 'yellow')
begin_fill()
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
end_fill()
done()

Sugiro executar os códigos acima e ver o funcionamento do turtle.

Para desenho de estruturas mais complexas, é legal pensar em uma implementação que utilize recursão. A imagem abaixo é um exemplo do que pode ser feito utilizando código recursivo e comandos básicos do turtle.

A imagem será apresentada aqui.

import turtle
import random


def color_size(t, l):
    color = '#444C38'  # default color
    if l <= 8:  # flower or grass
        color = '#00FF00' if random.uniform(0, 10) > 3.5 else '#FF69B4'
    elif l <= 30:  # intermediate color
        color = '#006600'
    t.pencolor(color)
    t.pensize(l / 10)


def angle():
    return random.uniform(10, 40)


def new_length(l):
    return l + random.gauss(-5, 1)


def tree(t, l, tree_on_middle=False):
    if l <= 0:
        return

    angle_r = angle()
    angle_l = angle()
    angle_m = (angle_l + angle_r) / 2

    color_size(t, l)
    t.forward(l)  # draw this tree

    t.left(angle_l)
    tree(t, new_length(l), tree_on_middle)  # draw tree on left

    t.right(angle_m)
    if tree_on_middle:
        tree(t, new_length(l), tree_on_middle)  # draw tree on middle

    t.right(angle_m)
    tree(t, new_length(l), tree_on_middle)  # draw tree on right

    t.left(angle_r)  # back to center

    color_size(t, l)
    t.backward(l)  # back to initial position


my_turtle = turtle.Turtle()
my_turtle.hideturtle()
my_turtle.speed(0)
my_turtle.left(90)
my_turtle.penup()
my_turtle.backward(200)
my_turtle.pendown()

tree(my_turtle, 40, False)

with open('./tree.ps', 'wb') as pdf:
    pdf.write(turtle.Screen().getcanvas().postscript().encode('utf-8'))

turtle.Screen().exitonclick()

Referências:

1- docs.python.org/3.6/library/turtle.html
2- algorithmicbotany.org/papers/#abop
3- en.wikipedia.org/wiki/L-system

comentou Mar 15, 2017 por danielcajueiro (5,641 pontos)  
Fantastico e excelente complemento para o curso!
...