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. P>
Je veux obtenir quelque chose comme 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). P>
donc je veux une méthode de détection rapide que le numéro de balle ps désolé pour la boucle-gif d'animation. Appuyez simplement sur ESC pour l'arrêter. (Ne fonctionnera pas en chrome). P> i code> 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 code> ballon. (Cette recherche sera n ^ 2.) P>
3 Réponses :
É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. p>
Je suis sûr qu'il y a des approches plus sophistiquées, mais cela pourrait être un bon départ. P>
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: p>
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. p>
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.