Tạo các vùng bằng nhau trong bản đồ hex


13

Lấy ví dụ một bản đồ lục giác lớn (X by Y), làm cách nào tôi có thể chia nó thành N vùng của các hình lục giác được kết nối để mô phỏng các quốc gia?

Mục tiêu là tạo ra một bản đồ hex trông giống như một bản đồ ngoài đời thực với các quốc gia có hình dạng khác nhau nhưng kích thước bằng nhau.

Câu trả lời:


13

Bạn đã thử thuật toán của Lloyd chưa? Quy trình này khá đơn giản và sẽ tạo ra các vùng tìm kiếm khá đều đặn (tùy thuộc vào số lần lặp bạn chạy).

  1. Ngói bản đồ với các hình lục giác trống để bắt đầu.
  2. Chọn N hexes ngẫu nhiên. Chúng sẽ đại diện cho "trung tâm đại chúng" cho mỗi quốc gia.
  3. Gắn thẻ cho mỗi hex với hex hex trung tâm gần nhất với ( Biểu đồ Voronoi ). Đất nước tôi là tập hợp của tất cả các hexes gần nhất với i'th hex trung tâm.
  4. Tính toán trung tâm mới của đại chúng cho mỗi quốc gia.
  5. Lặp lại các bước 3 và 4 nhiều lần bạn muốn làm mịn các vùng được tạo.

Bạn không cần phải chạy quá lâu để tạo ra một bản đồ đẹp mắt. Ví dụ này chỉ yêu cầu ba lần lặp.


Rất đẹp và +1 để có một ví dụ đặc biệt, nhưng tôi hơi lo lắng rằng đây là một chút quá thường xuyên! Điều đó nói rằng, kết quả thực sự trông tuyệt vời đặc biệt ở quy mô đó, và đó cũng là một cách tuyệt vời để gieo các phương pháp khác.
Steven Stadnicki

1
Ví dụ của tôi được lấy cảm hứng từ một bài đăng trên blog về việc tạo bản đồ đa giác . Tác giả đã thêm một số nhiễu vào các cạnh của từng khu vực để tạo ra một cái nhìn lởm chởm hơn (cuộn xuống phía dưới để xem nó). Bạn cần sử dụng nhiều hình lục giác hơn tôi đã làm để biến nó thành một lựa chọn khả thi, nhưng chắc chắn là có thể thực hiện được.
Michael Kristofik

3

Một cách đơn giản bạn có thể thử.

  1. Chọn ngẫu nhiên các hình nlục giác. Mỗi người sẽ bắt đầu một nhóm.
  2. Đối với mỗi nhóm cố gắng mở rộng hex ban đầu theo hướng ngẫu nhiên.
  3. Nếu tất cả các hình lục giác xung quanh hình lục giác đã chọn bị chiếm đóng, hãy đánh dấu là đã gõ, thay đổi hình lục giác.
  4. Lặp lại cho đến khi mỗi nhóm dài 20 hex hoặc không còn khoảng trống để mở rộng (tất cả các hex được gõ).

Tôi đã không kiểm tra nhưng điều này sẽ tạo ra Quần đảo và phần nào tránh được niềng răng mỏng dài. Ngoài ra, rất có thể sẽ có biên giới láng giềng nhưng không nhất thiết mỗi người sẽ liên lạc với nhau, mật độ đó sẽ phụ thuộc vào giá trị của n.
Một số nhóm cũng có thể bị những người khác dồn vào chân tường và đạt kích thước nhỏ hơn 20, bạn có thể đảm bảo không gian phát triển bằng cách sinh ra các hình lục giác bắt đầu ở khoảng cách tối thiểu với nhau.
Kiểm tra và chỉnh sửa khi cần thiết.


Ngoài ra, không liên quan đến vấn đề này nhưng rất, rất hữu ích khi làm việc với các hình lục giác, hãy truy cập trang này: http://www.redblobgames.com/grids/hexagons/#basics
Nó tổng hợp một loạt thông tin hex ở một nơi duy nhất với một hình ảnh đẹp.


Có lẽ nên bao gồm một thợ máy cho nhóm A để cung cấp các nút cho nhóm B, nếu nhóm B giáp nhóm A và không có nơi nào khác để đi. Miễn là nhóm A có không gian trống để mở rộng để thay thế các nút bị mất. Sau đó, không quan trọng họ bắt đầu từ đâu. Vì hành động này giống như một "sự rút lui".
MichaelHouse

Tôi nghĩ có thể bắt đầu một quốc gia tại một thời điểm, hình thành các nhóm góc đầu tiên, sau đó các cạnh sẽ cung cấp những gì tôi muốn. Tôi sẽ thử nó khi tôi về nhà.
MadCatPT

@ Byte56 Vâng, tôi thực sự đã nghĩ về một cái gì đó như thế này một chút trong bữa trưa của tôi. Nếu nhóm bị dồn vào chân tường không có nơi nào để phát triển, nó chỉ cần lấy một hình lục giác của một nhóm khác và để nhóm đó tìm một khoảng trống ở lần lặp tiếp theo. Nó nên có một số biện pháp bảo vệ để tránh 2 nhóm bị dồn vào đường cùng để bắt nạt nhau vô cùng.
petervaz

Các quốc gia thực sự thường có ranh giới trên sông hoặc núi. Khi bạn mở rộng theo hướng ngẫu nhiên, bạn có thể thử giảm xác suất mở rộng nếu hình lục giác tiếp theo nằm ở phía bên kia của một con sông hoặc một sườn núi.
amitp

@amitp Nếu OP đang mong đợi những yếu tố đó được hạch toán thì có lẽ anh ta đã đề cập đến chúng. Tôi không giả sử, chỉ làm việc bên trong các tiền đề ban đầu.
petervaz

2

Tôi chắc chắn nghĩ rằng một số loại cấu trúc đồ thị sẽ làm điều này có thể. Về cơ bản tạo một cạnh giữa hai nút Hex nếu chúng nằm cạnh nhau để mô phỏng toàn bộ bản đồ. Tuy nhiên, tôi không chắc thuật toán chính xác để tạo một "quốc gia" trong bản đồ đó. Vấn đề là, tùy thuộc vào cách bạn muốn quốc gia "nhìn", bạn sẽ cần các thuật toán khác nhau.

Ngoài đỉnh đầu, tôi khuyên bạn nên chọn một điểm và di chuyển ra ngoài từ đó, chọn một ô ngẫu nhiên trong "quốc gia đang phát triển" có một ô liền kề không phải là một phần của quốc gia.

Một mô hình chiến lược có thể được sử dụng để tắt các thuật toán tùy thuộc vào loại quốc gia bạn muốn. http://en.wikipedia.org/wiki/Strargety_potype tức là bạn có muốn một đất nước bờ biển mỏng như chile không? Hay bạn muốn một cái gì đó tròn hơn và chứa đựng?

Thuộc tính đồ thị cũng có thể cho phép bạn điều chỉnh những gì bạn muốn "quốc gia" cuối cùng trông như thế nào: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)

Muốn có một đất nước rộng lớn? Tinh chỉnh các thuộc tính biểu đồ và buộc quốc gia được tạo (chỉ là biểu đồ) có các thuộc tính cung cấp cho nó "giao diện" mà bạn muốn.

Cuối cùng nhưng không kém phần quan trọng, Đồ thị cũng sẽ rất hữu ích để xác định biên giới giữa các quốc gia. Bạn có thể xây dựng một biểu đồ có kết nối giữa hai nút nếu các quốc gia giáp nhau. Điều này có thể hữu ích cho một số loại phân vùng trong trò chơi của bạn và sẽ cho phép bạn có thể tối ưu hóa một số thứ nhất định trong quá trình phát triển.


