Tôi đang tạo ra một trò chơi 2d cho một trang web nơi vũ trụ có thể phát triển cực kỳ lớn (về cơ bản là vô cùng lớn). Ban đầu, vũ trụ gồm có 6 ngôi sao có khoảng cách bằng nhau so với điểm gốc (0, 0). Nhiệm vụ của tôi là có thể tạo ra nhiều ngôi sao sẽ có "đường dẫn" (các cạnh) kết nối với nhau. Làm cách nào tôi có thể thiết kế một thuật toán đáp ứng các hạn chế này:
- Các ngôi sao được tạo ngẫu nhiên ra bên ngoài. (ví dụ (tọa độ (x, y) cho các ngôi sao mới sẽ từ từ đi ra ngoài từ (0, 0) theo mọi hướng, tốt nhất là ở định dạng xoắn ốc)
- Các cạnh sẽ KHÔNG giao nhau.
- Mặc dù cần có một số phương sai, các ngôi sao mới không nên quá xa hoặc quá gần với các ngôi sao khác. (Ví dụ: phải có bán kính tối thiểu)
- Không có sao / điểm nên có bội số lớn hơn 3.
- Vì tất cả những thứ này sẽ được lưu trữ trong Cơ sở dữ liệu, thuật toán có thể quá tốn kém. Nói cách khác, tôi rất muốn đạt được điều gì đó phức tạp O (n) (tôi không biết điều này có khả thi hay không).
Về cơ bản, những gì tôi sẽ làm là một thiên hà trông có hình xoắn ốc trong đó các ngôi sao là các điểm trên biểu đồ và sự di chuyển giữa các ngôi sao được mô tả bởi các cạnh giữa các ngôi sao đó.
Các bước cụ thể tôi cần giải quyết là:
- Tạo ngẫu nhiên một điểm trong vùng lân cận của các ngôi sao khác chưa có bội số là 3.
- Tìm ngôi sao đầu tiên chưa có bội số 3 sẽ không tạo ra xung đột cạnh.
- Nếu ngôi sao có khoảng cách tối thiểu là x đơn vị thì hãy tạo một cạnh giữa hai điểm.
Tôi đã cố gắng tìm kiếm các giải pháp, nhưng các kỹ năng toán học của tôi (và kiến thức về Lý thuyết đồ thị) cần rất nhiều công việc. Ngoài ra, bất kỳ tài nguyên / liên kết về vấn đề này sẽ được đánh giá rất cao.
Đây là một số mã giả mà tôi đã nghĩ đến, nhưng tôi không chắc liệu nó có hoạt động hay không và tôi chắc chắn rằng nó sẽ không hoạt động tốt sau vài 10.000, v.v.
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
Ngoài ra, nếu bất cứ ai có bất kỳ lời khuyên nào về cách tôi nên lưu trữ dữ liệu này trên cơ sở dữ liệu MySQL, tôi cũng sẽ đánh giá cao điều đó.
Cuối cùng, trong trường hợp không có ý nghĩa gì ở trên, tôi đã đưa vào một hình ảnh về những gì tôi muốn đạt được dưới đây: