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 :

Créer un vecteur aléatoire


Sujet :

Algorithmes et structures de données

  1. #41
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Bonjour

    Je ne faisais que passer, et je dois dire que je n'ai pas tout compris
    (établir vraiment au hasard des vecteurs normés dans un cadre ?)

    mais je passais juste pour ceci
    Il faut faire attention avec les fonctions trigo c'est ce qui cosomme le plus de temps proc... Comme je l'ai déjà dis plus haut dans mon cas ça va servir très souvent. Si je commence à claquer 10000 sinus entre 2 frames juste pour générer mes vecteurs aléatoires, il n'y aura plus de temps pour faire le reste !!
    Une manière classique de s'affranchir du temps de calculs des opérations trigo, et de précalculer dans un tableau (plus ou moins grand selon la précision souhaitée) toutes les valeurs de sin et cos... C'était classique à l'époque des démo 3D temps réels avec des machines très peu puissantes (286,386...). La méthode est efficace mais limitée en précision/range des valeurs selon la taille des tableaux...

    voila, c'était juste pour ca
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  2. #42
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Pour essayer l'avoir une direction aléatoire j'avais procédé comme suit.
    étape 1
    répartir N points uniformément sur une sphère

    étape 2
    assimiler localement la sphère à son plan tangent autour de chacun de ce N points et utiliser la fonction ‘random’ pour une pondération aléatoire.

    Pour l'étape 1 j'ai utilisé un modèle physique: si on suppose N charges identiques contraintes sur une surface, l'équilibre est atteint si F est normal à la surface pour chacune des charges. Ici on peut laisser de coté la constante 1/4/pi/eps0 . Le vecteur Fi peut donc s’écrire

    Vecteur(Fi) = Somme(j <>i) Vecteur(Dij)/(dij^3) (a)
    et
    Fi vectoriel Ri = 0 pour équilibre de la charge ceci pour tout i ( minimum énergie potentielle du système )

    Un moindre carrés [par exemple minimiser la somme des carrés des normes de Fi vectoriel Ri ] permet en quelques cycles de converger ( distances aux + proches voisins stable à # 10^-10) . La position initiale des N charge à été faite sur un nombre x de parallèles ( au sens géographique ) où j’ai mis y(x) points afin que les distances entres points ne soient pas initialement trop distribuée. Ici un calcul très simple permet d’estimer le nombre de parallèles et le nombre de points par parallèle pour initialiser N points.

    L'étape 1 est "plutôt" longue mais peut être faite une seule fois. Autant que je me souvienne, j’avais pris 2048 points. Evidemment dans (a) il y a N-1 sommes. On peut aussi rendre le process + rapide en limitant aux x 1er voisins ( force en 1/d^2 décroît assez vite )

    A partir de ces N points créer N éléments de surface

    Un point aléatoire à alors été défini par
    1- choisir aléatoirement 1 des N éléments de surface. ( la probabilité de choisir une surface peut être proportionelle à sa surface qui varie un peu de l'une à l'autre )
    2- prendre ses m sommets
    3- pondérer aléatoirement ces m points
    4- projeter ce point sur la sphère ( ce qui crée une légère non uniformité, assimilation de la sphère à son plan tangent )
    Cette erreur reste faible. L’élément de surface est vu du centre avec un angle solide
    4Pi/N. le cône ‘moyen’ à donc une ouverture (angle au sommet * 2 ) vérifiant
    2pi*(1-cos(a/2)) = 4pi / N
    1-2/N = cos (a/2) # 1 – a^2/8 => a^2 = 16/N => a= 4/sqrt(N)

  3. #43
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    En 2D les coordonnées polaires résolvent le problème. En 3D aussi, je pense.
    je ferais comme Graffito, j'ai testé, voila ce que ca donne en 2D


    Vecteurs


    Ca m'a bien l'air uniforme, et je vois pas pourquoi ca changerai en 3D... ?

    Et question rapidité, l'algo est très simple, en 2D là

    Point1 = Random
    Angle = Random
    Point2.X = Norme * cos( Angle )
    Point2.Y = Norme * sin( Angle )
    ou alors, j'ai rien compris à la question, c'est possible aussi
    Etant donné que Cos et Sin peuvent être des tableaux et non des fonctions comme je l'ai cité, si on veut de la rapidité pure., donc très peu d'opérations élémentaires
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #44
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection.

  5. #45
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par FrancisSourd
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection.
    C'est le principe de "la balle de golf".

    Cette méthode est extrêmement performante sur un problème 'statique' (nombre de points sur la sphère qui ne variera pas).

    Elle nécessite, en revanche, un bon calcul de la répartition initiale de tous ces points : un bon maillage isotrope.

    L'avantage essentiel, en terme de performances, c'est que ce maillage peut même faire partie des données initiales du programme, il n'a pas besoin d'être calculé en direct.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  6. #46
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection
    C'est 1 peu ce que je préconisais en proposant un calcul par moindre carrés pour localiser ces N points.
    Je pense qu’il est tout de même préférable de limiter un peu ce nombre de points et d’assimiler la sphère à son plan tangent autour de ces N points puis de faire une pondération à partir des sommets de chacun des éléments de surface. Il s’agit là de trouver le meilleur compromis dans un cadre donné.

  7. #47
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par j.p.mignot
    C'est 1 peu ce que je préconisais en proposant un calcul par moindre carrés pour localiser ces N points.
    Je pense qu’il est tout de même préférable de limiter un peu ce nombre de points et d’assimiler la sphère à son plan tangent autour de ces N points puis de faire une pondération à partir des sommets de chacun des éléments de surface. Il s’agit là de trouver le meilleur compromis dans un cadre conné.
    Effectivement, j'avais pensé à cela pendant le week-end et j'ai tapé cette idée ce matin avant même de lire ce qui avait été écrit entre temps...

  8. #48
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Alors voila des petites images qui vont être plus parlantes que tout les discours :
    http://rafy.developpez.com/Croix
    A savoir qu'il y a toujours une concentration au centre, Car ce que vous voyez est disque que j'ai généré en partant d'une sphere (on prend une sphere et on l'écrabouille), mais j'ai une version ou je n'ai plus cette concentration au centre car je fais un choix aléatoire sur le rayon de manière non uniforme suivant de rayon, ainsi, j'ai un disque parfaitement uniforme...
    J'ai préfèré montrer le disque car la sphere on ne voyait pas très bien sur le screen shot... mais c'était le même problème.
    J'ai utilisé boost::uniform_on_sphere et triangle_distribution comme algorithme de génération (respectivement choix d'un vecteur et choix non uniforme) et comme générateur, après quelques test j'ai choisi le fibonacci607.
    Pourquoi celui la ?
    Ben car c'est parmi un des plus rapide, et son cycle est très grand (le 607 est le plus petit mais largement suffisant pour moi)
    Donc voila, Merci à tous pour vos réponses.
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  9. #49
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Super, je suis content pour toi

  10. #50
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Et encore une affaire de résolue
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 12
    Dernier message: 25/05/2007, 16h28
  2. Réponses: 2
    Dernier message: 06/04/2007, 11h30
  3. Réponses: 24
    Dernier message: 15/02/2007, 23h41
  4. créer un fchier aléatoire avec un nom unique
    Par hansaplast dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2006, 15h37
  5. Créer un password aléatoire
    Par finalfx dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/10/2006, 09h37

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