Я створюю 2-грі для веб-сайту, де Всесвіт може зростати надзвичайно великим (в основному нескінченно великим). Спочатку Всесвіт складається з 6 зірок, що знаходяться на рівній відстані від походження (0, 0). Моє завдання - вміти генерувати більше зірок, які матимуть «доріжки» (краї), які з'єднуються між собою. Як я можу створити алгоритм, який відповідає цим обмеженням:
- Зірки випадковим чином породжуються назовні. (наприклад (x, y) координати для нових зірок повільно будуть виходити назовні від (0, 0) у всіх напрямках, бажано у спіральному форматі)
- Краї НЕ перетинаються.
- Хоча має бути певна дисперсія, нові зірки не повинні бути занадто далеко або занадто близько до інших зірок. (Наприклад, має бути мінімальний радіус)
- Жодна зірка / точка не повинна мати кратність більше 3.
- Зважаючи на те, що все це буде зберігатися в базі даних, алгоритм не може бути надто дорогим. Іншими словами, я хотів би досягти чогось із (n) складності (не знаю, чи це можливо).
По суті, те, за що я йду, - це спіралеподібна галактика, де зорі - точки на графіку, а подорож між зірками зображено ребрами між цими зірками.
Конкретні кроки, які мені потрібно вирішити:
- Випадково генерують точку в сусідній околиці інших зірок, які ще не мають кратності 3.
- Знайдіть першу зірку, яка ще не має кратності 3, яка не призведе до крайового конфлікту.
- Якщо зірка знаходиться на відстані мінімальної відстані x одиниць, тоді створіть між двома точками ребро.
Я намагався шукати рішення, але мої математичні навички (та знання з теорії графіків) потребують багато роботи. Також будь-які ресурси / посилання з цього питання були б вдячні.
Ось якийсь псевдо-код, про який я думав, але я не впевнений, чи це навіть спрацює, і я впевнений, що він не буде дуже добре після кількох 10000 зірок тощо.
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
Крім того, якщо хтось має поради щодо того, як я повинен зберігати це в базі даних MySQL, я також вдячний за це.
Нарешті, якщо вище нічого не має сенсу, я включив зображення того, що хотів би досягти нижче: