Tworzę grę 2D na stronę internetową, na której wszechświat może stać się bardzo duży (w zasadzie nieskończenie duży). Początkowo wszechświat składa się z 6 gwiazd, które są w równej odległości od początku (0, 0). Moim zadaniem jest generowanie większej liczby gwiazd, które będą miały „ścieżki” (krawędzie), które się ze sobą połączą. Jak zaprojektować algorytm, który spełnia te ograniczenia:
- Gwiazdy są losowo generowane na zewnątrz. (np. współrzędne (x, y) nowych gwiazd będą powoli wychodzić na zewnątrz od (0, 0) we wszystkich kierunkach, najlepiej w formacie spiralnym)
- Krawędzie NIE przekroczą.
- Chociaż powinna istnieć pewna wariancja, nowe gwiazdy nie powinny znajdować się zbyt daleko lub zbyt blisko innych gwiazd. (Np. Musi być minimalny promień)
- Żadna gwiazda / punkt nie powinna mieć krotności większej niż 3.
- Biorąc pod uwagę, że wszystko to będzie przechowywane w bazie danych, algorytm nie może być zbyt kosztowny. Innymi słowy, chciałbym osiągnąć coś o złożoności O (n) (nie wiem, czy jest to wykonalne).
Zasadniczo chodzi o galaktykę o spirali, w której gwiazdy są punktami na wykresie, a podróż między gwiazdami jest przedstawiona za pomocą krawędzi między tymi gwiazdami.
Konkretne kroki, które muszę rozwiązać, to:
- Generuj losowo punkt w sąsiedztwie innych gwiazd, które nie mają jeszcze wielokrotności 3.
- Znajdź pierwszą gwiazdę, która nie ma jeszcze wielokrotności 3, która nie spowoduje konfliktu krawędzi.
- Jeśli gwiazda znajduje się w odległości co najmniej x jednostek, stwórz krawędź między dwoma punktami.
Próbowałem szukać rozwiązań, ale moje umiejętności matematyczne (i wiedza na temat teorii grafów) wymagają dużo pracy. Również wszelkie zasoby / linki w tej sprawie byłyby bardzo mile widziane.
Oto kilka pseudo-kodów, o których myślałem, ale nie jestem pewien, czy to w ogóle zadziałałoby i jestem pewien, że nie działałoby to zbyt dobrze po kilku 10.000 gwiazdkach itp.
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
Ponadto, jeśli ktoś ma jakieś porady na temat tego, jak powinienem przechowywać to w bazie danych MySQL, byłbym wdzięczny.
Na koniec, jeśli nic nie ma sensu powyżej, zamieściłem poniżej obraz tego, co chciałbym osiągnąć: