Tam giác Delaunay. Bắt đầu từ đâu?


7

Tôi đang cố gắng học kỹ thuật tạo thủ tục. Cụ thể cho ngục tối. Tôi bắt đầu với một mảng 2D và tôi tạo ra các phòng của mình tốt. Mỗi phòng đều có gạch ốp tường như trong ảnh chụp màn hình bên dưới.

! [phòng được tạo] http://i.imgur.com/JpYLKip.png

Ngay bây giờ tôi sử dụng A * để liên kết các phòng với nhau. Nhưng điều này có một số con đường đi thẳng qua các phòng khác hoặc xung quanh các phòng. Sau khi thực hiện một số điều tôi đã tìm thấy bản demo này , trò chơi cho tôi ý tưởng sử dụng Delaunay Triangulation để kết nối đúng các phòng mà không cần thông qua các kết nối / phòng đã có sẵn.

Nhưng làm thế nào để áp dụng nó vào thiết lập mảng 2D của tôi? Suy nghĩ ban đầu của tôi là tôi nên nghĩ ra bên cạnh (mảng 2d haha) và lấy các phòng của tôi và tạo một biểu đồ hoàn chỉnh từ đây và sau đó áp dụng Tam giác Delaunay.

Tôi chưa bao giờ làm bất cứ điều gì với đồ thị trước đây. Vì vậy, điều tôi cần biết là a) suy nghĩ của tôi có đúng không khi tạo biểu đồ với tất cả các phòng được liên kết và sau đó áp dụng tam giác và b) tôi nên bắt đầu từ đâu?

[chỉnh sửa nhỏ] sau khi tìm hiểu thêm về stackoverflow tôi thấy bài đăng này giải thích về Đồ thị sâu hơn. /programming/15306040/generate-an-adjacency-matrix-for-a- weighted-graph


Tôi không hoàn toàn làm theo những gì bạn muốn sử dụng tam giác Delaunay cho. Có phải ý tưởng là bạn sẽ đặt một đỉnh cho mỗi phòng và sử dụng các cạnh của hình tam giác làm liên kết giữa các phòng không? Làm thế nào để A * tìm ra tất cả những điều này? Cuối cùng, nếu bạn muốn biết cách thực hiện tam giác Delaunay, chỉ cần google nó. Có hàng tấn bài viết về nó, chưa kể các thư viện.
Nathan Reed

3
Bạn đã thử những gì? Câu hỏi thực tế của bạn là gì? Đây là một trang web Hỏi & Đáp, không phải là một diễn đàn thảo luận chung, vì vậy thật không may, chỉ cần hỏi các mẹo hoặc đề xuất là lạc đề.
Sean Middleditch

Câu trả lời:


9

Đó là một bản demo gọn gàng. Tài liệu tham khảo tốt nhất cho các tam giác Delaunay và sơ đồ Voronoi mà tôi đã tìm thấy là cuốn sáchghi chú bài giảng của Jonathan Shewchuk . Cuốn sách này tiên tiến hơn đáng kể so với các ghi chú bài giảng, và nói nhiều hơn về sàng lọc lưới . Tôi đề nghị bạn bắt đầu với các ghi chú bài giảng.

Bạn có cần phải đi học để tạo ra một tam giác Delaunay? Quái gì không! Một tam giác delaunay chỉ là tam giác duy nhất sao cho mỗi vòng tròn của tam giác (cuộn xuống câu trả lời của Shewchuk) chỉ bao gồm 3 đỉnh của mỗi tam giác, và không có gì nữa.

nhập mô tả hình ảnh ở đây (Ảnh từ ghi chú bài giảng của Shewchuk, được liên kết ở trên)

Thuật toán

Một bài viết phác thảo hai thuật toán để xây dựng một tam giác Delaunay là một nơi tốt để bắt đầu.

Cách chính mà bạn sẽ thấy mọi người nói đến trước tiên là tạo sơ đồ Voronoi.

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

Thuật toán của Fortune

Tôi chỉ có thể cung cấp cho bạn một vài gợi ý ở đây, đã bắt đầu làm việc với thuật toán của Fortune nhưng từ bỏ dự án vì mã của Fortune cực kỳ khó hiểu. Có một triển khai javascript ở đây .

Một vài tài nguyên khác của Fortune:

Tôi biết tôi đã đăng rất nhiều liên kết ở đây, nhưng lời khuyên của tôi là tránh thuật toán của Fortune . Một cách dễ dàng hơn để làm điều đó là sử dụng các cạnh lật, được mô tả dưới đây.

Lật cạnh

Một cách dễ dàng hơn để làm điều đó được gọi là Flipping Edges . Những gì bạn làm là bắt đầu với bất kỳ tam giác nào , sau đó chỉ cần "lật cạnh" để mọi tam giác trở thành "Delaunay" (đường tròn ngoại tiếp của mỗi tam giác không có điểm nào khác ngoài 3 đỉnh của chính nó). Một khi tất cả các tris là Delaunay, bạn có tam giác Delaunay.


Cảm ơn @bobobobo. Rất nhiều thông tin! Bạn có tài nguyên nào chỉ ra cách bắt đầu thực hiện một số thuật toán này không? Bây giờ tôi biết rằng tôi không cần phải có một biểu đồ để thực hiện tam giác, chỉ cần một tập hợp các điểm mà tôi có. Sau khi tôi có biểu đồ tam giác, tôi có thể thực hiện những việc như cây bao trùm tối thiểu để có kết quả thú vị hơn.
Superflat

Nếu bạn chỉ có một tập hợp các điểm, bạn có thể sử dụng thuật toán O (nlogn) của Fortune hoặc chỉ cố gắng tạo thành các hình tam giác với tất cả các cặp điểm khác . Chỉ thực sự hình thành các hình tam giác khi đường tròn tam giác không bao gồm bất kỳ điểm nào khác
bobobobo

Nếu bạn đang sử dụng điều này để tạo ra các điều hướng thì bạn phải lưu ý rằng Delaunay chỉ hoạt động cho đa giác lồi, vì vậy nếu bạn không muốn cắt lưới của mình và tam giác các phần phụ lồi thì hãy xem câu hỏi này để thay thế. Chỉnh sửa: dường như có các phiên bản mở rộng của Delaunay hỗ trợ các cấu trúc phức tạp hơn rõ ràng.
PeterT

@PeterT Không chỉ là để xác định kết nối phòng. Tôi muốn tránh sử dụng navmesh và chỉ sử dụng A * để lặp qua lưới vuông ... Mặc dù .. tôi luôn có thể kết hợp lưới sau khi tạo và sau đó chạy trình tạo navmesh.
Superflat
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.