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

Reproduzindo figuras 4.12, 4.13 e 4.14 do livro : “Generative Art: A Practical Guide Using Processing” por Matt Pearson, utilizando python.

0 votos
32 visitas
perguntada Dez 18, 2020 em Ciência da Computação por José Henriques Jr (1 ponto)  
Compartilhe

1 Resposta

0 votos
respondida Dez 18, 2020 por José Henriques Jr (1 ponto)  
editado Dez 19, 2020 por José Henriques Jr

Reproduzindo as figuras 4.12, 4.13 e 4.14 do livro : “Generative Art: A Practical Guide Using Processing” por Matt Pearson, utilizando python.

A imagem será apresentada aqui.

Primeiramente importaremos alguns módulos para a implementação do exercício.

import numpy as np
import turtle
import noise 
t = turtle.Turtle()

Seguindo o algoritmo apresentado na página 76 do livro "Generative Art: a practical guide using processing" de Matt Pearson, inicialmente desenhamos um círculo, sendo esse círculo seccionado por linhas transversais a cada alteração de ângulo. Para a representação da escala de cores, a cada 4 avanços do ângulo, a tonalidade decresce.

def fig_4_12(raio, t, posX=0, posY=0):
    t.speed("fastest")
    n = 1

    for theta in range(360):
        rad = np.radians(theta)  # converts degrees to radians
        if theta%4 == 0:
            n += 1
        cinza = "gray" + str(n)
        t.pencolor(cinza)

        x1=posX+raio*np.cos(rad)
        y1=posY+raio*np.sin(rad)
        t.goto(x1,y1)
        t.pendown()

        rad_opos = np.radians(theta) + np.pi
        x2 = posX + raio * np.cos(rad_opos)
        y2 = posY + raio * np.sin(rad_opos)
        t.goto(x2, y2)
        t.pendown()


fig_4_12(100, t)

A imagem será apresentada aqui.

A imagem 4.13 apresenta uma modificação com relação à anterior, consistindo na introdução de ruído de Perlin para modificação do raio do círculo à medida que a figurava é desenhada.

def fig_4_13(raio, t, posX=0, posY=0):
    t.speed("fastest")

    for theta in range(360):
        raio += 0.5
        rad = np.radians(theta)  # converts degrees to radians
        n = noise.pnoise1(-1*theta+100, 7, 10, 0.5)  # gera um número de perlin a partir do ângulo

        raio_f = n*100 + 300

        t.pencolor("gray50")

        x1=posX+raio_f*np.cos(rad)
        y1=posY+raio_f*np.sin(rad)
        t.goto(x1,y1)
        t.pendown()

        rad_opos = np.radians(theta) + np.pi
        x2 = posX+10 + raio_f * np.cos(rad_opos)
        y2 = posY+10 + raio_f * np.sin(rad_opos)
        t.goto(x2, y2)
        t.pendown()



fig_4_13(100, t)

A imagem será apresentada aqui.

Por fim, a figura 4.14, considera a introdução do ruído de Perlin também na modificação do ângulo. Cabe salientar que a função escrita para a figura 4.14 apresenta estrutura distinta das anteriores, as quais eram baseadas diretamente na aplicação das relações trigonométricas para a construção da circunferência, tal como feito pelo autor em seus exemplos.

def fig414():
t.speed("fastest")
color = 1
for theta in range(360):
if theta % 4 == 0:
color += 1
cinza = "gray" + str(color)
t.pencolor(cinza)
t.pensize(1)

    theta2=noise.pnoise1(-1*theta+100, 10, 5, 0.5)
    raio_noise=noise.pnoise1(theta*10, 10, 5, 0.5)

    t.setheading(theta*theta2)
    t.forward(800+raio_noise*100)
    t.backward(800+raio_noise*100)

    t.setheading(theta*theta2+181)
    t.forward(800+raio_noise*100)
    t.backward(800+raio_noise*100)

fig414()

A imagem será apresentada aqui.

Em 4.14 optou-se por escrever a função empregando diretamente as funções oferecidas pela biblioteca Turtle para a realização de desenhos e gráficos.

comentou Dez 19, 2020 por Renata Oliveira (41 pontos)  
Oi José, as figuras da tua resposta ficaram realmente muito parecidas com aquelas do livro. Na figura 14, alterei o "range" para o ângulo theta pois ocorreu um erro na função pencolor:  a cor "gray101" não existe. Com isso a imagem gerada ficou um pouco diferente, mas ainda parecida.

Notei que tu usaste alguns parâmetros fixos dentro das funções, o que acaba deixando-as menos flexíveis (não seria possível, por exemplo, gerar figuras semelhantes alterando os parâmetros dos ruídos). Entretanto, como o exercício pede apenas para reproduzir as imagens, não vi nenhum problema nisso.
comentou Dez 19, 2020 por José Henriques Jr (1 ponto)  
Realizei a mesma alteração comentada por você, após identificar o erro, obrigada por apontar esse problema.
Com relação à possibilidade de flexibilização, essa alteração é realmente possível.  Seria uma maneira de gerar novas figuras.
...