2

Một lưu ý nhỏ: bạn nói 'trông giống như một bản đồ đời thực với các quốc gia có hình dạng khác nhau nhưng kích thước bằng nhau), nhưng các quốc gia' thực 'có kích thước rất khác nhau ngay cả trong các khu vực nhất định - ngay cả các quốc gia' lớn 'ở Châu Âu cũng có thể thay đổi rất nhiều, ví dụ như Pháp lớn hơn gấp đôi so với Ý. Như đã nói, rõ ràng có các khu vực chơi trò chơi để thử và giữ kích thước gần như nhau - chỉ cần lưu ý rằng một chút thay đổi ở đây có lẽ là tốt điều !

Cách tiếp cận ban đầu của tôi đối với vấn đề sẽ là 'phát triển' (thay vì 'phát triển') các khu vực của bạn:

  • Bắt đầu với một số phân chia cụ thể của bản đồ thành các đoạn có kích thước gần bằng nhau theo các đường thẳng (ví dụ: nếu bạn muốn 6 quốc gia, thì bạn có thể chia bản đồ thành ba lát ngang, sau đó chia từng lát đó 'trên đường chéo' thành hai mảnh). Điều này rõ ràng là dễ thực hiện theo chương trình, đặc biệt là vì nó không phải rất chính xác (trên thực tế, có lẽ không nên rất chính xác).
  • Thực hiện một bước ban đầu trên bộ phận, xây dựng cấu trúc dữ liệu 'ranh giới': một tập hợp các hình lục giác có một số hàng xóm hiện đang thuộc về một quốc gia khác. Đây cũng sẽ là thời điểm tốt để kiểm đếm số lượng hình lục giác ở mỗi quốc gia.

Bây giờ, miễn là bạn muốn, hãy chạy mã giả sau:

Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
  change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
  change hex B to belong to A's country;
} else {
  flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
  undo and reject this move;
} else {
  update the boundary list around the changed hex and its neighbors;
}

Điều này sẽ duy trì sự cân bằng thô giữa kích thước của bất kỳ hai quốc gia láng giềng nào và kiểm tra 'ngắt kết nối' (có thể được thực hiện bằng thuật toán lấp đầy đơn giản) đảm bảo rằng không có quốc gia nào bị vỡ thành từng mảnh. Cập nhật danh sách ranh giới là một hoạt động liên tục - hex đã thay đổi rõ ràng sẽ luôn ở trên ranh giới và bạn chỉ cần kiểm tra sáu hàng xóm của nó để xem liệu có bất kỳ trong số chúng đã trở thành một ô ranh giới không (vì giờ đây hàng xóm của nó đã ở một quốc gia khác) hoặc ngừng là một ô ranh giới (vì bây giờ là quốc gia láng giềng ở cùng một quốc gia), sửa đổi ranh giới được đặt khi cần thiết.

Để cải tiến phương pháp này, bạn thậm chí có thể đưa ra điều kiện hex sẽ thay đổi ngẫu nhiên một chút - thay vì luôn luôn 'cân bằng' hai quốc gia, bạn luôn có thể thực hiện trao đổi với một xác suất nhất định và thậm chí giảm dần xác suất đó thời gian (tương tự như quá trình làm mát trong thuật toán mô phỏng mô phỏng ) để bắt đầu buộc chúng có cùng kích thước.

Lưu ý rằng điều này sẽ không đảm bảo rằng tất cả các khu vực có cùng kích thước (điều này là không thể trừ khi N hoàn toàn phân chia kích thước lưới của bạn) và thậm chí sẽ không đảm bảo rằng tất cả các quốc gia nằm trong một khu vực của nhau; tuy nhiên, cần đảm bảo (chạy đủ số lần lặp) rằng mỗi quốc gia không lớn hơn một hex lớn hơn hoặc nhỏ hơn mỗi quốc gia láng giềng trực tiếp.

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.