IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Simulation de colision de cercles


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Par défaut Simulation de colision de cercles
    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.

  2. #2
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut
    Bonjour,
    Pour détecter les collisions je pense qu'il serait pratique d'utiliser des équations de cercle : http://fr.wikipedia.org/wiki/%C3%89q...rt%C3%A9sienne.

    Je comprends pas pourquoi tu veux les reculer :
    '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
    Pourquoi quand on détecte une collision pourquoi on ne met pas directement à jours les nouveaux vecteurs avec la loi physique qui semble la mieux adaptée ici, celle des chocs élastiques... http://fr.wikipedia.org/wiki/Choc_%C3%A9lastique
    Tu as un algo qui te montre comment les mettre à jour en suivant cette loi.

  3. #3
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Par défaut
    Le problème, justement, c'est que je croyais avoir utilisé la méthode du wiki (mais je n'ai pas réussi a le mettre sous forme d'algorithme)

    ensuite si je les déplace au lieu de les reculer cela résout le problème des imbrication mais en pose 2 nouveaux:
    - a la place des imbrications, des boules font des "bonds" gigantesques donnant l'impression qu'elles se téléportent
    - message d'erreur au bout d'un certain temps : l'opération arithmétique a provoqué un dépassement de capacité dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function GetDistance(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer)
                Return (Sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))))
            End Function
    x1=-1054
    x2=1003
    y1=-153254
    y2=94

    ps : je sais pas pourquoi les valeurs sont tant élevées car la zone ou se déplacent les boules est fermée(2000x2000) et leurs vecteurs extremums sont (25,25) et (-25;-25)

  4. #4
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut
    Je pense que c'est tout l'algo qui est mal organisé. En le voyant comme ça c’est pas facile à comprendre la logique. Je te dis comment je ferai moi.

    Tu as à chaque boule son vecteur qui est associé, sa masse, sa vitesse, le point d'applications.... Bref

    Première étape
    On calcule le déplacement de la boule. En gros on regarde le temps écoulé depuis la dernière génération de la simulation,
    on en déduit la distance parcourue... Ensuite on met à jour les point d'application (centre de la boule)

    Deuxième étape

    On cherche une éventuelle collision que la MAJ des positions aurait entrainée. La résolution d'équation cartésienne
    est mieux car tu auras les points de collision, ta simulation n'en sera que plus complète.
    Si on a une collision entre deux boules tu peux appliquer la formule du wiki, tu mets a jour le vecteurs....

    Ensuite on retourne à l'étape 1 et les boules changeront de directions sans problème.

    Si il te parle de dépassement de capacité c'est certainement que le type integer n'est pas capable de stocker la valeur trop grande. Vu que les valeurs sont petites
    il s'agit certainement d'une erreur dans la formule.

    Edit : ta formule de calcul des distances me semble fausse : http://fr.wikipedia.org/wiki/Distanc...%A9matiques%29 Regarde la distance euclidienne pas les autres

  5. #5
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Par défaut
    Je n'ai surement pas le niveau pour ces équations...
    Je ne sais ce qu'est un vecteur que depuis moins de 2 semaines et j'ai galérer pour essayer de faire un algorithme qui fonctionne sans succès.
    a chaque fois que je recommence j'ai l'impression de faire pareil et qu'il n'y a aucun progrès

    j'ai déja utilisé les formules du wiki et cela ne donnait pas des choses très réaliste car cela ne fessais qu’inter-changer les vecteurs 'y' composant les vecteurs vitesses des cercles.(ou alors j'ai rien compris)

  6. #6
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut
    Mis à part les chocs élastiques je ne vois pas trop comment modéliser ton problème. Le wiki se base sur un repère par rapport au point de collision donc c'est pas trop la même chose pour toi, faut comprendre les formules et adapter à la situation.
    C'est important je pense de bien comprendre ce qu'est un vecteur pour que tu aies un résultat correct.

    Essaie déjà de simplifier ton problème pour commencer. Au lieu d'appliquer ces formules, quand tu détecte une collision inverse simplement le signe des coordonnées de vitesse en x et en y... Ça ne sera pas du tout réaliste mais si ca fonctionne il ne reste plus qu'a modifier quelques trucs pour utiliser les chocs élastiques.

    Un exemple basique :
    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
    26
    27
    28
    29
    30
    31
    32
     
    Public Class Main
        Public Sub main()
     
            Dim n As New Ball
            n.vX = 10
            n.vY = 10
     
            Dim n2 As New Ball
            n2.posX = 100
            n2.posY = 100
            n2.vX = -10
            n2.vY = -10
     
     
            ''On lance les calculs de position en boucle ici....
        End Sub
        ''' <summary>
        ''' On calcule la nouvelle position après un certain temps
        ''' </summary>
        Public Sub calcNewPos(b As Ball, time As Integer)
            b.posX = b.posX + vX * time
            b.posY = b.posY + vY * time
        End Sub
    End Class
    Public Structure Ball
        Public posX As Integer = 0
        Public posY As Integer = 0
        Public vX As Integer = 0
        Public vY As Integer = 0
        Public diameter As Integer = 0
    End Structure

Discussions similaires

  1. Probleme Voyageur de Commerce - Recuit Simulé
    Par dinver dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/06/2009, 22h26
  2. [VB6] [Graphisme] Tracer un cercle avec pset
    Par bleuerouge dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/12/2002, 17h12
  3. [VB6] [Graphisme] Arc de cercle dans un picturebox
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 04/11/2002, 17h55
  4. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51
  5. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 23/05/2002, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo