Feb 23

Informatica significa, con un’espressione sintetica, elaborazione automatica delle informazioni.

Di conseguenza, per poter descrivere i passi compiuti da un elaboratore durante l’esecuzione di un programma, è necessario avere bene chiaro cosa s’intende per informazione, sia quali sono le modalità con cui i dati, indirizzi ed istruzioni vengono rappresentati, interpretati ed elaborati.

Per questo, prima di affrontare dettagliatamente l’analisi del comportamento di un computer durante l’esecuzione di un programma, dedicheremo degli articoli alle tecniche utilizzate per codificare e memorizzare le informazioni all’interno di un calcolatore.

Feb 22

Facciamo ora un esempio pratico per capire gli stati del sistema, con il sistema paziente e lo si studia con due scopi diversi:

- conoscere lo stato generale del paziente durante un’operazione delicata;
- conoscere lo stato del paziente per redigere un certificato di sana e robusta costituzione.

Appare subito evidente che nel primo caso il numero di parametri e di variabili che lo definiscono è molto maggiore rispetto al secondo (probabilmente al medico di base per redigere il certificato non importa molto dei parametri della velocità di coagulazione del sangue e della reattività a certi tipi di anestesia, che invece sono indispensabili per l’equipe medica preposta all’intervento chirurgico.

Inoltre, anche per le grandezze che possono interessare per entrambi gli scopi, risulta diverso il livello di precisione con cui devono essere misurate. Mentre al medico di base può bastare una rilevazione approssimativa del battito cardiaco, al chirurgo interessa sapere con precisione l’esatto numero di pulsazioni durante tutto l’intervento, per valutare anche le più piccole variazioni.

Anche se un sistema presenta un alto numero di grandezze significative, non sempre è indispensabile descriverne lo stato in tutti i suoi dettagli, ma può essere sufficiente fare riferimento a poche variabili di sintesi in grado di riassumere, anche se con un livello minore di precisione, l’andamento di tutte le grandezze in gioco. Anche così la scelta dipende dallo scopo che sta alla base del nostro interesse verso il sistema.

Riferendosi all’esempio precedente, al chirurgo viene comunicato da parte degli assistenti solo un piccolo insieme di informazioni, che sono la sintesi del comportamento dell’ammalato.
Infatti l’addetto agli strumenti che rilevano la temperatura, pressione e battito cardiaco, sintetizza il suo messaggio in forme come: “tutto nella norma”, “pressione in aumento”, battiti irregolari”.

Va infine notato che anche il confine che delimita l’oggetto dell’indagine (il sistema) dall’ambiente esterno varia in rapporto allo scopo dell’indagine, dato che a volte può essere conveniente conglobare nel sistema alcuni elementi che in altri casi conviene invece considerare come esterni.

Ad esempio, per l’equipe medico-chirurgica sarà più conveniente considerare gli strumenti di misura come appartenenti al sistema, per valutare non solo le interazioni tra paziente e chirurgo, ma anche quelle tra paziente e strumenti e tra strumenti e medici.

Feb 20

L’obiettivo finale del motore 3D è quello di mostrare sullo schermo degli oggetti presenti nel mondo. Per fare questo, il motore 3D compirà un numero minimo di operazioni, ed esse sono:

- eventuali trasformazioni degli oggetti (rotazioni, traslazioni, ecc.);
- trasformazione delle coordinate locali ad assolute degli oggetti;
- proiezione degli oggetti;
- stampa a video.

La traslazione è la più semplice trasformazione, ed indica uno spostamento dell’oggetto su uno o più degli assi coordinati di una quantità a piacere. Si realizza molto facilmente, in quanto basta sommare ad ogni componente (x, y, z) di ciascun vertice locale dell’oggetto la quantità voluta. Con la particolare definizione della struttura oggetto già fornita in precedenza, basta solo aggiornare la variabile world_pos della quantità voluta sui tre assi cartesiani, per ottenere l’effetto desiderato: in seguito sarà compito della funzione di trasformazione da coordinate local a world aggiornare correttamente la posizione dell’oggetto.

Forniamo quindi la funzione che si occupa di effettuare una traslazione:

void traslazione_oggetto (oggetto_ptr oggetto, int tx, int ty, int tz)
{
oggetto->world_pos.x += tx; //traslazione sulla X
oggetto->world_pos.x += ty; //traslazione sulla Y
oggetto->world_pos.x += tz; //traslazione sulla Z
}

In questa funzione i parametri tx, ty e tz sono utilizzati per indicare la quantità di traslazione sui tre assi. Da questa si può derivare subito un’ulteriore funzione per posizionare un oggetto all’interno del mondo, specificando nei parametri px, py e pz le coordinate di destinazione:

void posizione_oggetto (oggetto_ptr oggetto, int px, int py, int pz)
{
oggetto->world_pos.x += px; //posizione X
oggetto->world_pos.x += py; //posizione Y
oggetto->world_pos.x += pz; //posizione Z
}

Tratteremo in seguito un’altra funzione del motore 3D, ovvero la scalatura, per ingrandire o rimpicciolire un oggetto.

Feb 19

Stamattina finalmente, Stefano della Arkosoft ha ricevuto la guida completa al programma Softshop da Domenico, che ha realizzato anche una versione in PDF della stessa guida a Softshop.

La guida è stata creata da Domenico grazie ad un pratico programma dedicato, HelpNDoc. Tra poco quindi avrete a disposizione la nuova e più completa versione di Softshop.

Feb 19

Le variabili permettono di quantificare i processi di accumulo e flusso di energia, materia ed informazioni che si sviluppano durante l’evoluzione di un sistema.

Pertanto, lo stato globale di un sistema viene definito come l’insieme dei valori, in un istante, di tutte quelle quantità (parametri e variabili) che caratterizzano gli elementi importanti del sistema stesso e le interrelazioni di quest’ultimo con l’ambiente esterno.

Le variabili di stato si dividono in:

- S: variabili di stato interno (vs1, vs2, …, vsn);
- I: variabili di ingresso (vi1, vi2, …, vin);
- U: variabili di uscita (vu1, vu2, …, vun).

In questo modello, le variabili di uscita dipendono, istante per istante, dal valore assunto dall’insieme delle variabili di stato interno e da quelle di ingresso:

U=f(S, I)

Dato che non tutte le variabili di stato interno sono indipendenti tra loro, basta conoscere i valori degli ingressi e delle variabili indipendenti, per ricavare le altre.

Quando si definisce compiutamente lo stato globale di un sistema, individuandone parametri e variabili, è pura illusione riuscire a rappresentare in tutti i dettagli un sistema concreto, dato che le nostre capacità non ci permettono di studiare il reale in tutta la sua complessità.

Per cui, è inevitabile ricorrere alla costruzione di un modello semplificato che tenga conto solo di ciò che si considera interessante nell’oggetto dell’indagine in relazione allo scopo da raggiungere. In particolare, è importante scegliere le grandezze da considerare significative e quelle da trascurare, e definire anche il livello di precisione con cui si vogliono misurare le grandezze che entrano in giocodurante l’evoluzione del sistema.

Nel prossimo articolo sull’argomento, faremo un esempio pratico.

Feb 17

Dopo avere definito la struttura corretta del generico poligono, passiamo a descrivere la struttura di un generico oggetto tridimensionale del mondo, come cubi, sfere, astronavi ecc.

Prima però faremo delle considerazioni pratiche; prima di tutto, è decisamente comodo l’uso di due sistemi di riferimento diversi per gestire i vertici di cui è composto qualsiasi oggetto del mondo: uno locale ed un altro assoluto. Il primo sistema deve mantenere le coordinate dei vertici dell’oggetto tridimensionale rispetto alla sua origine (ovvero localmente: di solito corrisponde al baricentro dell’oggetto), questo per semplificare sia la costruzione dell’oggetto stesso che l’applicazione delle trasformazioni che tratteremo più in là.

Il secondo sistema conterrà di volta in volta le coordinate assolute dell’oggetto tridimensionale rispetto al mondo, e sarà utilizzato per la proiezione prospettica. Ovviamente sarà necessario definire una variabile world_pos di tipo vertice che contenga l’attuale posizione dell’oggetto tridimensionale nel mondo (rispetto alla sua origine). Il vantaggio offerto da questo metodo è evidente e decisivo: per spostare l’oggetto tridimensionale nel mondo, basta operare solo su world_pos, in quanto tutti i vertici dell’oggetto tridimensionale sono relativi alla sua origine.

Una prima struttura per definire un oggetto tridimensionale è la seguente:

#define MAX_VERTICI_PER_OGGETTO (1000) //in alternativa, const unsigned short …
#define MAX_POLY_PER_OGGETTO (1000)
/***definizione dell’oggetto tridimensionale***/
typedef struct {
vertice world_pos; //posizione nel mondo
int num_vertici; //num. dei vertici dell’oggetto tridimensionale
vertice local_vert[MAX_VERTICI_PER_OGGETTO];
vertice world_vert[MAX_VERTICI_PER_OGGETTO];
int num_poligoni; //num. di facce dell’oggetto tridimensionale
poligono poly[MAX_POLY_PER_OGGETTO];
} oggetto, *oggetto_ptr;

Adesso che abbiamo compreso come si possa definire un generico oggetto tridimensionale, vi invito a leggere il prossimo articolo, nel quale analizzeremo le funzioni minime del motore 3D.

« leggi gli articoli meno recenti leggi gli articoli più recenti »