Tạo đường / sông trên bản đồ lưới 2d


12

Đây là một câu hỏi dành cho người mới, nhưng đây là:

Bản đồ của tôi là lưới 2d và tôi muốn tạo đường và sông. Tuyến đường từ điểm bắt đầu đến điểm kết thúc không được là tuyến đường tối ưu về số lượng gạch. Thay vào đó, họ nên có một mức độ ngẫu nhiên (lượt) nhất định.

Có một thuật toán tiêu chuẩn cho loại điều này?

Chúc mừng!

CẬP NHẬT:

Đây là kết quả của việc chơi với các trọng số trên lưới và áp dụng thuật toán đường đi ngắn nhất (Bellman-Ford) bằng thư viện jgrapht. Tôi đã đi với câu trả lời của Donutz sau khi tất cả.

http://pastebin.com/AGQGK5ik


Có bất kỳ trở ngại trên bản đồ?
MichaelHouse

Chưa hết, dòng sông sẽ là chướng ngại vật đầu tiên được đặt.
Markos Fragkakis

Câu trả lời:


18

Bạn có thể tạo đường dẫn tối ưu bằng A *, sau đó làm biến dạng nó với chuyển vị giữa.

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

Điều này sẽ đảm bảo các điểm cuối của bạn được đáp ứng và cho phép bạn kiểm soát tính ngẫu nhiên ở mức độ tuyệt vời. Ví dụ: tôi sẽ không chọn ngẫu nhiên các con đường nhiều như sông. Dù trí thông minh đang xây dựng đường thường cố gắng tối ưu về nó.

Hãy cẩn thận để đảm bảo rằng nếu bản đồ của bạn có chướng ngại vật, bạn kiểm tra sau mỗi lần lặp mà bạn không vượt qua những chướng ngại vật đó.

Một phương pháp khác là tạo ra tiếng ồn Perlin sau khi tìm thấy đường dẫn tối ưu, sau đó thay đổi điểm của bạn dựa trên tiếng ồn được tạo ra. Ví dụ: sử dụng tiếng ồn này:

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

Sau đó hiển thị với đường dẫn tối ưu màu đỏ và đường dẫn dịch chuyển màu xanh lam:

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

Lưu ý cách đường chuyển đã "giải quyết" vào các vùng tối hơn của tiếng ồn. Giống như cách một dòng sông có thể chảy qua một thung lũng.

Một lợi ích của sự lựa chọn tiếng ồn Perlin là bạn có thể tính đến các chướng ngại vật của mình và tránh chúng như một phần của thuật toán.


1
Làm thế nào để bạn làm điều này thay đổi cơ sở dựa trên tiếng ồn?
Khôi

1
Nó phụ thuộc vào cách bạn lưu trữ tiếng ồn và đường được tạo. Bạn có thể tìm thấy tiếng ồn gần nhất / thấp nhất vuông góc với đường thẳng ở tâm trước, sau đó tại điểm giữa giữa tâm và điểm cuối, v.v.
MichaelHouse

3

Thuật toán A * cũng sẽ cho phép bạn gán giá trị cho các ô biểu thị mức độ phù hợp của chúng. Chẳng hạn, bạn có thể chỉ định điểm số chi phí thấp nhất cho vùng đất thấp cho các con sông, cho vùng đất bằng phẳng (nhưng không phải là đầm lầy) cho các con đường và tạo ra dựa trên điều đó. Điều này không cung cấp cho bạn tuyến đường ngắn nhất, nhưng nó cung cấp cho bạn tuyến đường hiệu quả nhất. Áp dụng một chút ngẫu nhiên cho các giá trị gạch của bạn và bạn có thể nhận được một số tuyến đường tối ưu phụ.


2

Thế còn khi chiều cao là một yếu tố? Tôi có thể tạo một sơ đồ chiều cao với thuật toán hình vuông kim cương. Tôi đã nghĩ đến việc thêm một ít nước ngẫu nhiên vào mỗi viên gạch và sau đó lặp đi lặp lại và di chuyển nước đến độ cao thấp hơn cho đến khi tất cả ổn định, nhưng điều đó sẽ chậm lại, và có thể sẽ tạo ra hồ chứ không phải sông.

Tôi cũng đã nghĩ đến việc xem xét các quy tắc cho mỗi ô. Nếu 2 quy tắc hướng về nhau, thì đó phải là một thung lũng. Nước sẽ tích tụ trong một thung lũng. Nếu chúng chỉ cùng hướng hoặc cách xa nhau, nước sẽ không thu thập. Điều này có thể sẽ nhanh hơn phương pháp lặp, nhưng có thể không tạo ra hồ, chỉ có sông. Tôi phải chơi xung quanh với nó để tránh biến mọi trường hợp gạch hướng về nhau thành một dòng sông.


Tôi đọc một trong những tài liệu mà bạn có thể thêm trọng lượng cho mỗi ô, cộng với các ô nhất định đơn giản là không thể vượt qua.
Joe Plante
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.