Thuật toán để tạo Edges và Vertexes hướng ra ngoài từ gốc với bội số tối đa là 3


11

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:

  1. 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)
  2. Các cạnh sẽ KHÔNG giao nhau.
  3. 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)
  4. Không có sao / điểm nên có bội số lớn hơn 3.
  5. 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à:

  1. 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.
  2. 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.
  3. 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:và v.v., rất nhiều ngôi sao ...


1
Một du khách của vũ trụ này có thể sẽ di chuyển theo một hướng, nghĩa là nếu bạn hết sao, bạn phải tạo ra các ngôi sao theo mọi hướng từ nguồn gốc. Nói cách khác, một người dùng nhàm chán có thể phá vỡ cơ sở dữ liệu của bạn. Bạn đã xem xét khả năng này (giả sử nó có thể là một vấn đề)?
Neil

2
Ngoài ra một suy nghĩ khác, vị trí của các ngôi sao không cần phải nhớ. Nếu bạn sử dụng một thế hệ sao có thể tái tạo, thì bạn có thể tạo ra những ngôi sao mà người dùng có thể nhìn thấy theo cách mà những ngôi sao đó sẽ được tạo ra theo cách tương tự trong tương lai. Có nghĩa là, cơ sở dữ liệu của bạn chỉ cần lưu thông tin về các ngôi sao. Vị trí của nó là bản sắc của nó.
Neil

1
Bạn sẽ làm gì nếu mỗi ngôi sao được tạo có chính xác là bội số của 3, vì vậy bước 1 sẽ thất bại? Bất kỳ lý do tại sao trong hình ảnh của bạn một điểm với bội số là 4, đó có phải là một lỗi không?
Doc Brown

1
Không. Nếu bạn có thể tạo ra các ngôi sao theo một cách có thể dự đoán được, thì sẽ như thể chúng luôn ở đó nếu bạn rời đi và sau đó quay trở lại. Nó chỉ là thuật toán và hạt giống không thay đổi.
Neil

2
@JF Xem No Man's Sky . Anh chàng thực sự tạo ra một vũ trụ. Anh ta chỉ lưu các hành tinh đã được người chơi ghé thăm, và các hành tinh hiện tại vẫn ở cùng một điểm. Tất cả dựa trên việc sử dụng hạt giống thích hợp được sử dụng để tạo số ngẫu nhiên.
Neil

Câu trả lời:


2

Gợi ý: Giữ cho mạng vũ trụ bên trong được sắp xếp hoàn hảo, thuật toán và tương đối đơn giản. Bạn chỉ cần vũ trụ trông ngẫu nhiên khi nó hiển thị trên màn hình người dùng . Chỉ áp dụng offset ngẫu nhiên cho các vị trí sao cho màn hình người dùng.

Vấn đề: Cách tiếp cận rõ ràng nhất của việc tính toán bù ngẫu nhiên cho mỗi ngôi sao sẽ không làm tốt công việc che giấu cấu trúc thực bên dưới. Bạn chỉ có thể chọn ngẫu nhiên các ngôi sao bằng một lượng nhỏ trước khi chúng có nguy cơ va chạm với nhau hoặc băng qua đường.

Giải pháp: Bạn có thể áp dụng các biến dạng ngẫu nhiên lớn và có được một vũ trụ trông ngẫu nhiên và thú vị hơn nhiều nếu bạn áp dụng sự ngẫu nhiên không cục bộ phối hợp. Hãy tưởng tượng việc đặt các ngôi sao trên một tấm cao su, và tưởng tượng việc kéo dài ngẫu nhiên và cắt xén các phần khác nhau của tấm. Điều đó có thể dịch chuyển toàn bộ các nhóm sao bằng một khoảng cách xa. Chúng sẽ không bao giờ va chạm hoặc giao nhau vì các ngôi sao gần đó kéo dài và squish trong mối quan hệ với nhau.

Cách thực hiện: Tra cứu máy phát điện địa hình fractal. Có rất nhiều mã miễn phí và mở cho nó. Bạn chỉ cần mã cơ bản tạo ra giá trị chiều cao cho mỗi điểm trên bản đồ. Chúng ta sẽ sử dụng nó theo một cách khác. Sử dụng mã đó để tạo bản đồ chiều cao địa hình độc lập TWO. Bắt đầu với vị trí X, Y thực của ngôi sao, nhìn vào vị trí đó trên mỗi bản đồ, sử dụng một giá trị bản đồ để bù vị trí hiển thị X của sao và sử dụng giá trị bản đồ khác để bù vị trí hiển thị Y của sao. Bạn sẽ phải chơi với một số yếu tố tỷ lệ, nhưng điều đó có thể mang lại cho bạn hiệu ứng tấm cao su bị vênh ngẫu nhiên. Các biến thể lớn ở vị trí sao sẽ ẩn hoàn toàn các vị trí được sắp xếp bên dưới. Bản chất fractal của tính ngẫu nhiên sẽ cho hiệu ứng trông rất tự nhiên,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.