Génération de coordonnées

Retour dans les étoiles de PlaceStar. Ou comment répartir des étoiles dans un univers selon un aléa qui semble plus naturel.

Vincent Roth

Architecte

Vincent Roth
Génération de coordonnées

22 oct. 2020

Dans le cadre de PlaceStar, nous avions générés des étoiles.

Pour ce faire nous avons utilisé un simple Math.random(), ce qui réparti uniformément nos étoiles dans l'univers.

// Une taille d'univers arbitraire
const universSize = 10000;
// Un tirage de coordonnée pour une étoile
// L'univers est considéré carré
const coordinates = {
    x: Math.trunc(Math.random() * universSize),
    y: Math.trunc(Math.random() * universSize)
};

Ceci garantit une densité statistiquement uniforme d'étoile. Autrement dit, où que l'on se place dans notre univers 2D, à peu près le même nombre d'étoiles sera visible sur l'écran.

Mais cela n'est pas très réaliste. Certes, cela reste mieux que d'avoir réparti équitablement les étoiles, espacées de la même distance selon les différents axes. Néanmoins il est possible de faire mieux et peut être plus naturel.

Dans la réalité, la gravité rassemble les étoiles en amas, en galaxie. Il y a plus d'étoiles au centre de l'amas que sur les bords. Avec la rotation de l'amas, les étoiles se placent aussi plutôt selon un disque. Cela est un constat rapide sans grande prétention qui montre tout de même une incohérence entre la réalité et notre répartition aléatoire uniforme.

Pour tendre vers cette réalité, plusieurs techniques d'aléas sont possibles.
De prime abord, nous avons pensé aux aléas de bruit, tel le bruit de Perlin.

Le bruit de Perlin retourne un gradient aléatoire pour une coordonnée donnée. Il a l'avantage de produire une suite pseudo-aléatoire avec une certaine continuité locale et est utilisé, par exemple, dans la génération de terrain 3D à partir d'un espace 2D ; l'altitude étant généré par ce bruit. Problème, nous n'avons pas encore de coordonnées pour une étoile et nous souhaitons un nombre déterminés d'étoiles, dans le cadre de PlaceStar plus de 1.6 millions (36 à la puissance 4), pas plus pas moins. Ici le bruit de Perlin ne nous permet pas de tirer directement des coordonnées, mais plutôt à partir de celle-ci d'obtenir un nombre aléatoire.

Revenons à la notion d'amas. Il s'agit d'un ensemble d'étoile dont la densité est plus forte au centre de l'amas. Existe-il un modèle de répartition aléatoire favorisant le centre plutôt que les bords ? Pour cela nous sommes revenus aux fonction de répartitions des modèles probabilistes. La loi normale correspond à la répartition que nous souhaitons approcher.

Pour un amas donné, nous pourrions tirer selon la loi normale, centrée sur le centre de l'amas, les coordonnées de l'étoile.
En JavaScript, le package random implémente plusieurs fonctions de répartitions et sera utilisé pour cet exemple.

// Initialisation de la loi normale avec le package random
// Mu 0.5 pour centrer à 50% de l'amas selon un axe
// Sigma 1, à faire varier pour modifier la densité de l'amas
const normalRoller = random.normal(0.5, 1)
// Taille de l'amas
const clusterSize = 1000;
// Un tirage de coordonnée pour une étoile selon une loi normale
// L'amas est considéré carré
const coordinates = {
    x: Math.trunc(normalRoller() * clusterSize),
    y: Math.trunc(normalRoller() * clusterSize)
};

Parfait, on approche de notre réalité. Reste à définir comment régler la variable sigma, cela dépend du nombre d'étoile, plus il y en a dans l'amas et plus statistiquement probable il sera d'en avoir une (et une seule) au bord de l'amas. Comme nous avons un nombre fini d'étoile, cela aussi dépend du nombres d'amas dans l'univers. Tire-t-on l'amas d'une étoile selon une répartition uniforme ou une autre répartition ?

Nous en arrivons à la question : À quoi ressemble l'univers selon nos paramètres ?

Ce qui nous a amené à réaliser une visualisation de notre univers généré.

Cela conclut ce billet sur la génération de coordonnées, néanmoins je vous propose de continuer dans le billet suivant sur la visualisation de notre univers, en 3D, car nous avons aussi ajouté une 3ème dimension à l'univers de PlaceStar.