Định lý trục tách với nhiều đa giác?


9

Tôi đang cố gắng thực hiện định lý trục tách trong C #. Tôi có một hàm có thể tính toán vectơ dịch tối thiểu giữa hai đa giác. Tuy nhiên, tôi dường như không thể tạo ra một hàm tính toán vectơ dịch tối thiểu giữa một đa giác và nhiều đa giác khác. Thành thật mà nói, tôi đã làm việc này trong nhiều tháng và không gần gũi hơn với một giải pháp và không thể tìm thấy một giải pháp trực tuyến. Luôn có một vài trường hợp cạnh không trả về kết quả chính xác, dẫn đến các lỗi ưu tiên cao trong trò chơi của tôi.

Dưới đây là các trường hợp cạnh phổ biến không hoạt động chính xác:

trường hợp cạnh

Có một giải pháp nổi tiếng cho vấn đề này? Tất cả những gì tôi có thể tìm thấy là mọi người nói "chỉ thực hiện SAT trên mỗi đa giác" nhưng điều này hiếm khi tạo ra vectơ dịch tối thiểu .

Bất cứ sự giúp đỡ nào cũng được đánh giá cao.


Một ý tưởng, mà tôi chưa bao giờ thực sự kiểm tra, đó là một số trục tách - những trục sẽ đưa bạn sang một bên thành một đa giác liền kề - có thể được gắn cờ là không bao giờ được coi là tối thiểu. Sau đó, một số loại thử nghiệm lặp lại sẽ cho kết quả tốt (có thể với một số loại giới hạn FIFO và / hoặc lặp để tránh bị kẹt trong một vòng lặp).
Andrew Russell

Một phiên bản thậm chí còn khó giải quyết hơn về điều này là khi một cạnh của hình dạng chỉ được bao phủ một phần bởi ann ann. Ví dụ, trong hình trên cùng bên phải, nếu hình vuông ở giữa mở rộng ra bên phải, là hình chữ nhật lớn hơn. Điều này tương tự với đầu ra của một số mã tôi sử dụng, mất hàng chục nghìn ô bị chiếm / không chiếm và giảm xuống dưới một trăm hình dạng va chạm lớn hơn
Richard Tingle

Câu trả lời:


2

Lý tưởng nhất là bạn không xây dựng môi trường của mình từ đa giác. Bạn xây dựng nó ra khỏi các cạnh (mà có lẽ bạn tính toán từ một tập hợp đa giác). Trong ví dụ đầu tiên của bạn, ví dụ, có một cạnh chéo; trong ví dụ cuối cùng, hộp nằm trên một cạnh ngang duy nhất.

Thực tế là trình soạn thảo hoặc công cụ của bạn sử dụng các hình dạng nhỏ hơn, riêng lẻ để xây dựng một mức độ sẽ không ảnh hưởng đến thời gian chạy.

Một cách tiếp cận đơn giản hơn một chút sẽ chỉ loại bỏ các cạnh "bên trong" của các hình dạng cơ sở. Ví dụ cuối cùng của bạn, có hai cạnh giữa các ô "sàn"; bỏ qua những điều này trong quá trình phát hiện va chạm.

Bạn có thể tìm thấy một số hình ảnh tốt hơn và một số ý tưởng triển khai bằng cách đọc phần 4.5 (chuỗi cạnh và chuỗi cạnh) trong tài liệu Box2D .


2
Sử dụng các cạnh (đặc biệt là các cạnh, sẽ tốt hơn một chút với các chuỗi cạnh) có nhược điểm lớn là nó trở nên rất dễ dàng cho các đối tượng vật lý bị trục trặc bên trong hình dạng cấp.
Andrew Russell

1
@AndrewRussell: những vấn đề đó được tránh với các sửa lỗi đường hầm thông thường. Đảm bảo các đối tượng chuyển động của bạn có âm lượng / diện tích khá ổn định, giữ tốc độ tối đa trên mỗi khung hình đủ thấp để chúng không thể di chuyển hơn ~ một nửa kích thước ngắn nhất của chúng (hoặc bước nhiều lần nếu bạn cần di chuyển nhanh hơn), tránh các kẽ hở thực sự sắc nét và như vậy trong hình học cấp độ của bạn, lặp lại độ phân giải nhiều lần cho đến khi bạn hội tụ vào vị trí cuối cùng "an toàn", v.v.
Sean Middleditch
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.