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 :

[C++]La classe particule


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut [C++]La classe particule
    Salut a tous,
    Je viens m'adresser à vous car je suis sur que vous allez pouvoir m'aider...

    Je dois créer une sorte d'applications grpahique, à base de C++ (sous Borland C++ 6), qui ressemblerait a une fontaine.

    J'ai crée une classe Particule, avec diverses méthodes et attributs, mais je ne vois pas comment je dois procéder pour faire apparaitre plusieurs jets d'eau successifs....

    Je suis malade, donc peut etre pas trop compréhensible, mais aidez moi s'il vous plait...Merci beaucoup à vous tous,j'espere que vous pourrez m'aider!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Je ne sais pas trop pour ta classe particule, mais moi je vois vaguement comment je ferais une anim de fontaine.
    Admettons que tout parte d'un même point, que toutes tes particules ont les mêmes caractéristiques (une ligne de 2 pixels de longueur et de 1 d'épaisseur par exemple) et qu'elles sont toutes projettées avec la même force. Toutes les 50 millisecondes je tire un angle au hasard et je projette une particule à partir du point avec cet angle et la force de réfèrence. La particule reste "en jeux" jusqu'à ce qu'elle soit tombée hors de la surface d'affichage.
    La petite partie difficile c'est qu'il faut dégoter une formule pour calculer une position dans un plan en prenant en compte la pesanteur, pour ça c'est pas à moi qu'il faut demander , mais ça doit bien se trouver, il y a nottament des faqs consacrées au maths des jv sur developpez.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Pour avoir programmé une simulation de "jet d'eau", je peux dire qu'il existe beaucoup d'autres paramètres.

    En fait, toutes les particules sont "tirées" (donc avec une vitesse initiale, pas de "force" ici) avec la même direction, mais pas du même endroit.
    On applique ensuite à chaque particule les forces ad-hoc:
    - Force d'attraction (g), la plus facile.
    - Force de friction de l'air (pour éviter d'avoir une parabole certe très jolie, mais pas du tout réaliste). A noter que la friction de l'air est plus importante pour les particules "isolées" (ce qui fait que le "bord" du jet d'eau tombe plus vite que le centre).
    - Force de répulsion entre les particules (air déplacé).
    - Force de tension de surface (qui annule entièrement la précédente si la particule est au milieu d'autres particules).
    - Force du vent ?

    La simulation en elle meme est simple (pseudo-code):
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    vector<Particule>   particules;
    while (simulationNotEnded) {
       float deltaT = ... ; // trouver le bon delta-T ici, éventuellement faire un 'sleep' c'est pas mal d'utiliser le deltaT de génération
       generationParticules(particules);
       accelerationParticules(particules);
       deplacement(particules,deltaT);
    }
     
    void generationParticules(vector<Particule>& particules)
    {
       // ajout de X particules répartis sur le disque de tir
       // avec vitesse initiale dans la direction du canon
    }
     
    void accelerationParticules(vector<Particule>& particules)
    {
       // a noter qu'ici "Force" est mal employé, vu qu'on se fiche de la masse des particules, 
       for each Particule p in particules {
          float surrounding = ; // calcul du pourcentage de particules "autour" 0= aucune, 1=partout
          p.force += g; // g vers le bas
          p.force -= p.vitesse * ... * surrounding; // friction de l'air
          for each Particule q in particules {
             if (q != p) {
                 p.force += (p.position - q.position) / distanceCarrée(p.position,q.position) * (1-surrounding);
             }
          }
       }
    }
     
    void deplacementParticules(vector<Particule>& particules, float deltaT)
    {
       for each Particule p in particules {
          float accel = p.force * deltaT;
          p.vitesse += accel ;
          p.position += (p.vitesse + accel * 0.5f)* deltaT; // ici on peut ne pas utiliser l'acceleration, mais je trouve que c'est mieux
          p.force = 0; // on réinitialise les force pour le round suivant
          // on supprime les particules "finies"
          if (p.position est 'out')
              particules.remove(p);
       }
    }
    Bien sur il faut optimiser, par exemple, conserver en harmonique sphérique la quantité de particules alentour (et ne la recalculer qu'apres les déplacement), ce qui évite la boucle en n² pour l'accumulation de forces, utiliser un tableau plutot qu'un vecteur (la construction destruction d'objet / allocation libération mémoire, est ce qu'il y a de plus cher dans une boucle), ce qui permet aussi au passage de s'assurer qu'on ne va pas générer trop de particules, avoir des particules de taille différente qui se scindent dès que la tension de surface n'est plus suffisante à les maintenir, ....

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    En 2d, en 3d ? Autres contraintes ?

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Élaboration de classe
    Par il_a_ri dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 16/01/2003, 14h22
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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