Programmare leggeri

provaSpecchio

È tanto che non scrivo di programmazione dei computer.

Da poco ho ripreso a trastullarmi, talvolta, con C++ e Java, tuttavia il tempo è sempre tiranno e, per di più, non riesco a concentrarmi su progetti complessi. Finisco per vagare e, magari, imparare qualcosa. Ultimamente, mi sono innamorato di una soluzione ultraleggera e aperta (nel senso di “open source”) che però consente di fare un sacco di cose. In un’epoca in cui gli ambienti di programmazione, anche quelli open-source, sono dei titanici mastodonti, qualcosa di leggero e “portatile” mi attira, mi sembra razionale e proporzionato a quello che è un semplice hobby. La “suite” che provo a mettere insieme è composta da:

TCC Tiny C Compiler: il più leggero tra i compilatori C completi. Copre tutte le funzionalità standard del linguaggio e anche qualcosa in più, è piccolo, compila a tempo di record e genera eseguibili efficienti (anche se non iper-ottimizzati) e di dimensioni davvero minuscole.

Lua: linguaggio di scripting veloce, semplice ed elegante. Lo trovo ancora più facile e immediato di Python e similmente efficiente.

LÖVE: ambiente grafico 2d che incorpora Lua e dà accesso a audio, mouse, immagini ecc… Nasce per i giochi ma ci si può divertire anche in altre direzioni.

Il tutto composto da codice aperto e aggiornato, che occupa, inclusi accessori non indispensabili, poche decine di Mb e, abbinato al vostro editor di testo preferito (nel mio caso Notepad++) consente di fare, se non tutto, moltissimo. Se volete, buon divertimento!

Annunci

IncRay

scene001

E’ un bel po’ che non parlo di programmazione di computer, uno degli argomenti annunciati di questo blog. Il motivo è semplice: non mi ci dedico da un bel po’, se non per tempi brevissimi. Vi voglio tuttavia aggiornare sul progetto più ambizioso che ho intrapreso finora, un programma a sviluppo infinito a cui ho fatto procedere, fino ad oggi, una strada a zig-zag: il mio codice di computer-graphic scritto da zero, il mio motore di rendering, il mo orgoglio, IncRay!

Il nome sta per Incident Ray-tracer: tracciamento dei raggi di luce incidenti, la tecnica abituale di ray-tracing. L’idea era di un software lineare, che prediligesse la semplicità alla massima efficienza, e che fosse espandibile. L’obiettivo era di realizzare immagini fotorealistiche (parola grossa) di geometrie semplici, che avessero una chiara rappresentazione matematica. La prima cosa che mi venne in mente erano le sfere: il luogo dei punti equidistanti da un punto dato detto centro (reminiscenze di geometria), poi passare a piani, triangoli e da questi, in teoria, a qualsiasi geometria.

scena000

Aggiungere nel contempo caratteristiche varie: posizione e colore della luce, colore e proprietà delle superfici, posizione ed angolo d’inquadratura del punto di vista, dimensione dell’immagine.

La storia è stata variegata, incoerente e legata al mio bighellonare hobbistico nell’informatica. Sono partito con una versione in Free Pascal puramente procedurale, poi una in Java strutturata ad oggetti ed infine una in C++. Queste ultime due hanno proceduto per un certo tempo in parallelo per poi concentrare gli sforzi sull’ultima: il C++ è per alcuni versi più scomodo, ma più efficiente. Tuttavia ogni versione ha le sue peculiarità, la convergenza delle funzionalità sul C++ non è ancora completa. Ad esempio solo la vecchia versione Pascal può disegnare triangolo, mentre solo in Java ci possono essere superfici a specchio (che mi piacciono molto), mentre solo nell’ “edizione” in C++ è possibile spostare il punto di vista nelle tre dimensioni, funzionalità che rende molto più flessibile e pratico l’utilizzo.

triangoli04

Lo schema di funzionamento è lo stesso. Un file di testo contiene la descrizione della scena; il programma lo legge, calcola le traiettorie dei raggi di luce a ritroso, partendo dal punto di vista (la macchina da presa, per così dire), li interseca con gli oggetti e verifica le interazioni con la sorgente di luce e gli altri oggetti. In base a questo calcola il colore risultante di ogni punto. Alla fine, salva il file immagine complessivo. Nel post ne ho messo qualche esempio.

Ecco la mia struttura “ad oggetti”. Un sistema gerarchico ricollega tutte le “forme” ad una classe “Geom”, piena di funzioni virtuali (linguaggio C++…). “Sphere” è una sottoclasse di “Geom”, così come “Plane”. “Triangle”, a sua volta, è/sarà una sottoclasse di “Plane”. Ci sono poi classi per i tipi base “Vec3” per il vettore a tre componenti, che ha per sottoclassi “Point” e “Color”; “Surface” per le proprietà di superficie.

C’è molto da fare, ma sono relativamente orgoglione di me stesso. Che ve ne pare?

provaSpecchio

Primi numeri

Per me programmare i computer è un’attività simile a quello che per molti sono i giochi enigmistici: un piacevole impegno per la mente, in cui il lavorio per ottenere un risultato è più importante del risultato stesso ed in cui il tempo è una variabile indipendente. Insomma il classico hobby da cui non si pretende di ricavare necessariamente qualcosa di concreto… eppure ci si appassiona molto.

Ho cominciato ad interessarmi ai numeri primi leggendo “L’enigma dei numeri primi”, un libro che ha la tensione di un thriller pur parlando di numeri; ed essendo un tecnico, per me i numeri sono, seppure in maniere un po’ meno astratta, un pane quotidiano.

Mi sono allora impegnato a scrivere qualche programmino per calcolare la serie dei numeri primi. Algoritmi semplici: esaminare i numeri uno dopo l’altro dividendoli per i primi già trovati. mi sono serviti per fare pratica su diversi linguaggi (Basic, Pascal, C, Python…). Sono stato contento quando, sul mio vecchi PC, sono riuscito a tirarne fuori oltre sessantamila in meno di trenta secondi!

Poi mi sono imbattuto nel setaccio di Eratostene. Ho provato ad “implementarlo” e il risultato è stato sorprendente: un secondo o giù di li per arrivare al più grande numero primo che poteva essere contenuto in una variabile intera.

Per un verso ci sono stato male: come matematico sono una vera schifezza. Il vecchio Eratostene di Cirene, dal suo terzo secolo avanti Cristo, mi batte con un solo dito.

Per chi fosse interessato, ecco qualcuno dei miei codici.

>>> CodiciNumeriPrimi <<<