Desenho Artístico com Python Turtle: Criando um Ultraman

Introdução à Programação Gráfica com Python

Explorar a criação de gráficos é uma maneira cativante de aprimorar suas habilidades em programação. O módulo turtle do Python oferece uma ferramenta simples, mas poderosa, que permite aos desenvolvedores manipular uma "caneta" virtual para desenhar diversas formas na tela. Este artigo detalha o processo de elaboração de um padrão gráfico complexo, focando na precisão dos comandos para construir uma imagem específica.

Preparação do Ambiente de Desenho

Antes de iniciar, certifique-se de que o módulo turtle esteja acessível em sua instalação Python. Ele é parte da biblioteca padrão, o que significa que não há necessidade de instalações adicionais. Com seu ambiente de desenvolvimento configurado, podemos prosseguir com o código.

Funções Auxiliares para Navegação

Para otimizar o processo de desenho, definimos uma função de conveniência que permite mover a caneta para novas coordenadas sem traçar uma linha. Isso é essencial para posicionar o cursor em diferentes pontos da tela sem interferir no desenho já existente.


from turtle import *

# Função para mover a caneta para uma nova posição sem desenhar
def mover_caneta_para(pos_x, pos_y):
    levantar_caneta()  # Eleva a caneta para evitar traços
    ir_para(pos_x, pos_y)  # Move a caneta para as coordenadas desejadas
    baixar_caneta()  # Abaixa a caneta para retomar o desenho

Configurações Iniciais da Tela e da Caneta

O primeiro passo visual é estabelecer as configurações básicas do ambiante de desenho. Isso inclui a cor de fundo da janela e a epsessura da linha que será utilizada para os traços iniciais.


cor_do_fundo("#990000")  # Define a cor de fundo da janela como vermelho escuro
tamanho_da_caneta(10)     # Ajusta a espessura da linha para 10 pixels

Construção da Figura por Segmentos

A ilustração é construída através de uma série de comandos que desenham círculos, arcos e linhas retas. Cada instrução é crucial para definir a forma e os contornos do design. A seguir, um exemplo de como são traçados os primeiros elementos curvilíneos da figura:


mover_caneta_para(0, 50) # Inicia o desenho em um ponto elevado central
desenhar_curva(-120)    # Desenha um círculo com raio de 120 no sentido horário
levantar_caneta()       # Levanta a caneta para mover sem desenhar
desenhar_curva(-120, -60) # Move a caneta ao longo de um arco horário de 60 graus
baixar_caneta()         # Abaixa a caneta para continuar o traçado
tamanho_da_caneta(5)     # Reduz a espessura da linha para detalhes finos
virar_direita(50)       # Gira a caneta em 50 graus para a direita
desenhar_curva(70, 55)   # Desenha um arco com raio de 70 no sentido anti-horário
virar_direita(85)
desenhar_curva(75, 58)
virar_direita(90)
desenhar_curva(70, 55)
virar_direita(90)
desenhar_curva(70, 58)

Em outras seções do código, são criadas áreas preenchidas com cores específicas. Para isso, utilizamos as funções iniciar_preenchimento() e finalizar_preenchimento(), que delimitam uma região a ser colorida após o desenho de seu contorno.


cor_de_preenchimento("#3366cc") # Define a cor de preenchimento para um tom de azul
iniciar_preenchimento()        # Começa a gravar os movimentos para preenchimento
# ... (comandos de desenho que formam o contorno da área a ser preenchida) ...
finalizar_preenchimento()      # Preenche a forma desenhada

Código Completo do Desenho Artístico

O script Python a seguir integra todos os comandos e funções auxiliares, desde a configuração inicial até a complexa composição da imagem. Cada linha de código contribui para a elaboração minuciosa do design final.


from turtle import *

# Função auxiliar para mover a caneta sem deixar rastros
def mover_caneta_para(pos_x, pos_y):
    levantar_caneta()
    ir_para(pos_x, pos_y)
    baixar_caneta()

