Thuật toán truy vấn địa hình đa giác vuông lưới?


7

Tôi có một địa hình hình vuông, lưới cố định với một loại địa hình trên mỗi đơn vị lưới trong trò chơi của mình và tôi muốn thực hiện một truy vấn địa hình đa giác tùy ý trả về tất cả các đơn vị lưới được bao quanh / giao nhau bởi đa giác. Bất cứ ai có thể chỉ cho tôi một thuật toán cho điều này?

Tôi sẽ sử dụng điều này để đảm bảo rằng các diễn viên của tôi không đi qua địa hình không hợp lệ khi họ di chuyển.

Cảm ơn!

Câu trả lời:


3

Chuẩn bị đa giác của bạn

Thiết lập đa giác của bạn dưới dạng một chuỗi các điểm / đường được định hướng. Điều này được mô tả trong bất kỳ thử nghiệm đa giác điểm nào , trong đó có vô số tài nguyên trực tuyến và trên Stackoverflow / Stackexchange, vì vậy tôi sẽ không lặp lại ở đây.

Chuẩn bị bản đồ của bạn để truy vấn

Chỉ định mỗi ô vuông một ID duy nhất.

Xây dựng một danh sách tất cả các đỉnh (góc) duy nhất xác định các ô vuông của bạn. Đối với bản đồ N x M hình vuông, sẽ có (N + 1) x (M + 1) góc.

Cung cấp cho mỗi góc một danh sách mà hình vuông tham chiếu nó. (từ 1 đến 4 - hầu hết sẽ là 4 vì nhìn chung một góc nằm ở giao điểm của bốn hình vuông).

Truy vấn và giải quyết

Bây giờ đối với mọi điểm góc, chạy thử nghiệm điểm đa giác. Đối với các điểm góc nằm bên trong, hãy thêm chúng vào danh sách "bên trong" mới.

Bước cuối cùng là xác định các điểm bên trong của bạn thuộc về hình vuông nào; đây là lý do tại sao chúng tôi giữ danh sách các hình vuông cho mỗi góc, trước đó. Có hai cách bạn có thể diễn giải "độ trong" cho hình vuông:

  • Hình vuông chỉ có 1 điểm bên trong, được coi là nằm trong đa giác.
  • Chỉ các hình vuông có 4 điểm nằm trong đa giác truy vấn, được coi là nằm trong đa giác.

Nếu trước đây, nó rất dễ dàng, chỉ cần chạy qua tất cả các điểm bên trong và thêm các ô vuông được tham chiếu bởi chúng, vào một tập hợp (tức là một danh sách không cho phép trùng lặp). Bộ này là kết quả cuối cùng của bạn.

Khác, bạn có thể làm tham khảo đếm. Thiết lập bản đồ các giá trị nguyên (số 0) được khóa bằng ID vuông, cho mỗi ô vuông trên địa hình của bạn. Bây giờ hãy chạy qua danh sách các điểm bên trong và với mỗi ô vuông được tham chiếu trong mỗi một điểm bên trong, hãy thêm một điểm vào mục nhập bản đồ có khóa có liên quan. Khi điều này được thực hiện, hãy chạy qua bản đồ và thêm bất kỳ mục nào có số 4 trong trường giá trị, vào danh sách mới. Đây là kết quả cuối cùng của bạn., Vì 4 góc của hình vuông nằm hoàn toàn bên trong đa giác.

Tối ưu hóa - TÙY CHỌN

Bạn có thể đơn giản hóa quá trình phần nào bằng cách gán cho mỗi hình vuông một điểm trung tâm và kiểm tra xem điểm nào nằm trong đa giác. Điều này về mặt khái niệm đơn giản hơn, nhưng không chính xác như kiểm tra 4 góc. Nếu bạn không ngại cách tiếp cận khó khăn hơn, tôi khuyên bạn nên làm điều này.

Mẹo cuối cùng

Định lượng đa giác và đa diện vào các tế bào thường có thể là một quá trình tẻ nhạt. Trong những trường hợp như thế này, đôi khi tôi khuyên rằng nếu bạn không muốn vượt qua sự nghiêm khắc ở trên, thay vào đó, bạn chỉ nên xây dựng động lực trò chơi của mình sao cho đa giác của bạn thực tế chỉ là một hình dạng được tạo ra từ các ô / khối, thay vì một đa giác đẹp gọn gàng. Điều này làm cho nó rất dễ dàng để kiểm tra đối với bản đồ lưới.

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.