Newsgroup: it.comp.lang.c
Titolo: Algoritmo acc/dec

Scusate, il msg potrebbe essere o.t. ma purtroppo ho notato con ENORME
dispiacere che non esiste un newsgroup (italiano) per Algoritmi...
Sto facendo un progettino per la matura interessantissimo.. mi servirebbe
sapere l'algoritmo per gestire l'accelerazione e decellerazione di un corpo
(nel mio caso una macchinina) al verificarsi di una condizione (ad esempio
se vede un semaforo rosso!).
Se avete qualcosa sarei contentissimo di riceverla..
come faranno gli sviluppatori di gioco quando sviluppano appunto un gioco
??? Secondo me questi algoritmi li hanno già pronti.. poi penso che si
concentreranno sui motori grafici e sugli aspetti salienti del gioco!!..
Grazie ..
e-mail to : 
sti...@hotmail.com

 e-mail to : 
sti...@hotmail.com
  Approposito chiedo scusa a tutto il NG se non mi sono presentato prima come
prevede la netiquette....
- Pietro -

se vede un semaforo rosso!).
Immagino che "il corpo" da te modellato avra` un insieme di
variabili di stato; se vuoi modellare l'accelerazione, fra queste
variabili di stato, oltre alla posizione corrente del corpo, ci
dovra` certo essere anche la sua velocita` corrente (in termini,
probabilmente, di modulo+direzione).  Se al tempo T0 inizia
una accelerazione (positiva o negativa) a, allora la velocita`
a un tempo successivo T1 sara` (esprimendo le cose in modo
monodimensionale per semplicita`, ma le a e v non devono
qui necessariamente essere scalari...):
    v(T1) == v(T0) + a * (T1-T0);
sinche` l'accelerazione a si mantiene costante.  La posizione
corrente si ottiene per integrazione di questa semplice
equazione nel tempo, ed e`:
    s(T1) == s(T0) + v(T0)*(T1-T0) + 0.5*a*(T1-T0)*(T1-T0);
con le stesse considerazioni di dimensionalita`.
Se devi considerare un'accelerazione non costante, ad es. per
fenomeni di attriti volventi, radenti, ecc, allora e` probabile
che ti convenga impostare una soluzione numerica "agli elementi
finiti" di quello che, altrimenti, rischia di diventare un insieme
di equazioni non lineari di difficile integrazione.  Per dire in
modo semplice alcune cose piuttosto complicate: se tu "affetti"
il tempo in istanti discreti, sufficientemente vicini fra loro, tutti
gli effetti in gioco possono normalmente essere modellati come
"lineari" nel piccolo intervallo di tempo in gioco, e le non
linearita` restanti in casi "non tanto normali" possono pure
essere modellate, almeno molto spesso, in modi elementari.
Supponiamo, ad esempio, di volere modellare una frenata,
supponendo che la frenata non impartisca una decelerazione
costante, bensi` agisca riducendo l'energia cinetica del mezzo
di un tasso istantaneo proporzionale al tempo (frenata
progressivamente piu` efficace nel tempo), con due non
linearita`: una in termini di massima energia dissipabile dal
sistema-frenante, una di velocita`-soglia al di sotto della
quale i freni prendono invece ad agire come deceleratori
lineari (decelerazione costante).
Questo approccio puo` essere difficile da impostare in modo
analitico, ma, se ci possiamo permettere un'analisi in termini
di intervallini di tempo sufficientemente brevi, la soluzione
numerica puo` essere accettabile.
Iterativamente, procediamo cosi`:
    calcoliamo l'energia cinetica attuale E=M*V*V/2
    calcoliamo l'energia che il sistema frenante dovrebbe
        dissipare: D=E*e(t)*dt, dove e(t) e` l'efficacia
        del sistema in questo momento t, e dt il nostro
        _piccolo_ intervallo di tempo
    se D > massima energia dissipabile dal sistema
        frenante, riduciamo D a quest'ultima
    l'energia cinetica del mezzo dovrebbe dunque
        ridursi da E a E-D nel corso del nostro dt
    calcoliamo lo spazio percorso supponendo che
        la decelerazione da E a E-D sia costante (la
        ipotesi di linearizzazione, valida per dt piccolo):
            a = -D/dt;
        (vedi sopra l'equazione che determina lo
        spostamento data velocita` iniziale e tempo;
        se dt e` abbastanza breve, puoi ridurre
        questo all'uso della "velocita` media"
        nell'intervallino, semplificando i calcoli)
    per il prossimo "periodino", settiamo t a t+dt,
        E a E-D e quindi V = sqrt(2*E/M)
    se V si riduce cosi` sotto la soglia di massima
        efficacia del sistema frenante, usciamo da
        questo ciclo, e passiamo al successivo che
        si basa invece su decelerazione costante
In certi casi si possono fare anche ulteriori riduzioni
della mole di calcolo, ma queste sono ottimizzazioni
da applicarsi se e solo se ci servono davvero (come
quella che ho accennato sul calcolo della posizione).
Il punto-chiave e` avere a disposizione un _buon_
modello fisico del comportamento da studiare: che
sia lineare, come la "decelerazione costante", o di
tipo non-lineare, come quello appena visto, un qualche
opportuno "mix" di impostazione analitica e modellazione
a elementi finiti puo` generalmente portarci a risultati
sufficientemente accurati per i nostri scopi.
Per farti un'idea del tipo di errori che puoi aspettarti
da uno schema ad elementi finiti, puoi usarlo in casi
in cui puoi anche calcolare la soluzione "analitica",
come quello della decelerazione costante, e farti
mostrare i risultati "veri" e "simulati" fianco a fianco,
controllando cosi` se e come divergano.
Alex