LOVE Mandelbrot!

djmzu2qwsaelippIl frattale di Mandelbrot ha sempre il suo fascino, combinando infinita complessità geometrica con estrema semplicità dell’algoritmo per realizzarlo. Se non l’avete mai incontrato, approfonditelo, come tutta la questione dei frattali e della teoria del caos. Tra le altre cose, lo considero un buon test per fare pratica su un nuovo linguaggio di programmazione.

Eccone una versione programmata tramite LOVE, ambiente “ultraleggero” per lo sviluppo di “giochini”, che impiega il linguaggio di programmazione Lua. Di entrambi ho parlato in un recente post.

Mi hanno sorpreso la facilità di realizzazione e anche la velocità di esecuzione. Che dire, molta resa con poca spesa!

Si può variare la mappa di colori in base alla propria fantasia, da un “serio” bianco e nero a variazioni più sgargianti, come ho provato a fare. Possibili evoluzioni potrebbero essere un “navigatore”, che tramite il mouse consenta di ingrandire parti a scelta, oppure un “Julia set”, che, cliccando in un punto, consenta di disegnare il frattale di Julia collegato. Realizzai entrambe le cose alcuni anni fa, con C++ assieme alle librerie SDL per la grafica e l’interfaccia con il mouse… forse un giorno li ripescherò. All’epoca utilizzavo quasi esclusivamente Linux. Tra l’altro SDL è la libreria che implementa anche LOVE.

Sono solo un programmatore hobbistico per cui, se qualcuno un po’ più esperto ha miglioramenti o estensioni da proporre, è il benvenuto!

-- Dimensioni finestra grafica
xmax = 800
ymax = 600

-- Angolo del frattale
left = -2
top = -1
-- Dimensioni "fisiche" frattale
xside = 3.0
yside = 2.0

-- "Sfasamento" per migliorare la grafica
eps = 1e-3
left = left-eps
top = top-eps

love.window.setMode(xmax, ymax)

-- max cicli
countend = 256

xscale = xside/xmax
yscale = yside/ymax

function love.draw()
    for x=1,xmax do
        cx = x * xscale + left
        for y=1,ymax do
            cy = y * yscale + top
            cc = 0
            zx = 0.0
            zy = 0.0
            while ((zx*zx+zy*zy < 4) and (cc < countend)) do
                tempx = zx*zx - zy*zy + cx
                zy = 2*zx*zy + cy
                zx = tempx
                cc = cc+1
            end
            ccolor = cc/countend
            love.graphics.setColor(zx/2, zy/2, ccolor)
            love.graphics.points(x, y)
        end
    end
    -- Riduce carico processore
    love.timer.sleep(2)
end


Annunci

Lascia pure un Commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.