Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Programmation multimédia/Jeux
Programmation multimédia/Jeux Forum d'entraide sur la 2D, 3D, video, son, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/09/2011, 13h38   #1
VV33D
Membre expérimenté
 
Inscription : août 2010
Messages : 516
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 516
Points : 522
Points : 522
Par défaut classes de collision

Bonjour,

J'ai un ensemble de rectangles (all_rects) que je cherche à partitionner de la manière suivante:
- deux rectangles qui s'intersectent doivent appartenir à la même classe
- 2 rect. de 2 classes distinctes ne doivent pas s'intersecter.

Le but de cette partition est, plutôt que de dessiner tous mes sprites d'un coup, de pouvoir redessiner uniquement des groupes de sprites qui s'intersectent (et qui doivent donc être dessinés ensemble, de manière 'atomique').

Commencons par une version simple: calculer la classe d'un rectangle (un_rect) donné.
J'imagine le pseudo code suivant:
Code :
1
2
3
4
5
6
7
8
 
classe = []
new_elems= [un_rect]
while new_elems:
    all_rects.remove(new_elems) # epure la liste des candidats
    intersecting= [s for s in all_rects if s.collideany(new_elems) ]
    classe.extend(new_elems)
    new_elems= intersecting # epure la classe des éléments déja vérifiés
La complexité (O(N^3) au pire) de ce code me laisse perplexe, d'autant plus qu'il faudrait y rajouter des infos sur quels sprites ont été dessinés (car entre deux appels à paint(), les classes ont pu évoluer).

Je sais que l'un des pygame.SpriteGroup fait grosso modo la même chose, mais il est trop lent pour mes besoins. Existe-t'il un algo rapide pour faire cela ?

Je pense aux pistes suivantes:
- Une classification descendante (plutot qu'ascendante dans le pseudo code précédent)
- Mettre à jour à chaque update de rectangle la liste des rect intersectant, plutot que le calcul collideany() à chaque fois que je calcule une classe.

Merci d'avance pour vos idées / commentaires.
VV33D est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h00.


 
 
 
 
Partenaires

Hébergement Web