8
votes

Simulation N-Corps en collision 2D (Détection de collision rapide pour grand nombre de balles)

Je veux écrire un programme permettant de simuler une motion de nombre élevé (N = 1000 - 10 ^ 5 et plus) de corps (cercles) sur un plan 2D. Tous les corps ont une taille égale et la seule interaction entre eux est une collision élastique.

Je veux obtenir quelque chose comme boules folles mais à plus grande échelle, avec plus boules et plus de remplissage dense de l'avion (pas un modèle de gaz comme ici, mais smth comme modèle d'eau bouillante).

donc je veux une méthode de détection rapide que le numéro de balle i a une autre balle sur son chemin dans un rayon de 2 * rayon + v * delta_t distance. Je ne veux pas faire une recherche complète de collision avec n boules pour chacun des i ballon. (Cette recherche sera n ^ 2.)

ps désolé pour la boucle-gif d'animation. Appuyez simplement sur ESC pour l'arrêter. (Ne fonctionnera pas en chrome).


4 commentaires

Dans quelle langue feriez-vous cela?


Voulez-vous que ce soit en temps réel?


Java (plus exactement - Traitement Java). Mais je ne sais pas quel algorithme je devrais utiliser.


Oui, je veux que ce soit en temps réel et de le montrer sur le moniteur. Je veux environ 25-50 fps avec le processeur moderne.


3 Réponses :


1
votes

Évidemment, vous voulez éviter (N1 -) * N Vérifications des collisions avec chaque itérature. Une approche simple serait de diviser la zone en une grille 2D de cellules, puis de faire une seule passe pour déterminer quelles cellules chaque balle passe dans l'itération actuelle. Chaque balle ne vérifie que des collisions avec des balles traversant les cellules qu'il passe à travers.

Je suis sûr qu'il y a des approches plus sophistiquées, mais cela pourrait être un bon départ.


0 commentaires

4
votes

Cette première étape de la simulation de physique est la détection de collision à large phase. Il existe plusieurs approches décrites ici ici Détection de collision à large phase avec Cuda mais les deux Les basiques sont:

  • Partitionnement spatial: diviser les objets dans une grille
  • Sort-and-balayage: trier tous les objets le long de deux axes

0 commentaires

1
votes

La largeur / la longueur de la grille doit être supérieure ou égale au rayon d'entre eux et la recherche doit être sur les 1er voisins (8 + centre = 9 grilles). Avec une taille de grille minimale, il est de dix à quinze fois le nombre de calculs de particules.


0 commentaires