18.11.2012 Views

L - Amiga Magazine

L - Amiga Magazine

L - Amiga Magazine

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

FABRIZIO FARENGA<br />

Campi stellari<br />

La realizzazione pratica di un campo stellare Cparte N)<br />

Fabrizio Farenga è un programmatore professionista di<br />

<strong>Amiga</strong> e PC. E' stato uno sviluppatore Certficato Commo-<br />

dore e ha lavorato per alcuni anniper la società britanni-<br />

ca Team 17 Software. Può essere contattato direttamente<br />

via Email all'indirizzo I?ztemet: J furenga@gol-it.com<br />

Eccoci ancora una volta insieme per parlare del tracciamento<br />

di un campo stellare 3D che si muove all'interno<br />

dello schermo del nostro <strong>Amiga</strong>. Come sicuramente ricorderete,<br />

la volta scorsa cercavamo di risolvere il problema<br />

della rotazione sull'asse Z, utilizzando il coprocessore matematico<br />

68118~ (che purtroppo non tutti hanno a disposizione)<br />

o le librerie matematiche standard di <strong>Amiga</strong><br />

(mathffp.library e mathtrans.librasy). Questa volta metteremo<br />

in pratica la "terza via", ossia quella che, prescindendo<br />

da dispositivi hardware e da librerie di sistema, ci<br />

permette di calcolare con estrema semplicità (e un po' di<br />

approssimazione) seni e coseni in assembly.<br />

Ricordiamo ancora una volta la formula per ruotare<br />

sull'asse Z un punto Xp, Yp:<br />

Come sempre, Xp e Yp rappresentano rispettivamente la<br />

coordinata X e Y del punto da ruotare dell'angolo a, mentre<br />

Xr e Yr definiscono il punto ruotato. Anche il problema<br />

che ci perseguita da diversi appuntamenti dovrebbe<br />

ormai essere noto: eseguire la moltiplicazione, la somma<br />

e la sottrazione in assembly è particolarmente facile, ma<br />

come ci si comporta davanti al calcolo del seno e del coseno?<br />

La risposta è semplice: quando non si ha a disposizione<br />

un coprocessore matematico o, per motivi di velocità<br />

di esecuzione del codice, non si vogliono utilizzare le<br />

librerie math, non resta che ricorrere alla buona vecchia<br />

"tavola di precalcolo", amore e odio dei programmatori<br />

"smanettoni" di <strong>Amiga</strong> sin dai tempi in cui possedere un<br />

espansione di memoria era un lusso, e la documentazione<br />

delle f~inzioni di sistema era destinata a pochi eletti ...<br />

La tavola di precalcolo<br />

La tavola dei seni (o tavola di precalcolo) non è altro che<br />

un lungo elenco di seni gi2 calcolati, ossia una tabella do-<br />

ve poter recuperare già bello e pronto il seno di qualsiasi<br />

angolo compreso tra 0' e 359', simile a quelle che si tro-<br />

vano nelle ultime pagine di numerosi manuali di matema-<br />

tica. Questa soluzione, a prima vista, potrebbe sembrare<br />

la più owia e semplice da utilizzare. Dopotutto è la stessa<br />

che milioni di studenti adottano quotidianamente per ri-<br />

solvere i problemi matematici che gli vengono proposti.. .<br />

Purtroppo, coine spesso accade, non C? tutt'oro quello che<br />

luccica, e una rapida analisi di una tipica tavola che contenga<br />

i seni di 360 gradi, ci rivela che la quasi totalità (356 su 360) è<br />

composta da numeri in virgola mobile compresi tra 1 e meno<br />

1, con il tipico andamento sinusoidale: 0, 1,0, meno 1,O.<br />

Come abbiamo già avuto modo di anticipare nelle punta-<br />

te precedenti, l'utilizzo di numeri in virgola inobile in lin-<br />

guaggio assembly non è semplice, e richiede l'utilizzo di<br />

codifiche particolari (come quelle adottate dalle math li-<br />

brary) o degli appositi registri offerti dal coprocessore<br />

matematico.<br />

La soluzione più semplice da adottare in questi casi C?<br />

quella che consiste nel moltiplicare per una costante il va-<br />

lore numerico che contiene decimali (come per esempio i<br />

seni, nel caso della rotazione sull'asse Z), nell'eseguire<br />

tutti i conti e nel dividere il risultato finale per la stessa<br />

costante.<br />

Per esempio, se desideriamo eseguire in linguaggio as-<br />

sembly il prodotto tra 1,5 e 2 non possiamo semplice-<br />

mente tagliare i decimali ed eseguire la moltiplicazione.<br />

In questo caso infatti il risultato sarebbe erroneamente<br />

uguale a 2 (1 * 2).<br />

Applicando invece la tecnica esposta poche righe più in<br />

alto, per ottenere il risultato corretto si può moltiplicare<br />

(all'origine) il valore che contiene dei decimali per una<br />

costante, ed eseguire di nuovo i conti. Se definiamo la co-<br />

stante pari a 10, i valori da moltiplicare saranno 15 (1.5 *<br />

10) e 2. In questo caso il risultato è 30, e dividendolo per<br />

'

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!