2013-11-16 5 views
1

В Java SE 7, я пытаюсь решить проблему, когда у меня есть серия Rectangles. Через какое-то взаимодействие с пользователем я получаю Point. Мне нужно найти (первый) прямоугольник, содержащий точку (если есть).Поиск прямоугольника, который содержит точку

В настоящее время я делаю это с помощью самого наивного решения только для хранения прямоугольников в ArrayList и поиска содержащего Rectangle путем итерации по списку и использования . Проблема в том, что, поскольку это должно быть интерактивным для пользователя, этот метод начинает слишком медленным даже для относительно небольшого количества прямоугольников (скажем, 200).

Мой текущий код выглядит примерно так:

// Given rects is an ArrayList<Rectangle>, and p is a Point: 

for(Rectangle r : rects) 
{ 
    if(r.contains(p)) 
    { 
     return r; 
    } 
} 

return null; 

Есть ли более умный способ решить эту проблему (а именно, в O (журнал N) вместо O (N), и/или с меньшим количеством звонки на , устраняя явно плохие кандидатуры раньше)?

+2

'Проблема в том, что, поскольку это должно быть интерактивным для пользователя, этот метод начинает слишком медленным даже для относительно небольшого количества прямоугольников (скажем, 200).« Должно быть что-то еще не так с кодом , Итерация более 200 прямоугольников не займет времени. – camickr

+0

Вы правы. Простой профиль показывает, что это даже не близко к тому времени, когда я трачу на обработку щелчка мыши (получается, что он занимает около 8 мс на моем довольно среднем ноутбуке). Тем не менее, я все еще интересуюсь этой проблемой в более общем смысле. – CmdrMoozy

ответ

3

Да, есть. Build 2 interval trees, который расскажет вам, существует ли прямоугольник между x1 и x2 и между y1 и y2. Затем, когда у вас есть координаты точки, выполните O (log n) поиск в обоих деревьях.

Это скажет вам, есть ли прямоугольники вокруг интересующей вас точки. Вам все равно нужно проверить, существует ли общий прямоугольник, заданный двумя деревьями.

+0

В статье в Википедии упоминаются несколько способов увеличить стандартное дерево интервалов до двух измерений. Это должно отлично работать для моей проблемы. Вопрос в том, есть ли существующая реализация этого в Java? – CmdrMoozy

+0

В самой статье есть реализация Java. Также прочитайте раздел после реализации Java, чтобы получить представление о создании двумерных деревьев с использованием того же кода. Лично я считаю, что это слишком сложно и стараюсь держать вещи простыми. – Chandranshu

+0

Вот полная реализация со вставкой, удалением и поиском: http://algs4.cs.princeton.edu/93intersection/IntervalST.java.html – Chandranshu

Смежные вопросы