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 />
'