Sto creando un gioco 2D per un sito Web in cui l'universo può diventare estremamente grande (praticamente infinitamente grande). Inizialmente, l'universo è composto da 6 stelle a uguale distanza dall'origine (0, 0). Il mio compito è quello di essere in grado di generare più stelle che avranno "percorsi" (bordi) che si collegano tra loro. Come posso progettare un algoritmo che soddisfi queste restrizioni:
- Le stelle vengono generate casualmente verso l'esterno. (ad es. le coordinate (x, y) per le nuove stelle andranno lentamente verso l'esterno da (0, 0) in tutte le direzioni, preferibilmente in formato a spirale)
- I bordi NON attraverseranno.
- Sebbene ci dovrebbe essere una certa varianza, le nuove stelle non dovrebbero essere troppo lontane o troppo vicine ad altre stelle. (Ad esempio, deve esserci un raggio minimo)
- Nessuna stella / punto dovrebbe avere una molteplicità di più di 3.
- Dato che tutto questo sarà archiviato in un database, l'algoritmo non può essere troppo costoso. In altre parole, mi piacerebbe ottenere qualcosa di O (n) complessità (non so se questo è fattibile).
In sostanza, quello che sto cercando è una galassia dall'aspetto a spirale in cui le stelle sono punti sul grafico e il viaggio tra le stelle è rappresentato da bordi tra quelle stelle.
I passaggi particolari che devo risolvere sono:
- Generare casualmente un punto nelle vicinanze vicine di altre stelle che non hanno ancora una molteplicità di 3.
- Trova la prima stella che non ha ancora una molteplicità di 3 che non genererà conflitti ai bordi.
- Se la stella è a una distanza minima di x unità, crea un bordo tra i due punti.
Ho provato a cercare soluzioni, ma le mie capacità matematiche (e le mie conoscenze sulla teoria dei grafi) richiedono molto lavoro. Inoltre, qualsiasi risorsa / collegamento su questo argomento sarebbe molto apprezzato.
Ecco alcuni pseudo-codici a cui stavo pensando, ma non sono sicuro che funzionerebbe e sono sicuro che non funzionerebbe terribilmente dopo qualche 10.000 stelle ecc.
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
Inoltre, se qualcuno avesse qualche consiglio su come dovrei archiviarlo su un database MySQL, lo apprezzerei anche.
Infine, nel caso in cui nulla abbia senso sopra, ho incluso un'immagine di ciò che vorrei ottenere di seguito: