Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм определения попадания точки в контур, Необходим самый быстрый алгоритм 
:(
    Опции темы
Dementor
Дата 27.11.2014, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!

Как всегда за помощью прихожу сюда.

Итак, что имеется: в свое время, когда мне нужен был алгоритм определения попадания точки в контур, я отыскал подходящий тут.
Представленный там алгоритм (самый конец статьи) работает достаточно быстро когда речь идет о достаточно небольшом объеме данных (например, отлично справляется с ситуацией, когда несколько сотен тысяч точек (даже миллион) и множество (до нескольких сотен) мелких контуров, состоящих из 4-5 вершин). Но сейчас я столкнулся с ситуацией, когда необходимо обработать несколько сотен миллионов точек при этом контуры, вхождения в которые я проверяю, могут состоять из десятков тысяч вершин. И вот тут возникает проблема - быстродействие просто ужасное.

Понятно, что пути два (ну или я вижу только два): либо вводить потоки и кучу точек делить на количество ядер и далее каждое ядро будет проверять свою кучу, либо подыскать алгоритм, который сам по себе будет давать гораздо более адекватное быстродействие.

Очень прошу подсказать существуют ли какой-то сверхбыстрый алгоритм для решения подобных задач?

Дополнительно: в принципе т.к. важна именно скорость, то можно пожертвовать памятью - алгоритм может отжирать сколько ему угодно, лишь бы работал быстро.

Заранее всем откликнувшимся огромное спасибо!
PM MAIL   Вверх
baldina
Дата 27.11.2014, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



насколько сложные формы контуров образует этот миллион точек? какова вероятность (на реальных данных), что тестовая точка находится внутри? можно сначала применять быстрый тест, например проверять на принадлежность описывающему прямоугольнику или окружности

Добавлено @ 12:08
Цитата(Dementor @  27.11.2014,  11:03 Найти цитируемый пост)
мелких контуров, состоящих из 4-5 вершин

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

Это сообщение отредактировал(а) baldina - 27.11.2014, 12:10
PM MAIL   Вверх
Dementor
Дата 27.11.2014, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina, вероятность попадания точки мала. Такова сама задача (т.е. если рассматривать именно частную задачу) - если взять вообще все проверяемые точки, то в требуемые контуры попадет не более 5-10%. Я еще думал над расчетом выпуклой оболочки контура для каждого контура - заведомо количество вершин в ней будет на порядок меньше, а ее расчет достаточно прост и быстр. Т.е. фактически это тоже, что предлагаете и Вы (если я правильно Вас понял) - для начала посмотреть будет ли точка лежать внутри этой оболочки, а потом уже смотреть, а будет ли она лежать внутри самого контура. Это конечно некий костыль, но в общем-то производительность точно повысится.
PM MAIL   Вверх
baldina
Дата 27.11.2014, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dementor @  27.11.2014,  12:15 Найти цитируемый пост)
если я правильно Вас понял

да

Добавлено через 5 минут и 46 секунд
если области небольшие и примерно одинаковые по габаритам, можно поступить наоборот: проверить, какие точки контуров попадают в окружность c центром в тестируемой точке и радиусом равным среднему габариту, а дальше смотреть полигоны, которым принадлежат эти точки. 

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


Шустрый
*


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

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



baldina, Попробовал с помощью выпуклых оболочек, которые создаются для каждого контура - прирост есть. Плюс дописал еще специфические костыли под саму задачу - тоже чуть подускорилось.
Сами контуры разнятся как небо и земля - есть контуры, площадь которых не больше пары-тройки десятков метров, а есть такие, площадь которых уходит за десяток квадратных километров.

Вот с триангуляцией я как-то не продумал. Да, если каждый контур выразить множеством треугольников, то нужно будет перебрать эту кучу до первого попадания и все... Надо будет проверить это - сам просто с триангуляцией не сталкивался (ну не с самой триангуляцией, а ее реализацией в коде).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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