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

Langage Java Discussion :

"Vent" aléatoire dans simulation voile en JAVA


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut "Vent" aléatoire dans simulation voile en JAVA
    Bonjours à tous!

    Voici ma question:
    J'ai créer une animation de voile dans laquelle la direction de vent est donnée par un 'trait' se finissant par une flèche. Pour donner un peu de réalisme à l'animation, j'aimerais créer un vent qui pourrait changer légèrement de direction (on va dire de + 8° et de - 8°) et de force (trait augmente de +/- 12 pixels). J'ai pensé à un thread et a Math.random, mais j'aurais besoin d'aide pour quelque chose de concret.

    NB: enfait il faut que je redefinisse les coordonnées de l'extrêmité du "trait" (lx,ly), les coordonées du début du "trait" ne changeant pas...!

    Merci d'avance,

    Pat-trix

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Pour avoir une valeur aléatoire entre 0 et 1 (suivant une loi uniforme), tu fais Math.random();. Pour l'avoir entre -8 et +8 (en dégres), et bien tu multiplies par 16 et tu enlèves 8.

    Si tu veux plus de réalisme (petit a parte mathématique):
    Pour que ça soit plus "réalise", il vaut mieux utiliser une loi normale plutôt qu'une loi uniforme (plus de chances d'être dans la moyenne). Pour cela, tu te rappelles du théorème centrale limite, qui te dit que la somme d'évènements indépendants et identiquements distribués tend vers une loi normale lorsque le nombre d'évènements tend vers l'infini (l'infini pouvant être petit -ça marche pour des n pas si grand que ça-).
    Donc supponsons qu'on veuille obtenir une distribution de loi normale de moyenne 0 et de variance... disons 15 (pour se trouver souvent entre -8 et +8 : en réalité, la probabilité d'être entre -8 et +8 est de 96,06% avec cette variance).
    Après quelques calculs (à vérifier d'ailleurs), avec n = 10 (ça suffit pr ce que tu veux faire), en gros tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final int N = 10;
    double somme = 0;
    // on fait la somme de 10 v.a. uniformes iid sur [0;1]
    for(int i = 0; i < N; i++)
        somme += Math.random();
    double resultat = 14 * somme - 7 * N;
    Et voilà, "resultat" suit une loi normale qui devrait te convenir...


    Bon ça c'était pour l'a parte, ensuite, il faut que tu fasse une rotation de ton vecteur de la valeur cet angle... Pour cela, il te suffit de multiplier à gauche ton vecteur par la matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cos(a)  -sin(a)
    sin(a)  cos(a)
    autrement dit, pour ton vecteur (x,y):
    x' = x cos(a) - y sin(a)
    y' = x sin(a) + y cos(a)
    Tu ajoutes ce vecteur (x',y') au point d'origine du vecteur et tu as le point "destination" du vecteur...

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ah et j'oubliais, une fois que tu as obtenu une nouvelle directection aléatoire, par interpolation, fait tourner ta flèche en animation, car sinon ça fera un changement brut de direction...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse Rom!

    Enfait, pour commencer je vais essayer de faire varier mon vecteur avec Math.random *16 -8, pour voir si le concept marche. Pourtant, en utilisant la matrice je n'obtiens aucun résultat, voici le code écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    int resultat //en radians
                    resultat=(int)((((Math.random()*16)-8))*Math.PI/180);
     
                     //Nouveau vecteur (lx et ly sont les extremités du vecteur)
                     lx=(int)(lx*Math.cos(resultat)-ly*Math.sin(resultat));
                     ly=(int)(lx*Math.sin(resultat)+ly*Math.cos(resultat));
    Le vecteur ne bouge pas du tout; Sinon, tu as raison, je dvrais utiliser une animation, mais je ne sais vraiment pas comment faire ?!

    Merci d'avance !
    PAt-trix

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    Merci pour ta réponse Rom!

    Enfait, pour commencer je vais essayer de faire varier mon vecteur avec Math.random *16 -8, pour voir si le concept marche. Pourtant, en utilisant la matrice je n'obtiens aucun résultat, voici le code écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    int resultat //en radians
                    resultat=(int)((((Math.random()*16)-8))*Math.PI/180);
     
                     //Nouveau vecteur (lx et ly sont les extremités du vecteur)
                     lx=(int)(lx*Math.cos(resultat)-ly*Math.sin(resultat));
                     ly=(int)(lx*Math.sin(resultat)+ly*Math.cos(resultat));
    Le vecteur ne bouge pas du tout; Sinon, tu as raison, je dvrais utiliser une animation, mais je ne sais vraiment pas comment faire ?!

    Merci d'avance !
    PAt-trix
    C'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat=(int)((((Math.random()*16)-8))*Math.PI/180);
    Le résultat en double est entre 0 et 1, si tu le castes en int, ça fait 0...

    Mais bon, c'est de ma faute, sur mon exemple, j'avais mit "int resultat", j'ai corrigé, mais il faut bien sûr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double degrees = Math.random() * 16 - 8;
    double resultat = Math.toRadians(degrees);

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour l'animation c'est simple tu vas graduellement changer la direction de ton vent entre sa direction d'origine et celle de destintation :
    • tu calcule l'angle le plus court pour atteindre ta nouvelle position
    • puis tu vas ajouter/retrancher (tout dépend de si l'angle de rotation est inférieur ou supérieur à Pi) un petit montant sur l'angle actuel toutes les x millisecondes (genre du Pi/64 ou plus si tu as besoin de plus de fluidité).
    • et ce tant que tu n'as pas rejoint un certain delta autour de la direction voulue
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Désolé, je n'ai pas été futé pour le int Math.random...!

    Alors maintenant, en effet le vecteur se déplace de manière aléatoire, mais au bout de quelques seconde, et de manière progressive, lx et ly rejoignent (0,0) et mon vecteur est un point...?

    Merci en ce qui concerne le côté animation, je pense pouvoir réaliser cela...

    Merci encore,

    PAt-trix

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    Alors maintenant, en effet le vecteur se déplace de manière aléatoire, mais au bout de quelques seconde, et de manière progressive, lx et ly rejoignent (0,0) et mon vecteur est un point...?
    Cette matrice de rotation doit marcher pour les vecteurs de norme 1. Donc multiplie à chaque fois x' et y' par la norme du vecteur (Math.sqrt(x*x+y*y)).

    EDIT: Euh, non, normalement la norme reste bonne...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Héy!

    Bah ça marche toujours pas, le "vecteur" vent diminue toujours jusqu'à devenir un point.
    Voici le code, 'lx' et 'ly' étant les extremités de la 'g2d.drawline' et 'resultat' l'angle changeant aléatoirement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       lx=(int)(lx*Math.cos(resultat)-ly*Math.sin(resultat));
       ly=(int)(lx*Math.sin(resultat)+ly*Math.cos(resultat));
    Je ne comprend pas pourquoi cela ne marche pas...!

    Merci d'avance,

    Patrick

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    Héy!

    Bah ça marche toujours pas, le "vecteur" vent diminue toujours jusqu'à devenir un point.
    Voici le code, 'lx' et 'ly' étant les extremités de la 'g2d.drawline' et 'resultat' l'angle changeant aléatoirement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       lx=(int)(lx*Math.cos(resultat)-ly*Math.sin(resultat));
       ly=(int)(lx*Math.sin(resultat)+ly*Math.cos(resultat));
    Je ne comprend pas pourquoi cela ne marche pas...!

    Merci d'avance,

    Patrick
    Mais pourquoi tu castes en int?
    C'est ton int qui arrondi par défaut, et donc diminue le résultat...
    Tes coordonnées doivent être en double...

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par sinok
    Pour l'animation c'est simple tu vas graduellement changer la direction de ton vent entre sa direction d'origine et celle de destintation :
    Et son intensite egalement.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu as réussi ?

  13. #13
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par ®om
    Si tu veux plus de réalisme (petit a parte mathématique):
    Pour que ça soit plus "réalise", il vaut mieux utiliser une loi normale plutôt qu'une loi uniforme (plus de chances d'être dans la moyenne). Pour cela, tu te rappelles du théorème centrale limite, qui te dit que la somme d'évènements indépendants et identiquements distribués tend vers une loi normale lorsque le nombre d'évènements tend vers l'infini (l'infini pouvant être petit -ça marche pour des n pas si grand que ça-).
    Donc supponsons qu'on veuille obtenir une distribution de loi normale de moyenne 0 et de variance... disons 15 (pour se trouver souvent entre -8 et +8 : en réalité, la probabilité d'être entre -8 et +8 est de 96,06% avec cette variance).
    Après quelques calculs (à vérifier d'ailleurs), avec n = 10 (ça suffit pr ce que tu veux faire), en gros tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final int N = 10;
    double somme = 0;
    // on fait la somme de 10 v.a. uniformes iid sur [0;1]
    for(int i = 0; i < N; i++)
        somme += Math.random();
    double resultat = 14 * somme - 7 * N;
    Et voilà, "resultat" suit une loi normale qui devrait te convenir...
    Oulà, je me suis bien galéré, je viens d'aller voir la classe Random pour faire autre chose, et j'ai vu qu'il y avait un nextGaussian()... Voilà, donc il suffit d'appeler nextGaussian()

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