Actio 4 - Código de la portada

Portada realizada por código Python en Drawbot

Basado en Seigaiha Pattern de justvanrossum

#función para crear un semicículo
def circle(x, y, diameter):
    #definimos la medida del radio
    radius = diameter / 2
    oval(x - radius, y - radius, diameter, diameter)
#elemento contenedor de los semicírculos
def element(x, y, diameter, numCircles, relativeStrokeWidth):
    step = diameter / numCircles
    #usando el número de semicírculos internos determinamos el ancho del contorno de los mismos para que queden iguales
    strokeWidth(relativeStrokeWidth * step)
    #función que repite los semicírculos
    for i in range(numCircles):
       circle(x, y, diameter)
       diameter -= step

#medida del diametro
diameter = 250
#cantidad de semicírculos
numCircles = 6
#cantidad de repeticiones por fila y columna
numRows = 13
numColumns = 5
#número de fotogramas
numFrames = 120
#tamaño de la imagen
canvasSize = 500
#color del contorno
red1 = 166 / 255
green1 = 219 / 255
blue1 = 54 / 255
#color del la figura
red2 = 62 / 255
green2 = 202 / 255
blue2 = 43 / 255
#inicia la animación
for frame in range(numFrames):
    newPage(canvasSize, canvasSize)
    frameDuration(1/20)
    #creamos el contorno
    stroke(red2, green2, blue2)
    #creamos el degradado del fondo
    linearGradient(
    # punto de inicio
    (canvasSize/2, 0),
    # punto final
    (canvasSize/2, canvasSize),
    [(red1, green1, blue1), (red2, green2, blue2), (red1, green1, blue1)],
)
    #usando una función sinoidal creamos un loop que inicia, llega al máximo valor del contorno, y termina en cero,
    phase = 2 * pi * frame / numFrames
    relativeStrokeWidth = abs(cos(phase)/2)
    #repetimos la animación en cuatro filas
    for j in range(numRows + 4):
       #desplazamos ciertas filas para que se sobrelapen correctamente
       y = 0.5 * diameter + 0.25 * diameter * (numRows - j)
       xOffset = 0.5 * diameter * (j % 2)
       for i in range(numColumns):
          x = diameter * i + xOffset
          element(x, y, diameter, numCircles, relativeStrokeWidth)
#guardamos la imagen como GIF
saveImage("a4.gif")