Newsgroup: it.comp.lang.c++
Titolo: Un problema di ereditarietà

Ciao, ho la mia bella classe base per gli oggetti, da cui derivo un
certo numero di sottoclassi, e voglio che questi oggetti possano
collidere fra loro (in una animazione). Perň il problema č che il modo
di implementare la collisione dipende non dal singolo oggetto (dalla
singola classe), ma dalla coppia di oggetti. 
Ad esempio per verificare la collisione fra due cerchi, basta fare la
distanza fra i centri; per verificare quella fra un cerchio e un
poligono bisogna fare ... va beh, ci siamo capiti, e per verificare
quella fra due poligoni bisogna fare un'altra cosa ancora.
Quello che vorrei č fare in modo che si possano creare nuove classi di
oggetti, e ogni nuova classe sia costretta ad implementare la collisione
con tutte le classi precedentemente definite. E mi sembra abbastanza
impossibile. 
Avete qualche consiglio? Mi sembra un problema che dovrebbe essere
"classico" e invece non ne ho mai sentito parlare!
Grazie
Vincenzo
-- 
Si puo' vincere una guerra in due e forse anche da solo
si puo' estrarre il cuore anche al piu' nero assassino
ma e' piu' difficile cambiare un' idea
[Litfiba]

 "classico" e invece non ne ho mai sentito parlare!
dunque, l'argomento anche se classico come tu lo definisci e tutt'altro che
banale
Solitamente si istanzia nella classe base, una classe destinata al collision
detection e poi si crea un'oggetto CollisionDetection atto a fare il check
delle collisioni tra i vari oggetti.
Supponendo che si tratti di animazione 3D,  per la collision detection
solitamente per una questione di velocità si utilizzano delle sfere (al
posto dei classici bounding box cubici) al centro delle quali c'è l'oggetto
che può avere collisione.
La collision detection di una sfera ha il pregio di essere più veloce in
termini di computazione (calcolo della CPU insomma) a differenza del
bounding box quadrato.
Ora io non so se tu vuoi fare una collisione precisa al pixel o ti
accontenti di approssimazioni, ne so se la tua animazione si basa su figure
pianeo su oggetti 3D.
Esistono formule matematiche per il primo caso che fanno il lavoro, senza
scomodare bounding box e soci, mentre per il secondo caso solitamente si
scompone un oggetto 3d complesso in sezioni e si definiscono sfere sempre
più piccole attorno alla sezione (e di conseguenza aumenta la precisione)
Quindi si procede a confronti sequenziali: se i due oggetti (rappresentati
dalle loro "sfere di collisione") si intersecano, passo al livello di
controllo più fine, che mi identifica quale delle sottosfere dell'oggetto è
stata toccata (a patto che sia stata toccata, perchè essendo le sottosfere
più piccole della sfera contenitrice, è possibile che in realtà non ci sia
intersecazione, fai un disegno su foglio se non ti è chiaro e vedi che
capisci :) e continuo così fino a quando non ho esaurito i livelli di
sottosfere (a quel punto sarò con esattezza che c'è stato un impatto e saprò
con buona approssimazione anche il dove c'è stato) o fino a quando i calcoli
non mi dicono che non c'è stato contatto.
Io è da poco che mi sto interessando a grafica3D, sviluppo di videogames,
etc... (anzi è da un po' di tempo che ho preso una "pausa" per concentrarmi
sul mio sito :)) e quindi non sono adatto a spiegarti ulteriori tecniche o
approfondire maggiormente quella che ti ho esposto ora, se sei interessato
basta che su google cerchi "collision detection" e vedrai quanti risultati
Ad ogni modo cerca di specificare meglio il tuo caso così magari qualcuno ti
potrà aiutare di più, spero di non averti confuso ancora di più le idee :)
ciao!
-- 
Fabio Angela (aka Red Angel) ICQ: 95966807
http://www.redangel.it
 : il portale sulla programmazione


Direi che la nozione di "double-dispatch" e il pattern "visitor" dovrebbero
essere due concetti chiave promettenti per cercare una soluzione
soddisfacente.
Tra le svariate cose che si possono reperire in rete, ho trovato questo
documento che parla di entrambi, portando come esempio pratico un problema che
a prima vista assomiglia molto al tuo.
 
http://www.determan.net/articles/doubledispatcharticle.pdf
Max