Quelle est la meilleure façon de vérifier la collision d'un grand nombre de cercles ?
Il est très facile de détecter une collision entre deux cercles, mais si l'on vérifie chaque combinaison, c'est O(n 2 ) ce qui n'est certainement pas une solution optimale.
Nous pouvons supposer que l'objet cercle a les propriétés suivantes :
- Coordonnées
- Rayon
- Vélocité
- Direction
La vitesse est constante, mais la direction peut changer.
J'ai proposé deux solutions, mais il en existe peut-être de meilleures.
Solution 1
Divisez l'espace entier en carrés qui se chevauchent et vérifiez la collision uniquement avec les cercles qui se trouvent dans le même carré. Les carrés doivent se chevaucher pour qu'il n'y ait pas de problème lorsqu'un cercle se déplace d'un carré à l'autre.
Solution 2
Au début, les distances entre chaque paire de cercles doivent être calculées.
Si la distance est faible, ces paires sont stockées dans une liste, et nous devons vérifier la collision à chaque mise à jour.
Si la distance est grande, nous stockons après quelle mise à jour il peut y avoir une collision (elle peut être calculée car nous connaissons la distance et les vitesses). Cela doit être stocké dans une sorte de file d'attente prioritaire. Après le nombre de mises à jour calculé précédemment, la distance doit être vérifiée à nouveau, puis nous procédons de la même manière : nous la plaçons sur la liste ou dans la file d'attente prioritaire.
Réponses aux questions de Mark Byers
-
C'est pour un jeu ?
Il s'agit d'une simulation, mais elle peut également être traitée comme un jeu. -
Voulez-vous recalculer la nouvelle position toutes les n millisecondes, et vérifier également les collisions à ce moment-là ?
Oui, le temps entre les mises à jour est constant. -
Voulez-vous trouver l'heure à laquelle la première/toutes les collisions se produisent ?
Non, je veux trouver chaque collision et faire "quelque chose" quand elle se produit. -
Quelle est l'importance de la précision ?
Cela dépend de ce que vous entendez par précision. Je dois détecter toutes les collisions. -
Est-ce un gros problème si de très petits cercles en mouvement rapide peuvent se croiser occasionnellement ?
On peut supposer que la vitesse est si faible qu'elle ne se produira pas.
1 votes
C'est une question intéressante, mais pouvez-vous nous en dire un peu plus sur ce à quoi cela sert ? C'est pour un jeu ? Je remarque que vos cercles bougent. Voulez-vous recalculer la nouvelle position toutes les n millisecondes, et aussi vérifier les collisions à ce moment-là ? Voulez-vous trouver l'heure à laquelle la première/toutes les collisions se produisent ? Quelle est l'importance de la précision ? Est-ce un gros problème si de très petits cercles se déplaçant rapidement peuvent se croiser occasionnellement ?
2 votes
@Mark : J'ai ajouté des réponses à toutes vos questions.
0 votes
Comment la direction est-elle calculée ? Souvent, lorsque vous modélisez des objets physiques, vous disposez d'une liste de vecteurs de force et les objets peuvent se déplacer selon des courbes.
0 votes
@Will : J'aimerais avoir une réponse générale lorsque nous ne savons pas comment la direction est calculée.
0 votes
J'ai mal compris la question au début, comme le montrent mes modifications - plus j'y pense, plus la liste de paires semble intéressante :)
0 votes
Gardez à l'esprit qu'avec des mises à jour temporelles constantes, vous ne pouvez pas réellement détecter toutes les collisions, car celles-ci peuvent avoir lieu à un moment arbitrairement proche, sauf si les collisions ne modifient jamais la taille ou la trajectoire des cercles. Vous pouvez soit dire que ce n'est pas grave (vous trouverez une collision, mais peut-être pas celle qui se serait réellement produite), soit trier les temps de collision dans un pas de temps et les appliquer dans l'ordre.
0 votes
Donc le logiciel existant pour le LHC n'a pas bien fonctionné je suppose.
0 votes
Je suis un peu confus. Cette question n'a aucun sens, à moins que l'auteur ne veuille dire vitesse constante au lieu de vélocité constante ?