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

Algorithmes et structures de données Discussion :

Angle d'incidence et Angle de sortie...


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut Angle d'incidence et Angle de sortie...
    Bonjour,

    Je travaille actuellement sur un petit projet perso en C++ avec la SDL sous Windows Xp (une sorte de Pong) et je suis confronté à un problème : je n'arrive pas à concevoir le rebond de la balle aux quatres coins de la scène de jeu...

    Pour l'instant, je sais qu'il faut tenir compte de l'angle d'incidence par rapport à la normale à la surface (il peut s'agire d'un bord de l'écran ou d'une barre rectangulaire) pour calculer la façon dont je dois faire progresser la balle en fonction d'un angle de sortie...

    Mais ça reste pas plus précis que ça dans ma tête alors je vous demande un peu d'aide. Merci d'avance

    Sujet déplacé par BigBoomShakala depuis la section C++

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut,

    Je pense que ça aurait plus sa place dans Algorithmes/Maths que dans C++

    Sinon, le truc le plus bateau (si je puis dire) pour les rebonds et "d'inverser" simplement la vitesse normale, et de conserver la vitesse parrallèle à la surface de rebond, càd que l'angle de sortie sera celui d'incidence...

    Exemple : ta "balle" va avoir une vitesse "Horirzontale" (Vx) et une vitesse "Verticale" (Vy), si tu arrives contre un "bord" (bord d'écran ou bord de la raquette de renvoie) Vertical, tu "inverses" la Vitesse normale (càd Horizontale) (donc Vx devient -Vx) et tu laisses telle qu'elle la vitesse Parallèle, (càd la vitesse Verticale) (donc Vy ne bouge pas)...

    Ensuite, avec ça, pas possible de faire des effets ou de gérer l'accélération :\ sinon, il faudrait sûrement tapper dans cos et sin, tout ça, il me semble qu'il y avait une formule en utilisant les complexes, du style :
    ((Vi)e^(i(Ai)))*((Ac)e^(i(pi)/2) = (Vf)e^(i(Af))
    (Vi est la vitesse totale initiale, Ai l'angle d'incidence, Ac pour l'accélération, Vf pour la vitesse finale et Af pour l'angle de Sortie) mais à vérifier dans les cours de physiques, j'en suis pas sûr du tout XD...

    Enfin, tout ça pour dire que c'est plus un problème de Physique ou de Maths que de C++

    Bonne Continuation
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Merci beaucoup Swoög, quand tu dis :

    Ensuite, avec ça, pas possible de faire des effets ou de gérer l'accélération :\
    Qu'entends-tu par là ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    En horizontal/vertical, on peut toujours gérer quelques petits effets, mais pas toujours avec un réalisme maximal...

    Déjà, faire en sorte que la balle rebondisse différemment selon la façon dont elle tape la raquette (sinon ça devient vraiment monotone). Pour cela, le plus simple est de lui donner une vitesse verticale (si la raquette l'est, comme c'est le cas dans pong) qui dépend de la position de la balle sur la raquette...

    Ensuite, gérer accélération/décélération: La vitesse de la balle diminue au cours du temps, et est amplifiée à chaque coup sur une raquette... (point perdu pour le dernier frappeur si la balle s'immobilise, ce qui peut arriver avec une vitesse horizontale trop faible--> généralement, on choisit la vitesse horizontale initiale de sorte que ça n'arrive pas)

    etc...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Dans un jeu de type Pong, l'accélération de la balle ne peut être modifiée qu'au moment des rebonds, la balle ne va pas accélérer sans raison au milieu de son trajet, or, si tu te contentes d'inverser la vitesse normale lors du rebond, auncun effet n'est effectué sur l'accélération (il faudrait même qu'elle soit annulée, ou qu'elle subisse le même traitement que la vitesse, sinon, on risque d'être face à un problème de cohérence), il est donc impossible de gérer l'accélération simplement en inversant la vitesse normale, il faut se tourner vers des formules plus complexes qui mettent en jeu et utilisent l'accélération

    PS : comme je l'ai précisé dans le premier post, ceci n'a rien à voir avec le C++, demande à un modérateur que ce soit déplacer dans le forum adéquate (Algorithmes) Merci
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Médinoc
    En horizontal/vertical, on peut toujours gérer quelques petits effets, mais pas toujours avec un réalisme maximal...

    Déjà, faire en sorte que la balle rebondisse différemment selon la façon dont elle tape la raquette (sinon ça devient vraiment monotone). Pour cela, le plus simple est de lui donner une vitesse verticale (si la raquette l'est, comme c'est le cas dans pong) qui dépend de la position de la balle sur la raquette...

    Ensuite, gérer accélération/décélération: La vitesse de la balle diminue au cours du temps, et est amplifiée à chaque coup sur une raquette... (point perdu pour le dernier frappeur si la balle s'immobilise, ce qui peut arriver avec une vitesse horizontale trop faible--> généralement, on choisit la vitesse horizontale initiale de sorte que ça n'arrive pas)

    etc...
    Je crois que alex6891 ne serait pas contre faire ce que tu proposes, mais qu'il lui manque les formules Physiques et Mathématiques associées à la gestion des rebonds
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Voilà j'avoue être un peu déconnecté du monde de la physique qui m'a plutôt l'air utile J'éprouve de grosses difficultés à comprendre ce que vous dites pour réussir à l'interpréter en C++, en bref pour l'instant je n'ai même pas réussi à en sortir une ligne de code... Suis-je perdu ?

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    Essayons d'expliquer un peu :

    on suppose que t'as un objet mobile dans ta scène, qui peut etre modélisé par un simple point P. cet objet est en mouvement, donc suit un trajet. cet trajectoire peut etre modélisée par un simple vecteur V.
    quand cet objet entre en collision avec un autre objet de la scène, sa trajectoire (donc le verteur V) doit logiquement changé. Mais ce changement de trajectoire n'est conditionné que par une seule chose. c'est le point d'impact avec l'objet percuté. l'information la plus importante du point d'impact c'est le vecteur normal (N) à la surface(en supposant que le point appartient à une surface tangente à la forme de l'objet percuté au point d'impact). ce point d'impacte ne fait que réfléchir le vecteur V. ce qui donne un vecteur réfléchi R.
    la formule du vecteur réfléchi R est
    R = V - (2 * ( N . V) * N)

    comment peut on translater ce que je viens de dire en algorithme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Algo :
    variables
      Obj : Objet mobile (représenté par P:Point et V:vecteur)
      PImpact : Le point d'impact (représenté par P:Point et N:vecteur normal)
      Scène : scene où l'objet se déplace
    Repeter
      PImpact <-- TrouverCollision(Obj, Scène) // Detecter les collisions
      Si PImpact <> Vide Alors
        Obj.V <-- CalculerVecteurReflechi(Obj.V, PImpact.N) // Claculer le vecteur reflechi
        Obj.P <-- PImpact.P // Deplacer l'objet
      sinon
        Obj.P <-- Obj.P + Obj.V // Deplacer l'objet
      Finsi
    jusqu'à (fin du traitement)
    cet algorithme tourne indéfiniment en effectuant 3 opérations
    1- Détecter les collisions
    2- Calculer le vecteur réfléchi
    3- Déplacer l'objet

    C’est fini j’espère que j’ai répondu à ta question

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Oui Chebreg merci pour tes explications

    Mais il y a un truc que je ne saisis pas, ta formule R=V-(2*(NV)*N), tu la sors d'où ?

    Merci, parce que je préfère comprendre les formules que j'utilise avant de les mettre en pratique

  10. #10
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    V s'écrit V = Vt + Vn où Vt est la composante tangentielle et Vn la composante normale. Si on adment qu'il n'y a pas de terte d'énergie alors, après le rebond Vn devient -Vn, R après le choc s'écrit alor R = Vt - Vn soit
    R = V - 2*Vn.
    En cas de perte d'énergie Vn après le choc vaut -A*Vn où A est une constante [0..1].

Discussions similaires

  1. Calcul d'angle de sortie de rebond d'une balle sur une droite
    Par niocco dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/04/2015, 17h17
  2. Comment faire une rotation de metafile (l'angle de 90° me suffit) ?
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2005, 08h58
  3. Conversion distance , angle vers coordonnées de points
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/03/2004, 22h55
  4. calculer un angle
    Par m.nico dans le forum Langage
    Réponses: 7
    Dernier message: 05/11/2003, 20h55
  5. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47

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