Не очень элегантные решения, но я надеюсь, что это эффективно.
У него есть часть инициализации, которая займет некоторое время, но затем она окупится, надеюсь, запросы будут быстрыми.
Сначала создайте структуру данных с пространственным разделением, с помощью которой вы сможете искать точки в запрашиваемом контейнере, и вы сможете находить поля таким образом.
Это будет дерево с 8 дочерними узлами на узел. Есть и другие альтернативы, взгляните на k-d деревья
Найдите наименьший вмещающий контейнер, содержащий все коробки.
Разделите этот контейнер на 8 контейнеров одинакового размера.
Для каждой точки в вашем наборе найдите контейнер, которому она принадлежит.
Повторите этот процесс для каждого контейнера, который содержит более одной точки.
Вы получите контейнеры для листьев, имеющие одну точку.
Используя эту структуру, скажем, вы хотите найти все точки в запрашиваемом контейнере.
Начните с вершины дерева и пройдите все ветви / контейнеры, которые пересекаются с запрашиваемым контейнером.
Будет 3 случая:
1) контейнер полностью заключен в запрашиваемый контейнер => все точки в этом поддереве находятся в запрашиваемом контейнере.
2) контейнер находится вне запрашиваемого контейнера => вы не проходите его. (это где вы должны получить эффективность)
3) контейнер пересекает запрашиваемый контейнер => вам придется повторить процесс для всех его дочерних элементов.
Есть некоторые крайние случаи, которые вы должны выяснить.
Чтобы найти прямоугольники, вам нужно поместить каждый из их 8 углов в эту структуру данных.
Углы должны быть связаны с ящиками. Поэтому, когда вы найдете угол, вы узнаете, к какой коробке он принадлежит.
Чтобы определить, какие коробки полностью заключены в запрашиваемый контейнер, вы должны проверить каждую из найденных коробок