10
votes

Distribution aléatoire (Monte-Carlo) uniforme sur la sphère de l'unité

J'ai besoin d'une clarification avec l'algorithme générant des valeurs aléatoires pour mon Ray-traceur pour animaux de compagnie.
J'éprouve des rayons d'un point. Et j'ai le problème de la distribution de ces rayons: j'ai besoin de la distribution pour être uniforme, mais ce n'est pas ...

Le problème que je veux faire face maintenant est que la distribution étant uniforme initialement n'est pas uniforme après mes distorsions de l'espace des résultats.

Donc, par exemple, je génère des angles R et T si le système de coordonnées polaires. La distribution n'est pas uniforme et elle ne peut pas être uniforme: l'espace proche de chaque pôle a beaucoup plus de densité de résultats que, par exemple, près de l'équateur. La raison est assez claire: je convertit des points uniformément distribués de l'espace cylindrique au sphérique. Et je déforme les résultats. Le même problème est que si je normalise les points générés au hasard dans le cube.

Mon idée est maintenant ceci: je veux créer un tétraèdre, normaliser ses sommet, diviser chaque visage (triangle) avec le point au milieu, le normaliser et répéter récursivement jusqu'à ce que j'ai suffisamment de points. Ensuite, je "distorsure" ces points un peu. Ensuite, je les normalise à nouveau. C'est ça.

Je comprends que cette méthode n'est pas pure méthode mathématique MONTE-Carlo elle-même, car je n'utilise pas une distribution aléatoire dans aucune étape, à l'exception du dernier. Et je n'aime pas cette solution pour cette complexité.

Quelqu'un peut-il suggérer quelque chose de plus simple mais toujours

  • aléatoire
  • Uniforme
  • rapide
  • SIMPLE

    merci!

    edit:
    J'ai besoin d'une méthode rapide, pas seulement de la bonne. C'est pourquoi je demande à Monte-Carlo. Les réponses fournies sont correctes, mais pas rapidement. La méthode avec tétraèdre est rapide, mais pas très "aléatoire" => incorrecte.
    J'ai vraiment besoin de quelque chose de plus approprié.


0 commentaires

5 Réponses :


10
votes

voici un algorithme qui vous permet de générer des points distribués au hasard sur la sphère de l'unité.


1 commentaires

Les réponses de liaison seules sont découragées



2
votes

pour une sections sphériques génère votre angle uniformément dans phi (l'angle polaire) et cos (theta) (pour thêta l'angle azimutal) entre vos limites.

Dans pseudo code: xxx

Il s'agit d'un cas particulier de la règle qui dit inverti le jacobien et générer uniformément dans cet espace de ces coordonnées .

Remarque: Notez que j'utilise la convention opposée pour PHI et thêta de David Norman Line.

Remarque également: Ce n'est pas la méthode la plus rapide, mais plutôt celle qui illustre le principe général.


0 commentaires

2
votes

Sauf si vous ne rayonnez que des scènes triviales, votre temps de rendu sera-t-il vraiment dominé par l'échantillon de temps de sélection? Sinon, il ne vaut probablement pas la peine d'être optimisé, même s'il vaut la peine de lire et de comprendre les techniques d'échantillonnage uniforme données dans les autres réponses.

En outre, vos échantillons ne doivent pas nécessairement être très aléatoires pour produire une bonne estimation de la fonction que vous échantillonnez. Vous voudrez peut-être étudier à l'aide d'une séquence numéro de quasiRandom, telle que le Séquence Halton . Votre idée de subdivision de tétraédron n'est pas mauvaise. Il devrait aboutir à de beaux points bien distribués qui devraient être meilleurs que les échantillons de pseudo-pseudorandom uniformes pour la plupart des scènes, bien que cela puisse entraîner des artefacts horribles dans certaines circonstances.

Quoi qu'il en soit, vous devriez vraiment consulter les forums à ompf.org. Vous avez des nerds de rayonnage super hardcore là-bas.


0 commentaires

5
votes

Voici une implémentation Java que j'ai utilisée dans le passé: xxx


1 commentaires

@Douglaszare si d2 puis 1.0 / d2 peut déborder