Thế hệ khu vực thành phố


7

Tôi hiện đang tạo một bản đồ được tạo theo thủ tục và muốn thêm các khu vực vào các thành phố cho thấy tầm với của họ, cách tôi đạt được hiện tại là bằng cách mở rộng ra khỏi trung tâm thành phố cho đến khi tầm với của thành phố bị vượt quá hoặc địa hình núi / nước đã gặp, một chút giống như raytracing tôi giả sử:

Hình ảnh của vấn đề, không thể đăng hình ảnh trực tiếp

Điều này đưa ra các vấn đề đã thấy ở trên, tạo ra những lỗ hổng lớn / xấu tự nhiên và không lấp đầy các khu vực ngoài "tầm nhìn" nhưng có thể tranh cãi trong tầm tay của thành phố. Các khu vực thành phố được cho là bị chặn bởi các dãy núi và các vùng nước lớn hơn, nhưng nên uốn quanh các hồ / đá nhỏ một cách tự nhiên. Tôi có thể cung cấp mã hiện tại của mình Tôi tin rằng về cơ bản nó không hoàn hảo cho những gì tôi muốn làm và không thể sử dụng được.

Về cơ bản khu vực mong muốn tôi muốn tuyệt vời sẽ trông giống như thế này: nhập mô tả hình ảnh ở đây

Tôi hơi mất công tìm kiếm gì để tìm tài liệu về chủ đề này, cho dù đó là một thuật toán hay gợi ý nào đó, vì vậy về cơ bản tôi đang hỏi cái này được gọi là gì. (Bất kỳ mẹo / thủ thuật cũng sẽ được đánh giá rất cao)


1
Bạn không thể mở rộng thành các điểm ngẫu nhiên bên cạnh lãnh thổ được tuyên bố liền kề, miễn là chúng không nằm trong các rào cản tự nhiên?
Kyranstar

Tôi chắc chắn sẽ đặt câu hỏi về hình dạng của ví dụ thứ hai 'mong muốn' của bạn - kết quả mong muốn đầu tiên là khá tự nhiên (ngoài các khoảng trống dọc theo bờ hồ ở trên cùng bên phải và 'tia' của thành phố ở phía dưới), nhưng Thứ hai trông cực kỳ nhân tạo với tôi. Các câu trả lời ở đây là hợp lý, nhưng tôi nghĩ có lẽ bạn nên bắt đầu bằng cách đặt câu hỏi cho các giả thuyết của mình.
Steven Stadnicki

Câu trả lời:


3

Để theo dõi các bình luận của @Ranth & @JackFrost, một tìm kiếm đầu tiên trải rộng từ điểm xuất phát sẽ cho bạn kết quả mong muốn. Khi làm như vậy:

  • Sử dụng vùng lân cận 8 chiều (IE cho phép di chuyển tìm kiếm chéo)
  • Sử dụng chỉ số Euclide cho khoảng cách để khuyến khích 1 chuyển động chéo trên 2 chuyển động chính
  • Giới hạn tìm kiếm bởi bất cứ điều gì bạn muốn bán kính tối đa là
  • Làm cho chướng ngại vật không thể vượt qua hoặc tăng chi phí di chuyển của các tế bào của họ

Bởi vì tìm kiếm sẽ cần phải bao quanh các chướng ngại vật hoặc di chuyển chậm hơn qua chúng, bạn sẽ không có được một vòng tròn hoàn hảo xung quanh điểm xuất phát của mình. Nếu mọi thứ vẫn quá trơn tru và / hoặc bạn có một khu vực không có chướng ngại vật, bạn luôn có thể thêm một số chướng ngại vật giả để chạy tìm kiếm chu vi thành phố.

Như với hầu hết các công cụ PCG, có lẽ bạn sẽ cần thử nghiệm một chút để tìm thấy những gì bạn muốn. Tôi thích sử dụng Perlin / tiếng ồn simplex & / hoặc phân phối đĩa Poisson cho rằng loại điều, nhưng để mỗi riêng của họ.


2

Tôi tin rằng điều này có thể đạt được bằng cách sử dụng thuật toán lấp lũ, về cơ bản tính toán tất cả các khu vực được kết nối trong một không gian nhất định, tùy thuộc vào cách bạn muốn nó hoạt động tuy nhiên nó có thể dẫn đến các khu vực nằm đối diện với một dòng sông (nơi dòng sông chảy dọc khu vực lớn nhất mà thành phố có thể chiếm) không được đưa vào khu vực cần xử lý đặc biệt.

Về mặt tăng trưởng, bạn có thể đơn giản tăng bán kính của vòng tròn và để cho lũ lấp chọn vùng bên trong vòng tròn đó.

Về mặt triển khai, cách tốt nhất là làm theo hướng dẫn nhưng Wikipedia cũng có cách triển khai mã giả khá tốt: https://en.wikipedia.org/wiki/Flood_fill#Pseudocode


Điều này sẽ tạo ra một vòng tròn khá hoàn hảo xung quanh thị trấn phải không? Làm cho nó không đồng đều sẽ đòi hỏi một sự thay đổi khá lớn đối với mã phải không? Nhưng khi nhìn qua wiki, tôi đã thấy ví dụ xếp hàng của các kho lưu trữ, và khiến tôi nghĩ rằng một thuật toán tìm kiếm đầu tiên theo chiều rộng có thể hoạt động đúng không?
Ranth

1
Heya với lần tìm kiếm đầu tiên, về cơ bản bạn có thể tìm thấy tất cả các địa điểm trong khoảng cách x từ thành phố thông qua một con đường có thể đi và sau đó khi thành phố phát triển sẽ tăng chiều dài giới hạn đường dẫn lên kích thước lớn hơn. Tôi đã sử dụng tìm kiếm theo chiều rộng đầu tiên nhưng không phải cho một cái gì đó như vậy vì vậy tôi không chắc chắn 100% về việc thực hiện trong trường hợp cụ thể này!
JackFrost

Khả năng của Dijkstra cũng có thể hoạt động và bạn có thể thêm các trọng số ngẫu nhiên để làm cho nó không tạo ra một vòng tròn hoàn hảo.
Kiểm đếm

0

Như Kyranstar đã nêu trong nhận xét của mình, có lẽ Cellular automaton có thể là một giải pháp.

Yêu cầu địa hình mới bằng cách sử dụng một số logic ngẫu nhiên để kiểm tra loại địa hình, sự hiện diện của nước (một thành phố thường mọc gần sông hoặc đáy biể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.