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 :

Rebond balle/brique : Recherche désespérément algo fonctionnel


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Rebond balle/brique : Recherche désespérément algo fonctionnel
    Bonjour à tous !!

    Le problème auquel je fais fasse va peut être vous sembler simple au premier abord. J'ai hésité tout d'abord à poster dans la partie jeux 2D, mais je me suis dit que ca pouvait etre plus proche de l'algorithmique.

    J'espère que vous saurez trouver une solution à ce problème

    Voici les données du problème :

    On a une balle (carrée) constituée des coordonnées x et y de son point en haut à gauche, et de sa taille.

    On a une brique, carrées, représentée par les coordonnées de son point en haut à gauche, et par sa taille.

    La balle est en mouvement, la brique est immobile.

    Un algorithme déjà existant permet de détecter lorsqu'il ya une collision entre la balle et la brique, c'est à dire lorsque la balle chevauche la brique.

    Quand c'est le cas, il appelle une fonction determinerRebond, c'est la fonction que je cherche à écrire.

    Petite explication :
    Quand la balle tape la brique sur le coté gauche ou le coté droit, elle doit rebondir horizontalement. Quand elle tape la brique par en haut ou par en bas, elle doit rebondir verticalement. Si elle tape dans un coin, elle doit rebondir horizontalement ET verticalement (mais cette dernière option est facultative).

    On dispose donc : de la balle avant qu'elle est fait son déplacement.
    de la balle après qu'elle ai fait son déplacement, au moment ou elle est en collision (elle chevauche la brique).
    et de la brique.

    A partir de ces informations, determinerRebond doit indiquer si le rebond est vertical, horizontal, ou les deux.

    On prend les conventions informatiques usuelles pour le repère : les X vont de gauche à droite et les Y de haut en bas (et repère orthonormé).

    Je résume les paramètres :

    Balle :
    xBalle : Entier : coordonnée en X du coin en haut à gauche de la balle au moment de la collision
    yBalle : Entier : idem en Y
    oldXBalle : Entier : coordonnée en X du coin en haut à gauche de la balle avant le déplacement
    oldYBalle : Entier : idem en Y
    tailleBalle : Entier : taille en pixel d'un côté du carré représentant la balle

    xBrique : Entier : coordonnée en X du coin en haut à gauche de la brique
    yBrique : Entier : coordonnée en Y du coin en haut à gauche de la brique
    tailleBrique : Entier : taille en pixel d'un côté de la brique

    Et la fonction renvoie 1 pour rebond horizontal, 2 pour rebond vertical, et 3 pour rebond vertical et horizontal

    Inutile de vous dire que j'ai beaucoup réfléchi à cet algorithme, et que j'ai expérimenté pas mal de choses.
    La position à un instant t, que ce soit avant ou après la collision, n'est pas suffisante pour déterminer si la balle est arrivée verticalement ou horizontalement. J'ai trouvé une solution possible en utilisant des coefficients directeurs.
    Mais j'ai du me gourer dans ma réflexion, parce que dans certains cas spéciaux, ca fait nimp...

    Si quelqu'un veux bien m'aider par un petit algo miracle... Merci d'avance !!

    @++

    Piwaï

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 84
    Points : 68
    Points
    68
    Par défaut
    Salut,

    J'ai peut-être une solution :

    Au moment du contact :

    si le coté haut de la balle a une ordonnée strictement inférieure au coté bas de la brique alors
    // ça veut dire que la balle a touché la brique sur le côté
    resultat = 1 ;
    sinon
    // ça veut dire que la balle a touché la brique par dessous
    si le coté droit de la balle a la même abscisse que la coté gauche de la brique ou le coté gauche de la balle a la meme abscisse que le coté droit de la brique alors
    // ça veut dire qu'elle a aussi touché le coté (donc l'angle)
    resultat = 3 ;
    sinon
    // ça veut dire qu'elle a touché que par dessous
    resultat = 2 ;
    fin si ;
    fin si ;

    Je le vois comme ça, avec une variable sensX pour le sens de la balle sur l'axe des abscisses (-1 pour la gauche, 1 pour la droite), et une variable sensY pour le sens de la balle sur l'axe des ordonnées (-1 pour le haut, 1 pour le bas). Pour un rebond vertical tu change la valeur de sensY et pour un rebond horizontal tu change la valeur de sensX (et pour le cas 3 tu change les deux)...

    J'espère t'avoir aidé un peu..

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2007, 16h52
  2. Recherche d'algo (/ coordonnées+poids fichier)
    Par Chekov dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2006, 02h19
  3. Arbre de recherche : quel algo conseiller ?
    Par cedico dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/12/2005, 11h07
  4. Recherche d'algos pour contours actifs
    Par yazifun dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 27/11/2005, 00h02
  5. rebond balle plan
    Par Mat 74 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 30/05/2005, 22h41

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