# Função auxiliar para ajustar a posição e desenhar segmentos radiais da cabeça
def ajustar_e_desenhar_segmento(extensao_arco, angulo_rotacao):
    levantar_caneta()
    ir_para(0, 50)
    definir_orientacao(0)
    # Originalmente circle(-120, extensao_arco) para um arco horário
    desenhar_curva(-120, extensao_arco)
    baixar_caneta()
    virar_direita(angulo_rotacao)

# Configurações globais iniciais
cor_do_fundo("#990000") # Fundo vermelho escuro
tamanho_da_caneta(10)   # Espessura inicial da caneta

# Seção 1: Desenho inicial da cabeça e contornos superiores
mover_caneta_para(0, 50)
desenhar_curva(-120)
levantar_caneta()
desenhar_curva(-120, -60)
baixar_caneta()
tamanho_da_caneta(5)
virar_direita(50)
desenhar_curva(70, 55)
virar_direita(85)
desenhar_curva(75, 58)
virar_direita(90)
desenhar_curva(70, 55)
virar_direita(90)
desenhar_curva(70, 58)

# Seção 2: Desenho de elementos do corpo
tamanho_da_caneta(10)
mover_caneta_para(80, 15)
definir_orientacao(92)
avancar(135)
definir_orientacao(125)
desenhar_curva(30, 135)
definir_orientacao(190)
avancar(50)
definir_orientacao(125)
desenhar_curva(30, 135)
definir_orientacao(275)
avancar(90)
tamanho_da_caneta(10)

mover_caneta_para(92, -150)
definir_orientacao(240)
avancar(80)
virar_esquerda(10)
desenhar_curva(-28, 185)
levantar_caneta()
ir_para(0, 50)
definir_orientacao(0)
tamanho_da_caneta(10)
desenhar_curva(-120, -60)
definir_orientacao(200)
baixar_caneta()
avancar(72)
virar_esquerda(20)
desenhar_curva(30, 150)
virar_esquerda(20)
avancar(20)
virar_direita(15)
avancar(10)
tamanho_da_caneta(5)

# Seção 3: Preenchimento de áreas azuis (detalhes da cabeça e corpo)
cor_de_preenchimento("#3366cc")
iniciar_preenchimento()
definir_orientacao(92)
desenhar_curva(-120, 31)
definir_orientacao(200)
avancar(45)
virar_esquerda(90)
avancar(52)
finalizar_preenchimento()
avancar(-12)
virar_direita(90)
avancar(40)
levantar_caneta()
virar_direita(90)
avancar(18)
baixar_caneta()
virar_direita(86)
avancar(40)
levantar_caneta()
ir_para(-152, -86)
baixar_caneta()
virar_esquerda(40)
desenhar_curva(35, 90)
levantar_caneta()
ir_para(-80, 116)
definir_orientacao(10)
tamanho_da_caneta(5)
baixar_caneta()
iniciar_preenchimento()
cor_de_preenchimento("#3366cc")
avancar(155)
definir_orientacao(-88)
avancar(37)
definir_orientacao(195)
avancar(156)
finalizar_preenchimento()
levantar_caneta()
ir_para(-75, 38)
definir_orientacao(15)
baixar_caneta()
iniciar_preenchimento()
avancar(158)
definir_orientacao(-88)
avancar(55)
definir_orientacao(140)
desenhar_curva(-120, 78) # Este era circle(120, 78) no original, agora -120 para CW
finalizar_preenchimento()
levantar_caneta()

# Seção 4: Outros detalhes e preenchimentos
cor_de_preenchimento("#3366cc")
tamanho_da_caneta(5)
ir_para(75, -170)
baixar_caneta()
iniciar_preenchimento()
definir_orientacao(240)
avancar(30)
virar_direita(90)
avancar(17)
finalizar_preenchimento()
avancar(10)
virar_esquerda(80)
avancar(55)
levantar_caneta()
virar_esquerda(90)
avancar(15)
baixar_caneta()
virar_esquerda(85)
avancar(55)
levantar_caneta()
ir_para(43, -225)
virar_esquerda(84)
baixar_caneta()
desenhar_curva(60, 51)

