Je crée un jeu 2D pour un site Web où l'univers peut devenir extrêmement grand (essentiellement infiniment grand). Initialement, l'univers est composé de 6 étoiles qui sont à égale distance de l'origine (0, 0). Ma tâche est de pouvoir générer plus d'étoiles qui auront des "chemins" (bords) qui se connecteront les uns aux autres. Comment puis-je concevoir un algorithme qui respecte ces restrictions:
- Les étoiles sont générées au hasard vers l'extérieur. (par exemple, les coordonnées (x, y) pour les nouvelles étoiles sortiront lentement de (0, 0) dans toutes les directions, de préférence en format spirale)
- Les bords ne se croiseront PAS.
- Bien qu'il devrait y avoir une certaine variance, les nouvelles étoiles ne devraient pas être trop éloignées ou trop proches des autres étoiles. (Par exemple, il doit y avoir un rayon minimum)
- Aucune étoile / point ne doit avoir une multiplicité supérieure à 3.
- Étant donné que tout cela sera stocké dans une base de données, l'algorithme ne peut pas être trop coûteux. En d'autres termes, j'aimerais réaliser quelque chose de complexité O (n) (je ne sais pas si c'est faisable).
Essentiellement, ce que je veux, c'est une galaxie en spirale où les étoiles sont des points sur le graphique et le voyage entre les étoiles est représenté par les bords entre ces étoiles.
Les étapes particulières que je dois résoudre sont les suivantes:
- Génère aléatoirement un point dans le voisinage voisin d'autres étoiles qui n'ont pas encore une multiplicité de 3.
- Trouvez la première étoile qui n'a pas encore une multiplicité de 3 qui ne générera pas de conflit de bord.
- Si l'étoile est à une distance minimale de x unités, créez un bord entre les deux points.
J'ai essayé de chercher des solutions, mais mes compétences en mathématiques (et mes connaissances sur la théorie des graphes) nécessitent beaucoup de travail. De plus, toute ressource / lien sur ce sujet serait grandement apprécié.
Voici un pseudo-code auquel je pensais, mais je ne sais pas si cela fonctionnerait même et je suis sûr qu'il ne fonctionnerait pas terriblement bien après quelques 10 000, etc. étoiles.
newStar = randomly generated (x, y) within radius of last star from origin
while(newStar has not been connected):
for (star in the known universe):
if(distance between newStar and star > x units):
if(star has < 3 multiplicity):
if(path from newStar to star does not intersect another path):
connect the star to the other star
break;
newStar = new random (x, y) coordinate
De plus, si quelqu'un a des conseils sur la façon de stocker cela sur une base de données MySQL, je l'apprécierais également.
Enfin, au cas où rien n'aurait de sens ci-dessus, j'ai inclus une image de ce que j'aimerais réaliser ci-dessous: