Primi esperimenti 2D con Python

Sto approfittando di queste giornate di riposo e vacanza (più legata agli acciacchi che al periodo di fine anno) per mettere mano a Python.

Al di là della sua indubbia utilità come linguaggio di scripting per piccoli e veloci attività da automatizzare, la vera ragione che mi ha spinto a smanettarci in modo più serio è il desiderio di riprogrammare alcuni piccoli giocattoli grafici che avevo creato tanto tempo fa su altri sistemi operativi e con altri linguaggi.

Data l’indole a basso livello del sottoscritto, il primo esperimento che ho svolto è stato quello di allocare memoria in un buffer, usando un array multidimensionale, e scriverci dentro un po’ di informazioni RGB, trasformando poi il tutto in un’immagine (mi sarebbe piaciuto allocare memoria senza usare array o altre strutture dati, ma non so se con Python la cosa è fattibile).

Vi chiederete perché diavolo dovrei allocare memoria a basso livello o usare array per disegnare pixel e la risposta è che trovo il codice che ne risulta molto elegante. Per esempio, per disegnare un pixel alle coordinate x,y e col colore r,g,b, l’istruzione che uso è: data[y,x] = [r,g,b]

Io lo trovo semplice ed autoesplicativo.

Come primo risultato con questo linguaggio non mi posso proprio lamentare, sopratutto perché il prodotto finale straborda arcobaleni psichedelici in pieno periodo natalizio. Ecco dunque un esempio delle immagini ipercolorate che stanno venendo fuori da questi primi tentativi.

Mix di colori

La componente rossa cambia orizzontalmente, la componente verde cambia verticalmente e la componente blu ha il suo picco a centro immagine (clicca per ingrandire).

Di seguito trovate invece il codice dello script che produce l’immagine. Per lanciare lo script è necessario avere installato sul proprio PC sia Python sia i package SciPy e NumPy.

Se siete arrivati a leggere fino a questo punto ma non avete la minima idea di ciò di cui sto parlando, allora potete limitarvi a fissare l’ipnotica immagine colorata, lasciando quello che segue ai nerd.

import math
import numpy as np
import scipy.misc.pilutil as smp

# Function that calculates the distance between two points
def distance(x1,y1,x2,y2):
	return math.sqrt((x2-x1)**2 + (y2-y1)**2)

# Set width and height of the image
width=1024
height=768

# Set the coords of the point where blue component will be 100%
cx = width/2
cy = height/2

# Calculates the maximum possible distance between cx,cy
# and any other point on the image surface
maxdistance = math.sqrt(max(width-cx, cx)**2 + max(height-cy, cy)**2)

# Create the array/buffer
data = np.zeros( (height,width,3), dtype=np.uint8 )

# Fill it with RGB values
for y in range(height):
	for x in range(width):
		r = 255*x/width
		g = 255*y/height
		b = 255 - (255 * distance(x,y,cx,cy) / maxdistance)
		data[y,x] = [r,g,b]

# Create the image and show it
img = smp.toimage( data )
img.show()

3 Responses to Primi esperimenti 2D con Python

  1. Pingback: Insalate (colorate) di matematica - LowLevel’s blog

  2. Pingback: Effetti pseudo 3D con matematica e Python - LowLevel’s blog

Leave a Reply

Your email address will not be published. Required fields are marked *