Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rebond d'une balle sur une ligne

Sujet résolu
    5 mai 2011 à 22:11:35

    Salut à tous ! :)

    C'est la première fois que je poste sur ce forum mathématique, et je vais ici prouver que "informatique sans mathématiques" n'est pas possible. ^^

    Je participe actuellement à un concours en langage C sur le SdZ, et je me heurte à un problème. Dans mon jeu, des billes doivent rebondir sur des lignes obliques. :o Le problème est que j'ai beau tout essayer, mais les billes rebondissent absolument n'importe comment. Bon, où sont les maths dans tout ça, j'y viens.

    Ma bille est caractérisée par un vecteur vitesse dont j'ai les coordonnées. Exemple : la bille A à un vecteur vitesse <math>\(\vec{u} (23 ; -17)\)</math>. De plus, j'ai également le coefficent directeur de la ligne sur laquelle doit rebondir la bille (on peut toujours transformer ce coefficient directeur en vecteur directeur). Mon but est donc de trouver les coordonnées du vecteur <math>\(\vec{u}'\)</math>, qui sera le vecteur directionnel de ma bille après qu'elle aie rebondi sur la ligne. Je vous ai fait un joli shéma sous paint pour illustrer tout ça. :)

    Image utilisateur

    Voila, en réalité, je cherche les coordonnées du vecteur <math>\(\vec{u}'\)</math> en fonction de <math>\(\vec{u}\)</math> et du vecteur directeur de ma droite.

    J'ai déjà essayé quelque chose : je calculais la normale et après j'utilisais des formules du produit scalaire, mais rien n'a marché convenablement.

    Voila, j'ai tout expliqué, j'espère que certains d'entre vous qui ont la solution auront quelques minutes à me consacrer. ^^

    Une dernière info : je suis en 1èreS, donc s'il y avait une solution que je pourrais comprendre ça serait encore mieux ! :-°
    • Partager sur Facebook
    • Partager sur Twitter
    Bla bla bla
      6 mai 2011 à 8:45:11

      Bonjour,

      si tu regardes tes deux vecteurs, tu remarques que leurs projections orthogonales sur la droite D (qu'on appelle composantes tangentielles) sont identiques alors que leurs projections sur une droite perpendiculaire à D (qu'on appelle composantes normales) sont de sens opposés.

      Si on nomme <math>\(\vec{a}\)</math> et <math>\(\vec{b}\)</math> les composantes tangentielles et normales de <math>\(\vec{u}\)</math>, alors <math>\(\vec{u} = \vec{a} + \vec{b}\)</math> et <math>\(\vec{u'} = \vec{a} - \vec{b}\)</math>

      Le tout est maintenant de trouver <math>\(\vec{a}\)</math> et <math>\(\vec{b}\)</math> (en fait, il suffit de trouver <math>\(\vec{a}\)</math> OU <math>\(\vec{b}\)</math>, l'un se déduisant de l'autre et de <math>\(\vec{u}\)</math>). Et tu étais sur une très bonne voie en utilisant le produit scalaire. En effet, si tu disposes d'un vecteur directeur unitaire <math>\(\vec{d}\)</math> de ta droite ( <math>\(\vec{d} = \frac{1}{\sqrt{1+c^2}}(1,c)\)</math> si <math>\(c\)</math> est ton coefficient directeur), <math>\(\vec{a}\)</math> est colinéaire à <math>\(\vec{d}\)</math> et <math>\(\vec{u}.\vec{d}\)</math> (produit scalaire) est (au signe près, selon le sens relatif de <math>\(\vec{u}\)</math> par rapport à <math>\(\vec{d}\)</math>) le norme de <math>\(\vec{a}\)</math>, au final, tu as <math>\(\vec{a} = (\vec{u}.\vec{d}) \times \vec{d}\)</math>
      tu en déduis ensuite <math>\(\vec{b}\)</math> (<math>\(= \vec{u} - \vec{a}\)</math>)et donc <math>\(\vec{u'}\)</math> (<math>\(= \vec{a}-\vec{b} = 2\vec{a} - \vec{u}\)</math>)

      Edit : j'avais pas le temps ce matin, mais voici un petit schéma (fait sous paint.net, c'est tellement mieux que paint :p ) où apparaissent les différents vecteurs dont je parle (j'ai souligné les vecteurs). En espérant que ça éclairera mon propos ^^

      Image utilisateur
      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2011 à 19:40:20

        Citation : rushia

        <math>\(\vec{a} = (\vec{u}.\vec{d}) \times \vec{d}\)</math>



        Je t'avoue que je suis resté bloqué 5 minutes sur cette ligne en pensant que tu multipliais un vecteur par un vecteur, avant de me rendre compte que <math>\(\vec{u}.\vec{d}\)</math> donnerait un réel. :p

        Donc si j'ai bien compris, pour trouver <math>\(\vec{u}'\)</math>, il me suffit de trouver <math>\(\vec{a}\)</math> ?

        je vais tout détailler sinon je vais me perdre. ^^

        Si j'ai <math>\(\vec{u}(x ; y)\)</math>, et <math>\(\vec{d}(1;c)\)</math>, avec <math>\(c\)</math> le coefficient directeur de ma droite.

        <math>\(\vec{a} = (x + cy) \times \vec{d}\)</math>
        Donc après j'aurais :
        <math>\(\vec{a}(1(x + cy) ; c(x + cy) )\)</math>, d'ou <math>\(\vec{a}(x + cy ; cx + c^2y)\)</math>... J'ai l'impression d'avoir fait une bêtise quelque part. :euh: Bon, je continue quand même :

        <math>\(\vec{u}' = 2\vec{a} - \vec{u}\)</math>
        <math>\(\vec{u}'( 2 ( x + cy ) - x ; 2 (cx + c^2y) - y)\)</math> ? :o

        J'espère ne pas avoir fait de bêtises, merci beaucoup pour ton aide ! :)

        Je teste ça dès ce soir (en espérant encore ne pas avoir fait d'erreur... :euh: ).

        Merci pour tout ! :)

        EDIT : non, ya une erreur dans mes calculs, les billes ne rebondissent toujours pas correctement. On le voit assez bien avec cette image ou j'ai coloré en rouge la trajectoire des billes (je sais, c'est moche, mais bon ! :p ).

        Image utilisateur
        • Partager sur Facebook
        • Partager sur Twitter
        Bla bla bla
          6 mai 2011 à 20:23:21

          Attention, il faut absolument que <math>\(\vec{d}\)</math> soit unitaire pour appliquer la formule que j'avais donnée.
          Ou alors, en notant <math>\(d\)</math> la norme de <math>\(\vec{d}\)</math>, <math>\(\frac{1}{d} \times \vec{d}\)</math> est un vecteur directeur unitaire, on peut alors utiliser la formule et en déduire que l'on a <math>\(\vec{a} = \frac{\vec{u}.\vec{d}}{d^2} \times \vec{d}\)</math>
          Donc en divisant ton résultat par <math>\(d^2 = 1+c^2\)</math>, ça devrait marcher.
          • Partager sur Facebook
          • Partager sur Twitter
            6 mai 2011 à 21:51:47

            <math>\(\vec{a}(\frac{x + cy}{1 + c^2};\frac{cx + c^2y}{1 + c^2})\)</math>

            <math>\(\vec{u}'(2 \times \frac{x + cy}{1 + c^2} - x ; 2 \times \frac{cx + c^2y}{1 + c^2} - y)\)</math>
            ...

            Ca ne marche toujours pas... tu es sur que je ne suis pas trompé dans mes calculs ?

            Ou alors peut-être que je pourrais d'abord transformer <math>\(\vec{d}\)</math> en vecteur unitaire pour que ça soit plus simple ?
            • Partager sur Facebook
            • Partager sur Twitter
            Bla bla bla
              6 mai 2011 à 21:57:40

              J'ai bien peur que ton calcul soit juste pourtant.
              transformer <math>\(\vec{d}\)</math> en vecteur unitaire devrait te donner le même résultat

              edit : bon, essayons de voir si ça donne le résultat attendu pour des cas simples :

              - si <math>\(c=0\)</math> (droite horizontale), on s'attend à avoir <math>\(\vec{u'} = (x ; -y)\)</math>
              et la formule donne : <math>\(\vec{u'}(2 \times \frac{x + 0*y}{1 + 0^2} - x ; 2 \times \frac{0*x + 0^2y}{1 + 0^2} - y) = (x ; -y)\)</math>

              - si <math>\(c = \infty\)</math> (droite verticale), on s'attend à avoir <math>\(\vec{u'} = (-x ; y)\)</math>
              et la formule donne : <math>\(\vec{u'}(2 \times \frac{x + \infty*y}{1 + \infty^2} - x ; 2 \times \frac{\infty*x + \infty^2y}{1 + \infty^2} - y) = (- x ; y)\)</math> (il faut un calcul de limites, mais il me semble qu'on commence à voir ça en fin de première. Dans le cas contraire, fait moi confiance ^^ )

              Dans ces deux cas limites, la formule semble correcte ...
              • Partager sur Facebook
              • Partager sur Twitter
                6 mai 2011 à 22:37:14

                Oui il se trouve que ça marche dès qu'on s'apporche d'une droite horizontale ou verticale, mais prenons maintenant <math>\(c = -1\)</math> et <math>\(\vec{u}'(0;-3)\)</math> (pour rester simple ^^ ). On s'attendrait à trouver <math>\(\vec{u}(3;0)\)</math>

                Image utilisateur

                Et la formule donne <math>\(\vec{u'}(2 \times \frac{0 -1 \times 3}{1 + (-1)^2} - 0 ; 2 \times \frac{-1 \times 0 + (-1)^2 \times 3}{1 + (-1)^2} - 3) = (- 3 ; 0)\)</math>

                Soit il y a juste une erreur de signe quelque part, soit le fait que le résultat ressemble à peu près à ce qu'on voulait obtenir est du au fait qu'on a pris des valeurs simples comme <math>\(-1, 0\)</math> ou <math>\(3\)</math>. Mais dès que l'on prend des valeurs un peu plus compliquées, j'obtiens des résultats abérrants. :o

                Pour les limites, oui, on les voit en début d'année. ^^

                Voici les calculs que j'ai mis dans mon programme :

                double distance = sqrt( d.x * d.x + d.y * d.y ); // On calcule la norme du vecteur d
                
                    // On rend le vecteur d unitaire
                
                    d.y = d.y / distance;
                    d.x = d.x / distance;  
                
                
                    // On calcule le vecteur colinéaire a.
                    Vector a;
                    a.x = d.x * (u.x * d.x + u.y * d.y);
                    a.y = d.y * (u.x * d.x + u.y * d.y);
                
                    // On calcule le vecteur u'.
                    up.x = 2 * a.x - u.x;
                    up.y = 2 * a.y - u.y;
                


                .x et .y représentent les composantes horizontales et verticales des vecteurs.
                • Partager sur Facebook
                • Partager sur Twitter
                Bla bla bla
                  6 mai 2011 à 22:45:16

                  Tu te trompes dans ton exemple : <math>\(\vec{u} = (0 ; -3)\)</math> et <math>\(\vec{u'} = (3 ; 0)\)</math>

                  et la formule donne :

                  <math>\(\vec{u}' = (2 \times \frac{0 + (-1)(-3)}{1 + (-1)^2} - 0 ; 2 \times \frac{(-1)*0 + (-1)^2*(-3)}{1 + (-1)^2} - (-3))= (3 ; 0)\)</math>

                  encore une fois, la formule donne le bon résultat.

                  Edit : ton programme à l'air correct pourtant.

                  Que se passe-t-il si tu entres directement les formules ?
                  up.x = 2 * (u.x + c * u.y)/(1 + c*c) - u.x ;
                  up.y = 2 * (c * u.x + c*c * u.y)/(1 + c*c) - u.y ;
                  

                  ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 mai 2011 à 22:49:09

                    C'est moi qui l'applique mal alors (cf mon edit du poste précédent ). :(

                    Merci beaucoup pour ton aide, je reverrai tout ça à tête reposée, et j'utiliserai sûrement cette formule. La difficulté consiste à l'adapter à mon programme...

                    Citation : rushia

                    Edit : ton programme à l'air correct pourtant.



                    Moui, mais c'est pas le cas (et pourtant je t'ai fait un copier-coller du code. ^^ ).

                    Image utilisateur


                    Citation : rushia


                    Que se passe-t-il si tu entres directement les formules ?

                    up.x = 2 * (u.x + c * u.y)/(1 + c*c) - u.x ;
                    up.y = 2 * (c * u.x + c*c * u.y)/(1 + c*c) - u.y ;
                    


                    Avec <math>\(c\)</math> la norme du vecteur <math>\(\vec{d}\)</math> ? Toujours le même comportement étrange.

                    La ça tourne à la chasse à l'erreur, donc je recommencerai depuis le début demain matin. ;)

                    Merci pour tout. :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Bla bla bla
                      7 mai 2011 à 16:15:27

                      Non, avec c le coefficient directeur.

                      Enfin, peu importe :
                      J'ai l'impression que les trajectoires que tu donnes seraient correctes, mais avec un coefficient directeur opposé à ceux affichés.

                      Exemple, la première droite à un coefficient directeur proche de 1, si elle avait un coefficient proche de -1, la trajectoire serait correct, car on se retrouverait comme dans ton dernier exemple : <math>\(\vec{u}\)</math> vertical dirigé vers le bas et <math>\(\vec{u'}\)</math> horizontal et dirigé vers la droite.

                      A mon avis, la partie du programme que tu as copiée/collée est correcte, mais il doit y avoir un problème au moment ou tu détermines le coefficient directeur. Essaie en mettant l'opposé du coefficient que tu utilises.


                      Edit : comme j'ai l'impression de pas être très clair, j'ai pris ton image pour illustrer ce que je viens de dire. En jaune les droites pour lesquelles les trajectoires semblent correctes : elles ont un coefficient directeur opposée aux droites blanches correspondantes.

                      Image utilisateur
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 mai 2011 à 23:19:25

                        Bien vu !! :)

                        Ca marche parfaitement. Le problème venait d'un signe "-" qui trainait dans le calcul de d.y.

                        Merci beaucoup ! :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Bla bla bla
                          7 mai 2011 à 23:37:40

                          Ouf,

                          Dans ce cas, bonne chance pour la suite du concours (ton jeu à l'air assez prenant, je viens de télécharger le modèle sur iPhone ^^ )
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Rebond d'une balle sur une ligne

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown