Bonjour

Depuis plus d'une semaine j'essaye d'écrire une petite application simulant des collisions entres des boules(représentées par des cercles).J'ai déjà pus écrire une petite partie du code mais il est tellement beugé que je craint devoir le réécrire une 5eme fois.

c'est une application en 2D qui devras se contenter de trouver les nouveaux "vecteurs direction" de chaque sphères (un nombre variable, j'utilise une liste) après la collision, de la manière la plus réaliste possible.Les boules ont un rayon et une masse différentes et peuvent se rencontrer de n’importe quelle façon.Les frottements et la gravité sont ignorées.

Au vu de mon niveau en math ( ) se serais bien de faire simple, clair et détaillé (je n'ai pas encore vu les vecteurs alors je me débrouille comme je peut(même si je n'ai rien compris au code que j'ai écrit))

Me = la boule en cour de traitement ; Jeu.Boulles(i) = la boule avec laquelle on teste et traite si nécessaire la collision ; .PosY et .PosX = position ; .VectX et .VectY = composants des vecteurs vitesse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
If GetDistance(Me.PosX, Me.PosY, Jeu.Boulles(i).PosX, Jeu.Boulles(i).PosY) - Me.rayon - Jeu.Boulles(i).rayon <= 0 And Me.TheI <> i Then  'ca, ca marche
 
                    Dim CDT As Integer = -1 / ((Me.PosY - Jeu.Boulles(i).PosY) / (Me.PosX - Jeu.Boulles(i).PosX) + 0.02) ' recherche du coef-directeur de la droite tangente passant par le point d'intersection des cercles
 
                    Dim d As New Point(1, CDT) ' j'ai oublié c'est quoi :( , je crois que j'ai voulu faire un truc qui s'appelle vecteur unitaire
                    Dim a As New Point(Me.VectX + CDT * Me.VectY, Me.VectX * CDT + CDT * CDT * Me.VectY) 'je sais pas c'est quoi mais je le guarde au cas ou c'est important
 
                    Dim up As New Point(2 * (Me.VectX + Me.VectY * CDT) - Me.VectX, 2 * (CDT * Me.VectX + CDT * CDT * Me.VectY) - Me.VectY) 'ca c'est le nouveau vecteur
 
                    If boo = True Then ' boo sert a éviter d' executer le code 3000 fois
                        Jeu.Boulles(i).colision(False)'je teste tout de suite pour l'autre boulle avant de faire les changement car sino elle croit qu'elle n'est plus en collision a cause du recul (mais ca marche pas :( )
                        While GetDistance(Me.PosX, Me.PosY, Jeu.Boulles(i).PosX, Jeu.Boulles(i).PosY) - Me.rayon - Jeu.Boulles(i).rayon <= 0 'on regarde si les boulles sont imbriquées les unes dans les autre et on les recule si oui pour éviter qu'elles restent collées enssemble (bug),mais ca marche toujour pas :ouin:
                            Me.PosX = Me.PosX - Me.VectX  'recul
                            Me.PosY = Me.PosY - Me.VectY 'recul
                        End While
                    End If
 
 
 
                    'la, j'enregistre les nouveaux vecteurs
                    Me.VectX = up.X 
                    Me.VectY = up.Y
 
                End If
bug:
parfois,une seule des deux boules concernées rebondit
des boules se greffent ensemble et ralentissent


et au final ça marche pas, voir quarement pas, et moi et aussi et

alors si vous pouvez m'aider ce serais vraiment sympas.
merci d'avance

PS:

désolé pour la présentation (et pour les (nombreuses?) victimes qui devront le lire) de ce post mais je suis vraiment pas doué pour ça.