Я не могу понять, как реализовать это на практике, поэтому я решил спросить вас, ребята.
У меня есть список прямоугольников — на самом деле это только квадраты, но мне, возможно, придется перейти к прямоугольникам позже, так что давайте придерживаться их и оставить его немного более общим — в 2-мерном пространстве. Каждый прямоугольник определяется двумя точками, прямоугольники могут перекрываться, и меня не слишком волнует время установки, потому что прямоугольники в основном статичны и есть некоторое пространство для предварительного расчета любых элементов настройки (таких как построение деревьев, сортировка, предварительный расчет дополнительных векторов, что угодно и т.д.). О, я разрабатываю JavaScript, если это имеет какое-либо значение.
На мой фактический вопрос: учитывая точку, как мне получить набор всех прямоугольников, включающих эту точку?
Линейные подходы работают недостаточно хорошо. Поэтому я ищу что-то, что работает лучше, чем O (n). Я читал кое-что, например, об иерархиях ограничивающих объемов и подобных вещах, но что бы я ни пробовал, тот факт, что прямоугольники могут перекрываться (и я действительно хочу получить их все, если точка находится внутри нескольких прямоугольников), кажется, всегда мешает мне .
Есть предложения? Я пропустил что-то очевидное? Применимы ли BVH даже к возможным перекрывающимся границам? Если да, то как построить такое, возможно, перекрывающееся дерево? Если нет, что еще я мог бы использовать? Меня не волнует, внутренние границы, внешние или неопределенные.
Если бы кто-то мог придумать что-нибудь полезное, например ссылку или разглагольствования о том, насколько я глуп, чтобы использовать BVH, а не Some_Super_Cool_Structure_Perfectly_Suited_For_My_Problem, я был бы очень признателен!
Редактировать: Хорошо, я немного поигрался с R-Trees, и это именно то, что я искал. Фактически, в настоящее время я использую реализацию RTree http://stackulator.com/rtree/, предложенную endy_c. Он работает очень хорошо и полностью удовлетворяет мои требования. Большое спасибо за вашу поддержку, ребята!