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

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 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)

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()

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.