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

C++ Discussion :

Equations physique / mouvements


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Equations physique / mouvements
    Bonjour !

    Pour l'instant, je fais un calcul de vitesse/position comme si je n'avais aucune force autour de moi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     inline const double Physics::velocity(const double& a, const double& dt, const double& v)
     {
     return (a * dt) + v;
     }
     inline const double Physics::position(const double& a, const double& dt, const double& v, const double& p)
     {
     return (a * dt*dt) / 2) + (v * dt) + p;
     }
    Ca marche bien pour accelerer, la vitesse maximale est gerée par une simple constante.
    La est le probleme !
    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
     
    // dans le header
            /* real position */
            double x;
            double y;
            /* base */
            double ya; // acceleration
            double yt; // time
            double yv; // velocity
            double xa;
            double xt;
            double xv;
            /* max velocity*/
            double mxv;
            double myv;
     
    // la fonction qui met a jour la position 
    void Physics::move()
    {
        int t = clock(); // on récup le temps actuel (pour delta temps (t-xt))
        x = position(xa, t-xt, xv, x); // on calcule la position en abs
        y = position(ya, t-yt, yv, y); // on calcule la position en ord
        xv = (xa > 0) ? (velocity(xa, t-xt, xv) >= mxv) ? mxv : velocity(xa, t-xt, xv) // mouvement vers la droite
                        : (velocity(xa, t-xt, xv) <= -mxv) ? -mxv : velocity(xa, t-xt, xv); // mouvement vers la gauche
        yv = (velocity(ya, t-yt, yv) >= myv) ? myv : velocity(ya, t-yt, yv);
        xt = t; // et hop on met le temps a jour
        yt = t;
    }
    Je voudrais transformer ces equations/ce code en ajoutant une force venant du sol (une constante de signe inversée par rapport au signe de mon acceleration ?) pour que
    1. la vitesse maximale soit calculée aussi en fonction de cette force
    2. que si mon acceleration devient nulle, la force prend le dessus doucement, et alors j'ai une deceleration !


    Quelqu'un saurait me dire quel chemin suivre ? :o

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour DakM

    A vrai dire, je comprends pas grand chose à ton code et comment tu souhaites faire.
    Pour moi, il suffit de calcul les d/dt de chaque composantes :
    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
    // constantes initiales
    const double x0, y0, vx0, vy0, ax0, ay0;
     
    // variables
    double x, y, vx, vy, t;
     
    // initialisation
    t = 0;
    x = x0;
    y = y0;
    vx = vx0;
    vy = vy0;
     
    // déplacement infinitésimal 
    double dt = t - clock();
    double dx = vx * dt;
    double dy = vy * dt;
    double dvx = ax0 * dt; // accélération constante
    double dvy = ay0 * dt; // accélération constante
     
    // mise à jour des variables
    t += dt;
    x += dx;
    y += dy;
    vx += dvx;
    vy += dvy;
    Les équations sont quand même relativement simples, du coup, je comprend pas pourquoi les tiennes sont si complexes.

    Quelques petites classes pour encapsulé les positions et vitesses peut être ?

  3. #3
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Il n'y a rien de compliqué

    Je fais des calculs de vitesses avec une acceleration donnée.
    La vitesse evolue non uniformément car je prend en compte la vitesse initiale dans chaque calcul de vitesse à un temps t.

    J'aimerais pouvoir ajouter une force opposée à l'acceleration (qui correspond aux frottements avec le sol) pour réguler la vitesse maximale (ici mxv) de facon automatique !

  4. #4
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Salut,

    Citation Envoyé par DakM Voir le message
    Pour l'instant, je fais un calcul de vitesse/position comme si je n'avais aucune force autour de moi:
    Mes cours de physique sont loin mais si il n'y a pas de force, il n'y a pas d'accélération.

    Citation Envoyé par DakM Voir le message
    J'aimerais pouvoir ajouter une force opposée à l'acceleration (qui correspond aux frottements avec le sol)
    Une force de frottement est opposée à la vitesse, pas à l'accélération.

    Comme gbdivers, je ne comprend pas trop ce que tu cherches à faire. Pourrais-tu nous indiquer le but de ton code ?

  5. #5
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonsoir,

    Si tu veux modéliser un frottement, tu peux prendre une force de direction opposée à la direction et proportionnelle à la vitesse :

    F = - k*v

    Avec x vers la droite, y vers le haut et g la force, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m * ax = - k * vx ;
    m * ay = - k * vy - m * g ;
    PS : Tu ferais bien de faire une classe du style PhysicObject avec la position, la vitesse, l'accélération , etc. et une méthode update( dt ) pour ne pas promener 150 paramètres dans tes fonctions de mise à jour.

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Citation Envoyé par DakM Voir le message
    Pour l'instant, je fais un calcul de vitesse/position comme si je n'avais aucune force autour de moi:
    Eh bien en fait si. Tu as la bien célèbre équation F = m*a, la somme des foces est égale à la masse fois l'accélération.
    Si tu veux rajouter une force quelconque, il te suffit de changer l'accélération.

    Par exemple, en général on prend en compte la pesanteur, et on peut choisir :
    ce qui correspond à une force qui pointe "vers le bas" (c'est exactement la force que ressent sur Terre un objet de 1kg).

    Donc en principe, si tu ne mets que ça, tes objets vont irrémédiablement "tomber". Si tu veux qu'ils s'arrêtent en touchant le sol (en supposant qu'il soit en y=0) :
    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
    void Physics::update()
    {
        // On prend en compte la gravité, donc on met une accélération vers le bas
        xa = 0;
        ya = -9.81;
     
        if (y == 0)
        {
            // On est au sol, donc on rajoute une force qui compense la gravité
            ya += 9.81;
        }
     
        // On applique toutes ces forces sur l'objet, et on le déplace
        move();
     
        // On s'assure que l'objet ne traverse pas le sol
        if (y < 0)
        {
            // On met bien l'objet sur le sol (des fois qu'il serait en dessous)
            y = 0; 
            // et on annule sa vitesse en Y, de façon à ce qu'il ne bouge plus.
            vy = 0;
        }
    }
    Je n'ai pas testé ce bout de code : il peut y avoir des subtilités qui rendent la chose un peu plus compliquée, mais c'est l'idée. Après, il y a plein de manières différentes qui permettent de répondre à ce problème. Celle-ci est probablement l'une des plus simples (encore qu'on pourrait même se contenter du if (y <= 0) { y = 0; vy = 0; }), mais clairement pas la plus générale.

    Par contre, je ne vois vraiment pas de lien avec la vitesse maximale. Pourquoi voudrais-tu qu'elle dépende des forces qui s'appliquent sur ton objet ? Peut-être qu'on se comprendra mieux si tu nous donnes un exemple réel de ce que tu cherches à modéliser (chute d'un objet dans l'eau, ... ?).

Discussions similaires

  1. Equation de mouvement impossible à formaliser
    Par Mobaladje dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2010, 23h21
  2. Réponses: 32
    Dernier message: 20/04/2008, 20h24
  3. Moteur physique : comment l'implémenter ?
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 17/12/2003, 12h56
  4. résolution d'equation f(x) = 0
    Par magicien dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 16h06
  5. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09

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