# Seção 5: Linhas de detalhe repetitivas
for i in range(3):
    levantar_caneta()
    ir_para(-70 + i * 15, 135)
    definir_orientacao(-90)
    baixar_caneta()
    tamanho_da_caneta(5)
    avancar(15 - 2 * i)

for i in range(3):
    levantar_caneta()
    ir_para(36 + i * 15, 156)
    definir_orientacao(-90)
    baixar_caneta()
    tamanho_da_caneta(5)
    avancar(15 - 2 * i)

pos_a_atual = -60
pos_b_atual = 70
for i in range(4):
    levantar_caneta()
    ir_para(pos_a_atual, pos_b_atual)
    pos_a_atual += 40
    pos_b_atual += 10
    definir_orientacao(-90)
    baixar_caneta()
    tamanho_da_caneta(5)
    avancar(26)

# Seção 6: Uso da função auxiliar para desenhar linhas radiais e arcos adicionais
tamanho_da_caneta(5)
ajustar_e_desenhar_segmento(-60, 110) # Original circle(-120, -60)
avancar(130)
ajustar_e_desenhar_segmento(-28, 96) # Original circle(-120, -28)
avancar(140)
ajustar_e_desenhar_segmento(9, 89)   # Original circle(-120, 9)
avancar(144)
ajustar_e_desenhar_segmento(42, 70)  # Original circle(-120, 42)
avancar(160)
ajustar_e_desenhar_segmento(80, 60)  # Original circle(-120, 80)
avancar(130)

levantar_caneta()
ir_para(-80, -40)
virar_direita(160)
baixar_caneta()
virar_direita(50)
desenhar_curva(70, 45)
virar_direita(75)
desenhar_curva(70, 38)
virar_direita(50)
desenhar_curva(70, 45)
virar_direita(90)
desenhar_curva(70, 48)

levantar_caneta()
ir_para(-53, -70)
baixar_caneta()
virar_esquerda(40)
desenhar_curva(70, 30)
virar_direita(50)
desenhar_curva(70, 20)
virar_direita(50)
desenhar_curva(70, 38)
virar_direita(70)
desenhar_curva(70, 24)

levantar_caneta()
ir_para(-19, -105)
virar_esquerda(72)
baixar_caneta()
avancar(22)
virar_direita(60)
avancar(22)

ajustar_e_desenhar_segmento(-140, 80) # Original circle(-120, -140)
desenhar_curva(-90, 120)
levantar_caneta()
ajustar_e_desenhar_segmento(140, 100) # Original circle(-120, 140)
desenhar_curva(90, 13)
baixar_caneta()
virar_direita(-50)
desenhar_curva(70, 45)
virar_direita(75)
desenhar_curva(70, 38)
virar_direita(50)
desenhar_curva(70, 36)

levantar_caneta()
ir_para(22, -185)
virar_direita(70)
baixar_caneta()
avancar(72)
levantar_caneta()
ir_para(-40, -182)
virar_direita(38)
baixar_caneta()
avancar(70)
levantar_caneta()

# Seção 7: Preenchimento de grandes áreas (placas do peito)
tamanho_da_caneta(7)
ir_para(-15, -110)
definir_orientacao(0)
baixar_caneta()
tamanho_da_caneta(10)
iniciar_preenchimento()
virar_esquerda(130)
avancar(110)
virar_direita(250)
desenhar_curva(90, 60)
desenhar_curva(40, 120)
cor_de_preenchimento("#F5FFFA") # Define cor de preenchimento para um tom de quase branco
finalizar_preenchimento()

levantar_caneta()
ir_para(5, -110)
baixar_caneta()
iniciar_preenchimento()
virar_direita(30)
avancar(110)
virar_direita(-250) # Equivalente a virar_esquerda(250)
desenhar_curva(-90, 60)
desenhar_curva(-40, 120)
finalizar_preenchimento()

manter_janela_aberta() # Mantém a janela do Turtle aberta até o fechamento manual

Tags: PythonTurtle ProgramacaoGrafica DesenhoVetorial ModuloTurtle Ultraman

Publicado em 7-6 11:30