|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre expérimenté
![]() Inscription : août 2010 Messages : 516 ![]() |
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 (en python/pygame): Code :
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. |
||
|
|
00
|
|
|
#2 | |
|
Membre confirmé
![]() Étudiant Inscription : juin 2005 Messages : 174 ![]() |
Citation:
Tout d'abord, mon approche serait de construire une fois pour toutes les paires d'objets en collision. Une méthode efficace est le Sort And Sweep (aussi connu sous le nom de Sweep And Prune, http://www.codercorner.com/SAP.pdf). La complexité de cet algorithme est de l'ordre de O(n) dans le meilleurs des cas (avec cohérence temporelle, c'est à dire si les rectangles ne bougent pas trop). Une fois ces paires déterminées, un algorithme très basique en O(n^2) suffit à déterminer les ilots de collision.
__________________
"That is not dead which can eternal lie And with strange aeons even death may die" The Call of Cthulhu |
|
|
|
00
|
|
|
#3 | |||
|
Membre expérimenté
![]() Inscription : août 2010 Messages : 516 ![]() |
Merci Nyarlathotep,
Citation:
Citation:
Citation:
je vais essayer d'implémenter le SAP, mais j'ai quand même l'impression que le temps de calcul risque de rendre le résultat (une fontion draw() plus atomique) mitigé. Merci |
|||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Étudiant Inscription : juin 2005 Messages : 174 ![]() |
Citation:
J'ai une autre référence pour le Sweep And Prune : http://graphics.cs.cmu.edu/courses/1.../14/notesg.pdf (Voir la section 7.2.1). Si tu t’intéresses au quadtrees, il suffit de taper dans google "quadtrees" pour tomber sur des articles interessants. Évidemment, tout cela ne te donnera que les paires d'objets en collision, pas les ilots. Il faut implémenter un algorithme qui répond à la question "quelles sont les paires qui contiennent cet objet". Après avoir réfléchi à la question, j'ai trouvé une idée : il s'agit de modifier les paires d'indices d'objets (a, b) de telle sorte que a < b, et de construire un arbre binaire avec l'ordre partiel sur le premier éléments avec celles-ci. Un algorithme de parcours de l'arbre en O(ln (p)) donne alors les paires qui contiennent un objet donné (p désigne le nombre de paires).
__________________
"That is not dead which can eternal lie And with strange aeons even death may die" The Call of Cthulhu |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com