Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Подскажите алгоритмы быстрого геометрического поиска?   Найти похожие ветки 

 
Unknown user ©   (2007-07-16 12:55) [0]

Имеется набор точек с двумерными координатами, как быстро отыскать ближайшую к произвольной Pnt точку, не перебирая весь набор? Как быстро найти ближайшую к Pnt точку в заданном направлении Dir, и углом поиска Ang?

Предполагаю, что следует использовать деревья. Что посоветуете?


 
Elen ©   (2007-07-16 12:57) [1]


> не перебирая весь набор?

Что мешает перебрать?


 
ЮЮ ©   (2007-07-16 13:00) [2]

> Что мешает перебрать?

Очевидно, количество, и время рассчета.
А человек "глянул на бумажку" - и сразу нужную точку видит :)


 
Unknown user ©   (2007-07-16 13:00) [3]

требования к быстродействию


 
MBo ©   (2007-07-16 13:41) [4]

>как быстро отыскать ближайшую к произвольной Pnt точку, не перебирая весь набор

QuadTree

Если набор точек постоянен, пожертвовать памятью, и заранее найти ближайшие пары точек.


 
StriderMan ©   (2007-07-16 13:44) [5]

а как точки хранятся?
если массивом координат? - тогда или упорядочивать или все перебирать

если массивом типа array[x,y] of boolean то все намного быстрее можно сделать


 
Sapersky   (2007-07-16 14:00) [6]

Здесь:
http://www.blackpawn.com/texts/cellular/default.html
(раздел "Making It Fast")
описывается вариант с bsp-деревьями, мне, правда, так и не удалось его реализовать.


 
MBo ©   (2007-07-16 14:38) [7]

Если задача такая:
Дан набор точек P[], и для произвольной точки X, не входящей в набор, нужно найти ближайшую из набора P, то быстрее всего будет построить диаграмму Вороного (объект, связанный с триангуляцие Делоне), и тогда поиск можно будет делать за O(Log(N)) или даже за O(1) (при раскраске диаграммы  в уникальные цвета)


 
Unknown user ©   (2007-07-16 14:47) [8]

to StriderMan

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

to Sapersky

спасибо за ссылку, но вроде есть готовые реализации BSP.

to МВо

спасибо


 
TUser ©   (2007-07-17 06:16) [9]

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


 
Unknown user ©   (2007-07-19 10:47) [10]

to TUser

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

to МВо

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

to Sapersky

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


 
MBo ©   (2007-07-19 11:11) [11]

>Unknown user
Строится диаграмма Вороного, рисуется на битмапе, и каждая ее ячейка закрашивается уникальным цветом(например, цвет = номер точки набора). Тогда для каждой входящей точки просто проверяем цвет в ее координатах.
Если размерность пространства велика, и битмап такой не сделать, то разделить диаграмму горизонтальными линиями, проходящими через ее вершины, ребра диаграммы вместе с этими линиями образуют треугольники и трапеции, бинарный поиск полосы, потом бинарный поиск треугольника или трапеции


 
Unknown user ©   (2007-07-19 12:21) [12]

to MBo

спасибо, теперь понятно. к тому же треугольники можно принимать за вырожденные трапеции. полученная структура вроде называется ППЛГ, если не ошибаюсь.


 
Sapersky   (2007-07-20 10:06) [13]


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


Там не совсем bsp, а, как выразился автор, "2D bastard son of a sphere-tree and a bsp-tree". Дело в том, что стандартные деревья, что bsp, что quad, дают "линейное" разделение пространства, а здесь требуется "округлое", пардон за дилетантскую терминологию.
При реализации этого bastard son кол-во сравнений у меня получилось сопоставимое с линейным поиском (возможно, что-то не так понял).

Диаграмма Вороного, наверное, лучше, если она строится достаточно быстро.



Страницы: 1 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
2-1188571097
sashap
2007-08-31 18:38
2007.09.30
Отправка символа другому окну


2-1188565851
writebuf(nil);
2007-08-31 17:10
2007.09.30
Проверить ASCII строку


8-1165830501
T54
2006-12-11 12:48
2007.09.30
Захват видео из области экрана монитора


15-1188367884
Человек
2007-08-29 10:11
2007.09.30
Исскуство создание компонент (Фаронов)


3-1179483915
Parenek
2007-05-18 14:25
2007.09.30
как узнать, добавлена ли запись ?