Ben evrenin son derece büyük (temelde sonsuz büyük) büyüyebileceği bir web sitesi için 2d oyun yaratıyorum. Başlangıçta, evren, başlangıç noktasına eşit mesafe olan 6 yıldızdan oluşur (0, 0). Benim görevim, birbirine bağlanan “yollar” (kenarlar) olacak daha fazla yıldız üretebilmek. Bu kısıtlamaları karşılayan bir algoritmayı nasıl tasarlayabilirim:
- Yıldızlar rastgele dışarı doğru üretilir. (örneğin, yeni yıldızlar için (x, y) koordinatları yavaşça (0, 0) 'dan yavaşça tüm yönlere, tercihen spiral biçimde dışarı çıkacaktır)
- Kenarlar geçmeyecektir.
- Bir miktar farklılık olsa da, yeni yıldızlar diğer yıldızlara çok uzak veya çok yakın olmamalıdır. (Örneğin minimum bir yarıçap olmalıdır)
- Hiçbir yıldızın / noktanın çokluğu 3'ten fazla olmamalıdır.
- Tüm bunların bir Veritabanında saklanacağı göz önüne alındığında, algoritma çok pahalıya mal olamaz. Başka bir deyişle, O (n) karmaşıklığı elde etmek isterim (bunun mümkün olup olmadığını bilmiyorum).
Esasen, yıldızların grafikte noktalar olduğu ve yıldızlar arasındaki seyahatin bu yıldızlar arasındaki kenarlarla gösterildiği spiral görünümlü bir galaksidir.
Çözmem gereken belirli adımlar:
- Rastgele diğer 3 yıldızların komşu çevresinde henüz çokluğu 3 olmayan bir nokta oluşturun.
- Henüz kenar çatışması oluşturmayacak 3 çokluğuna sahip olmayan ilk yıldızı bulun.
- Yıldız x birimlik uzaklığa en az uzaksa, iki nokta arasında bir kenar oluşturun.
Çözüm aramaya çalıştım, ancak matematik becerilerimin (ve Grafik Teorisi hakkındaki bilgimin) çok fazla çalışmaya ihtiyacı var. Ayrıca, bu konuyla ilgili herhangi bir kaynak / bağlantı çok takdir edilecektir.
İşte düşündüğüm bazı sözde kod, ama bu bile işe yarayacağından emin değilim ve birkaç 10.000 vb yıldızdan sonra çok iyi performans göstermeyeceğinden eminim.
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
Ayrıca, kimse nasıl bir MySQL veritabanında bu saklamak gerekir hakkında herhangi bir tavsiye varsa, ben de takdir ediyorum.
Son olarak, yukarıda hiçbir şeyin mantıklı olmaması durumunda, aşağıda elde etmek istediklerimin bir görüntüsünü ekledim: