Vấn đề với một quad / octree trong các tìm kiếm lân cận gần nhất là đối tượng gần nhất có thể đang ngồi ngay trên sự phân chia giữa các nút. Đối với các va chạm, điều này là ổn, bởi vì nếu nó không nằm trong nút, chúng tôi không quan tâm đến nó. Nhưng hãy xem xét ví dụ 2D này với một góc phần tư:
Ở đây, mặc dù vật phẩm màu đen và vật phẩm màu xanh lá cây nằm trong cùng một nút, vật phẩm màu đen gần nhất với vật phẩm màu xanh. Câu trả lời của ultifinitus chỉ có thể đảm bảo cho người hàng xóm gần nhất chỉ mỗi vật phẩm trong cây của bạn được đặt trong nút nhỏ nhất có thể chứa nó hoặc trong một nút duy nhất - điều này dẫn đến tứ giác kém hiệu quả hơn. (Lưu ý rằng có nhiều cách khác nhau để triển khai cấu trúc có thể được gọi là quad / octree - việc triển khai nghiêm ngặt hơn có thể hoạt động tốt hơn trong ứng dụng này.)
Một lựa chọn tốt hơn sẽ là một cây kd . Cây Kd có thuật toán tìm kiếm lân cận gần nhất rất hiệu quả mà bạn có thể triển khai và có thể chứa bất kỳ số lượng kích thước nào (do đó kích thước "k".)
Một hình ảnh động tuyệt vời và nhiều thông tin từ Wikipedia:
Vấn đề lớn nhất khi sử dụng cây kd, nếu tôi nhớ chính xác, là chúng khó khăn hơn trong việc chèn / xóa các mục khỏi trong khi duy trì sự cân bằng. Do đó, tôi khuyên bạn nên sử dụng một cây kd cho các đối tượng tĩnh như nhà và cây có độ cân bằng cao và một cây khác chứa người chơi và phương tiện cần cân bằng thường xuyên. Tìm đối tượng tĩnh gần nhất và đối tượng di động gần nhất và so sánh hai đối tượng đó.
Cuối cùng, kd-tree tương đối đơn giản để thực hiện và tôi chắc chắn rằng bạn có thể tìm thấy vô số thư viện C ++ cùng với chúng. Từ những gì tôi nhớ, cây R phức tạp hơn nhiều và có thể quá mức nếu tất cả những gì bạn cần là một tìm kiếm hàng xóm gần nhất đơn giản.