Thủ tục tạo vùng trên đảo


29

Tôi hiện có những hòn đảo trông như thế này:

Đảo

Và tôi muốn chia nhỏ nó thành các khu vực, như thế này:

đảo với các khu vực

Thuật toán nào tôi đang tìm kiếm? Bạn có gợi ý về cách tạo các vùng kết hợp như trong hình dưới không. Sự giúp đỡ của bạn được đánh giá cao.


Làm thế nào bạn có được hình ảnh hòn đảo đó ở nơi đầu tiên? Bạn đã tạo ra nó, và nếu vậy, làm thế nào bạn đạt được nó?
Vaillancourt

Tôi đã nhận nó từ một trình tạo bản đồ trực tuyến.
domisum

Xin lỗi vì sự chậm trễ trong việc cập nhật câu trả lời của tôi - mất nhiều thời gian hơn để về nhà so với dự kiến ​​ban đầu. Tôi đã thêm một số minh họa và liên kết.
Gulalek

Nếu bạn có được điều này từ một trình tạo trực tuyến, bạn nên xem Trình tạo bản đồ ảo của Azgaar . Nó có các vùng và tên, với các tham số có thể tùy chỉnh và WB.SE nói xin chào. Đó là một github, vì vậy bạn có thể kiểm tra mã của họ.
Anoplexian - Phục hồi Monica

Câu trả lời:


40

Trong thế giới thực, những biên giới tỉnh đó thường sẽ theo các đặc điểm địa chất như sông.

Vì vậy, có lẽ một cách tiếp cận tốt sẽ là mô hình hóa địa chất của hòn đảo và có biên giới rơi ra khỏi điều này?

Red Blob Games có một số bài viết hay về chủ đề này, với kết quả đẹp mắt.

Cách tiếp cận của ông dường như liên quan đến việc sử dụng tessname Voronoi và xác định các con sông là ranh giới giữa các tế bào.

Kiểm tra các bài viết khác trên trang web của mình, anh ấy đã viết rất nhiều về chủ đề tạo bản đồ .

Đảo


3
Lưu ý rằng trong thế giới thực, các bộ phận chính trị hoặc hành chính đôi khi cũng có các bộ phận tùy ý, thường là các đường thẳng (ví dụ dọc theo các đường latitud / longitud, các đường giữa các đỉnh núi, v.v.).
Pablo H

2
@PabloH Điểm tốt, mặc dù biên giới thẳng dường như là hiện tượng thời kỳ thuộc địa hậu truyền thông. Nhưng vì chúng ta không biết thiết lập vấn đề của OP, nên nó có thể có liên quan
Sentry

27

Tôi sẽ giải quyết vấn đề này bằng hai lần sơ đồ Voronoi:

Pass đầu tiên: Phân vùng vùng

Đèo đầu tiên sẽ sử dụng phân bố điểm hơi thưa thớt (tức là khoảng cách giữa các điểm phải tương đối lớn) để phân chia đảo thành các khu vực (xem ghi chú bên dưới về việc tạo điểm). Tiếp theo tạo một sơ đồ Voronoi dựa trên những điểm này. Điều này sẽ chia đảo thành các vùng đa giác xung quanh mỗi điểm như dưới đây:

nhập mô tả hình ảnh ở đây

Đèo thứ hai: Ngẫu nhiên biên giới

Bây giờ hòn đảo đã được chia thành các khu vực, bước tiếp theo là 'xóa bỏ' ranh giới giữa chúng. Để làm như vậy, tạo một lớp điểm mới bằng cách sử dụng phân phối điểm nhỏ gọn hơn (nghĩa là khoảng cách giữa các điểm phải nhỏ) và sử dụng lại các điểm này để tạo sơ đồ Voronoi khác. Tiếp theo cho mỗi vùng nhỏ hơn, gán nó cho vùng lớn hơn bằng cách kiểm tra điểm 'hạt giống' của nó. Điều này sẽ dẫn đến một ranh giới lởm chởm hơn giữa các phân khu lớn hơn. Dưới đây là cận cảnh của cả hai biểu đồ Voronoi:

nhập mô tả hình ảnh ở đây

Và đây là cùng một khu vực chỉ hiển thị các ranh giới cuối cùng:

nhập mô tả hình ảnh ở đây

Nhận xét về thế hệ điểm

Về việc tạo điểm, tôi thích sử dụng phân phối đĩa Poisson để có được phân phối điểm tương đối đẹp và đồng đều. Tùy chọn phổ biến khác là có được phân phối đồng đều tương tự là sử dụng thuật toán của Lloyd trên một tập hợp các điểm ngẫu nhiên 'thông thường'. LLoyd's dễ viết mã hơn, nhưng có thể mất một số thử nghiệm & lỗi để xác định có bao nhiêu lượt đi cần thiết để đưa ra kết quả mong muốn.

Một vấn đề tiềm năng với cách tiếp cận này là phân vùng pass đầu tiên có thể tạo ra một số vùng rất nhỏ. Nếu bạn không muốn chúng trong kết quả cuối cùng của mình, tôi chỉ cần hợp nhất chúng với một vùng liền kề ngẫu nhiên.

Ghi chú cuối cùng

Các hình minh họa tôi cung cấp là hình ảnh raster, nhưng kỹ thuật này cũng hoạt động với các biểu diễn đa giác / vector.


1
Đối với các sơ đồ tầng thủ tục, đây là những gì tôi làm, thực hiện sơ đồ Voronoi từ các điểm bên trong khu vực (đảo), xây dựng một lưới (nó không phải là hình chữ nhật, trong trường hợp của bạn là một lưới bị biến dạng) bao quanh cùng một khu vực, sau đó tính toán các giao điểm boolean của lưới và Voronoi, tính toán các khu vực và gán cho cây dữ liệu (danh sách danh sách, mảng răng cưa, v.v ... bất kỳ cấu trúc dữ liệu nào bạn thích) theo tỷ lệ 0,6 của ô lưới nhỏ nhất, bạn sẽ nhận được một số ô bị thiếu, nhưng bạn có thể so sánh lưới đã loại bỏ của bạn với bản gốc để tìm và gán lại cho cây của bạn.
Felipe Gutierrez

Bạn đã thêm hình ảnh! Đây chính xác là những gì tôi đang làm cho một mục đích khác
Felipe Gutierrez

4

MineCraft thực hiện điều này một cách độc đáo, và thuật toán thế hệ của nó đã được phân tích và ghi lại một cách kỹ lưỡng.

Có nhiều mô tả khác nhau về thuật toán, một trong số chúng ở đây: https://github.com/Un UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-alacticm

Cốt lõi của thuật toán là một bộ tạo nhiễu Perlin . Điều này kiểm soát độ cao trực tiếp (ít nhiều, vì bước tiếp theo để khắc ra các hang động cũng có thể thay đổi bề mặt), cũng như tạo ra quần xã. Một cái gì đó giống như trình tạo biome có lẽ là những gì bạn muốn sử dụng để tạo ra các khu vực của bạn.

(Một phiên bản cũ của nó) được ghi lại , về cơ bản, nó hoạt động bằng cách sử dụng hai bộ tạo tiếng ồn Perlin khác nhau, một cho "nhiệt độ", một cho "lượng mưa", sau đó chọn quần xã từ hai loại đó. Các biến số (nhiệt độ và lượng mưa) không thực sự được sử dụng trong trò chơi sau này; ví dụ, các sa mạc không có mưa, nhưng trò chơi xác định điều này từ thuộc tính "sa mạc", không phải từ giá trị lượng mưa ban đầu.

Có nhiều công cụ trực tuyến khác nhau để tạo bản đồ quần xã từ một hạt giống ngẫu nhiên, một trong số đó là mineatlas.com . Tôi đoán rằng, bên trong, họ sử dụng máy chủ java sử dụng các lớp bên trong của chính MineCraft; Tôi không biết nếu có bất kỳ mã nguồn nào của họ có sẵn trực tiếp.


4

Một thuật toán điển hình được sử dụng, ví dụ, bởi Azgaar ( mã nguồn ). Đại khái là như thế này:

  1. chia mảnh đất của bạn thành các khu vực nhỏ hơn, ví dụ như thông qua các tế bào tam giác delauny hoặc voronoi.
  2. xác định (ngẫu nhiên hoặc bằng cách khác) các địa điểm "bắt đầu" cho các nền văn hóa, vương quốc, tôn giáo của bạn hoặc bất cứ điều gì khác mà bạn muốn mô phỏng.
  3. xác định (ngẫu nhiên hoặc nói cách khác) một "yếu tố tăng trưởng" cho mỗi người trong số họ. Bạn càng có nhiều sự khác biệt về các yếu tố tăng trưởng, bản đồ cuối cùng của bạn càng ít đồng nhất.
  4. Bây giờ lặp đi lặp lại trên các lĩnh vực của bạn (vv) và, tùy thuộc vào yếu tố tăng trưởng, làm cho chúng lan rộng ra xung quanh, các ô trống cho đến khi toàn bộ bản đồ được lấp đầy.
  5. Bạn có thể muốn kết thúc với việc làm thẳng các đường viền một chút, bằng cách chuyển đổi các ô chỉ có một hàng xóm có màu riêng và được bao quanh bởi một màu khác với màu đó.

3

Nếu bạn quan tâm đến việc thực hiện điều này ở định dạng véc tơ hơn là các cách tiếp cận dựa trên raster, tôi đã viết một bài đăng blog cách đây khá lâu về chính xác điều này.

http: //blog.particvery.com/worlds-and-their-geography/

Ý tưởng là bạn bắt đầu với một lưới (thường dựa trên Voronoi) và phát triển các vùng đồng tâm từ các điểm được gieo ngẫu nhiên, cách nhau đủ.


2

Thật là một câu hỏi thú vị :) Cách tiếp cận này dựa trên các tế bào Vornoi nhưng số liệu khoảng cách không hoàn toàn là Euclidian (tôi đã sử dụng sức mạnh của 1,5 thay vì 2.0) và có một số tính ngẫu nhiên được tích hợp trong đó. Nó có thể nhảy qua mặt nước không lý tưởng.

Các khu vực gần đó có thể được hợp nhất với nhau để có được hình dạng thú vị hơn, ở đây tôi đã sử dụng N hàng xóm gần nhất để xác định điều này.

Nếu bạn quan tâm tôi có thể đi sâu vào chi tiết và chia sẻ mã Python.

bản đồ 1 bản đồ 2

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.