Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение вхождения точки в одну из окружностей. нужен оптимальный алгоритм 
V
    Опции темы
Homer
Дата 12.1.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



Дано множество окружностей (возможно до нескольких тысяч), дана точка. Нужно определить в какую окружность попадает точка.
Нужен алгоритм быстрого поиска, не простого перебора. Как впихнуть сюда хэш-таблицу я не представляю, поэтому она отпадает. Остается бинарное дерево, но как его организовать? Какую окружность пихать влево, какую вправо?
У окружностей может быть разный радиус, располагаются абсолютно хаотично, точнее нет какой-то определенной системы.
Жду советов, заранее спасибо.
PM MAIL   Вверх
W4FhLF
Дата 12.1.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Akina
Дата 12.1.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Переведите координаты центров в полярные (желательно ещё и начало координат сместить в центр масс) и отсортируйте по длине вектора или углу вектора. То же сделаете и с целевой точкой. Станет намного легче.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Homer
Дата 12.1.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



Да забыл, программа для ембедед устройства, ресурсы которого естественно намного меньше компьютерных. Проверяться будет не реже одного раза в секунду.
Цитата

Переведите координаты центров в полярные (желательно ещё и начало координат сместить в центр масс) и отсортируйте по длине вектора или углу вектора. То же сделаете и с целевой точкой. Станет намного легче. 

Интересно, попробуем погуглить.
Кстати координаты gps.

Это сообщение отредактировал(а) Homer - 12.1.2010, 16:09
PM MAIL   Вверх
Akina
Дата 12.1.2010, 16:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



А набор окружностей - статический? иными словами, можно ли провести "артподготовку" этого массива окружностей для удобного поиска?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Homer
Дата 12.1.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



Да, набор абсолютно статический, загружается только при загрузке и не меняется.
Полярные координаты также отпадают, вобщем то ничего особого они не дают.
PM MAIL   Вверх
Earnest
Дата 12.1.2010, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Построй простой пространственный индекс: разбей пространство сеткой квадратов на кластеры, в каждый кластер помести ссылки на все круги, которые его пересекают. Дальше ищи только в том кластере, куда попадает точка. Размер сетки подбирается органолептически - чтобы пустых кластеров было мало, но в каждом кластере было не слишком много объектов.
Если объекты распределены сильно неравномерно, то можно подумать о более сложной структуре - древовидной. Но она требует больше ресурсов как при вычислении, так и памяти.



--------------------
...
PM   Вверх
maxdiver
Дата 13.1.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Для кругов можно построить диаграмму Вороного, а потом выполнять поиск точки на ней (видимо, будет достигнута оценка logN на поиск одной точки). Но не думаю, что это будет целесообразно: обе этих составляющих являются весьма сложными алгоритмами.

Поэтому удобней применять не такие прямые методы, а всякие методы, как в предыдущих постах. Можно каждый круг описать квадратом, потом выполнить запрос на поиск всех квадратов, содержащих данную точку (а это значительно проще, чем для случая кругов), а потом уже "вспомнить", что мы вообще-то искали круг, т.е. перебрать все найденные квадраты и проверить, попадает наша точка в их круги или нет. Теоретически, в худшем случае, первая фаза алгоритма могла выдать все квадраты, хотя круги на самом деле точку не покрывают. Так что этот алгоритм будет работать за O(N) в худшем случае, но в реальных случаях обычно гораздо быстрее.

Самый простой способ осуществить запрос на поиск квадратов: рассмотрим все иксы вершин квадратов, отсортируем, и будем рассматривать по два соседних (в порядке сортировки) икса: X_i и X_{i+1}. Область между этими двумя иксами - это вертикальная полоса. Заранее для каждого i сделаем список квадратов, которые попадают в эту полосу. Тогда, когда поступает запрос в виде точки P(PX,PY), надо сначала за O(logN) (бинарным поиском) найти i, т.е. вертикальную полосу, в которую попала наша точка, а потом за O(logN)  (тем же бинарным поиском) уже поиском внутри вертикальной полосы найти один квадрат, лежащий на точке (PX,PY), ну а потом двигаясь по полосе, за O(количества_квадратов_в_ответе) получить список всех квадратов, покрывающих точку. Итого асимптотика поиска O(logN + количество_квадратов_в_ответе), но достаточно большие затраты на предобработку и память: O(N^2). Если это не устраивает, есть и лучшие алгоритмы, с меньшим потреблением памяти.
PM MAIL WWW ICQ   Вверх
Homer
Дата 13.1.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



maxdiver, этот метод был наш основной вариантsmile Но в итоге решили использовать квадродерево, приблизительно то же самое что предлагал Earnest. При инициализации выполняется разбиение на четыре участка от средней точки, потом эти участки так же разбиваются и тд до заданного уровня детализации, в последних секторах хранится список всех окружностей входящих в него, которые затем и проверяются на попадание точки. Т.о. алгоритм поиска довольно прост, сравниваются только координаты точки с координатами средней точки текущего узла дерева и определяется следующий сектор.
Наверное, этот алгоритм оптимальный для данной задачи, так что, думаю, решение найдено. Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.