Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск расстояния от точки до ломанной 
:(
    Опции темы
Dementor
Дата 15.11.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго всем времени суток!
Из темы по Delphi меня отправили сюда.

Задача такая: найти точки, лежащие на определенном расстоянии до ломанной.

Как реализовано мною на данный момент:
1. Рассматриваем ломанную как набор отрезков;
2. Производим поиск точек, которые лежат в пределах концов отрезка (скалярным произведением векторов);
3. Если точка лежит в пределах отрезка, то вычисляем расстояние от нее до отрезка. Для этого находим высоту треугольника, который образовывают точки и концы отрезка.
4. Если высота оказывает меньше или равной заданному расстоянию, то добавляем точку в массив для дальнейшей работы.

В чем минус такого подхода - мне необходимо работать с миллионами точек (минимум несколько десятков тысяч, но чаще счет идет на миллионы). Ломанных тоже не мало - сотни или же тысячи, каждая состоит из нескольких десятков отрезков. Соответственно расчет занимает очень много времени - так как для каждого отрезка каждой ломанной производится нереально огромное количество вычислений.

Вопрос такой - есть ли возможность упростить поиск точек? Если какой-то способ вычислять расстояние до ломанной не разбивая ее на отрезки, а рассматривая целиком?
PM MAIL   Вверх
maxim1000
Дата 15.11.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



форма ломаной - ближе к прямой или улитки всякие могут быть?

какое примерно соотношение между длиной орезка ломаной и расстоянием для поиска (1:100, 1:10, 1:1, 10:1, 100:1, ...)?

какой процент точек обычно попадает в нужную область (1, 10, 99)?

с ответами на эти вопросы можно будет посоветовать что-то...


--------------------
qqq
PM WWW   Вверх
Akina
Дата 15.11.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dementor @  15.11.2012,  17:21 Найти цитируемый пост)
Как реализовано мною на данный момент:
1. Рассматриваем ломанную как набор отрезков;

2) Раздвигаем отрезок в обе стороны на макс. расстояние, когда точка ещё "возле отрезка". Получаем прямоугольник. Эффективный поиск точек, лежащих внутри прямоугольника, заданного координатами вершин, вроде уже обсуждался...
3) Строим окружности вокруг концов отрезка радиусом, равным макс. расстоянию, когда точка ещё "возле отрезка". Эффективный поиск точек, лежащих внутри окружности с известным центром и радиусом, вроде уже обсуждался...

Цитата(Dementor @  15.11.2012,  17:21 Найти цитируемый пост)
есть ли возможность упростить поиск точек?

Для начала - кластеризовать пространство, особенно если элементы ломаных и расстояние "нахождения рядом"по сравнению с пространством малы, а точки расположены более-менее равномерно.




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

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


Шустрый
*


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

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



Форма ломанной ближе к прямой. По сути это аппроксимация провода... поэтому это наверно даже ближе к параболе.
Соотношение между длиной отрезка и расстоянием до точки может быть разным, но чаще всего это 1:1 или 1:2
Процент попадания опять же разнится (все зависит от плотности точек), в один отрезок укладывается менее 1% точек.
PM MAIL   Вверх
_Y_
Дата 15.11.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Что, если попробовать как-то так:

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
maxim1000
Дата 15.11.2012, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



сначала написал кучу всего для случая с одной ломаной, потом заметил, что ломаных много smile

тогда уже можно строить более-менее сложные структуры

т.к. ломаных меньше, то лучше на них, даже на их отрезках

1. дерево:
разбиваем пространство на две половины по какой-нибудь оси так, чтобы слева и справа было приблизительно одинаковое количество отрезков
с половинами поступаем так же, пока не дойдём до достаточно маленьких наборов отрезков
ищем так же - смотрим, расстояние от каждой половины до точки, если больше нужного - отбрасываем всю половину, иначе анализируем её части
http://en.wikipedia.org/wiki/K-d_tree

2. сетка:
просто делим пространство на клетки, как в тетради в клеточку
в каждой клетке записываем номера отрезков, касающихся её
для поиска смотрим, какие клетки находятся вблизи точки и проверяем их отрезки

Добавлено через 1 минуту и 17 секунд
вспомнил, что уже описывал это: http://forum.vingrad.ru/index.php?showtopi...t&p=2528263


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


Шустрый
*


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

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



Цитата(maxim1000 @  15.11.2012,  22:56 Найти цитируемый пост)

1. дерево:
разбиваем пространство на две половины по какой-нибудь оси так, чтобы слева и справа было приблизительно одинаковое количество отрезков
с половинами поступаем так же, пока не дойдём до достаточно маленьких наборов отрезков
ищем так же - смотрим, расстояние от каждой половины до точки, если больше нужного - отбрасываем всю половину, иначе анализируем её части
http://en.wikipedia.org/wiki/K-d_tree

2. сетка:
просто делим пространство на клетки, как в тетради в клеточку
в каждой клетке записываем номера отрезков, касающихся её
для поиска смотрим, какие клетки находятся вблизи точки и проверяем их отрезки


Мда, все не так просто как хотелось бы.

Пока остановился над осмысливанием второго варианта - он мне более понятен. Теперь буду думать над реализацией этого подхода - обращусь за помощью в ветку по Delphi.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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