Algoritmo per generare bordi e vertici verso l'esterno dall'origine con una molteplicità massima di 3


11

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:

  1. 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)
  2. I bordi NON attraverseranno.
  3. 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)
  4. Nessuna stella / punto dovrebbe avere una molteplicità di più di 3.
  5. 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:

  1. Generare casualmente un punto nelle vicinanze vicine di altre stelle che non hanno ancora una molteplicità di 3.
  2. Trova la prima stella che non ha ancora una molteplicità di 3 che non genererà conflitti ai bordi.
  3. 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:e così via, molte stelle ...


1
Un viaggiatore di questo universo si muoverà probabilmente in una direzione, il che significa che se finisci le stelle, dovresti generare stelle in tutte le direzioni dall'origine. Un utente annoiato potrebbe rompere il database, in altre parole. Hai preso in considerazione questa possibilità (supponendo che possa essere un problema)?
Neil,

2
Anche un altro pensiero, non è necessario ricordare la posizione delle stelle. Se si utilizza una generazione riproducibile di stelle, è possibile generare le stelle che l'utente potrebbe vedere in modo tale che tali stelle vengano generate allo stesso modo in futuro. Significato, il tuo database deve solo salvare informazioni su stelle. La sua posizione è la sua identità.
Neil,

1
Cosa farai se ogni stella generata ha esattamente una molteplicità di 3, quindi il passaggio 1 fallirà? Qual è il motivo per cui nella tua foto è un punto con una molteplicità di 4, è un errore?
Doc Brown,

1
No. Se riesci a generare stelle in modo prevedibile, sarà come se fossero sempre state lì se parti e poi ritorni. Sono solo l'algoritmo e il seme che non cambiano.
Neil,

2
@JF Vedi No Man's Sky . Il ragazzo genera letteralmente un universo. Salva solo i pianeti che sono stati visitati dai giocatori, eppure i pianeti esistenti rimangono nei loro stessi rispettivi punti. Tutto si basa sull'utilizzo del seme appropriato utilizzato per generare numeri casuali.
Neil,

Risposte:


2

Suggerimento: mantenere la rete dell'universo interno perfettamente ordinata, algoritmica e relativamente semplice. Hai solo bisogno che l'universo appaia casuale quando viene visualizzato sullo schermo dell'utente . Applica solo offset casuali alle posizioni delle stelle per la visualizzazione dell'utente.

Problema: l'approccio più ovvio per calcolare un offset casuale per ogni stella non farà un ottimo lavoro nel nascondere la struttura reale sottostante. Puoi randomizzare le stelle solo di una piccola quantità prima che rischino di scontrarsi o attraversare percorsi.

Soluzione: è possibile applicare grandi distorsioni casuali e ottenere un universo dall'aspetto molto più casuale e interessante se si applica casualità non locale coordinata. Immagina di posizionare le stelle su un foglio di gomma e immagina di allungare e schiacciare casualmente diverse parti del foglio. Ciò può spostare interi gruppi di stelle da una lunga distanza. Non si scontreranno o attraverseranno mai perché le stelle vicine si allungano e si schiacciano l'una rispetto all'altra.

Come farlo: cerca i generatori di terreno frattale. C'è un sacco di codice gratuito e aperto per questo. È necessario solo il codice di base che genera un valore di altezza per ciascun punto su una mappa. Lo useremo in un modo diverso. Usa quel codice per generare DUE mappe altezza-terreno indipendenti. Inizia con la vera posizione X, Y della stella, osserva quella posizione su ciascuna mappa, usa un valore della mappa per compensare la posizione di visualizzazione X della stella e usa l'altro valore della mappa per compensare la posizione di visualizzazione Y della stella. Dovrai giocare con alcuni dei fattori di ridimensionamento, ma ciò può darti l'effetto del foglio di gomma deformato casualmente. Le grandi variazioni nella posizione della stella dovrebbero nascondere completamente le posizioni ordinate sottostanti. La natura frattale della casualità darà un effetto molto naturale,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.