Поиск ячеек в сетке с различными размерами ячеек сетки - PullRequest
2 голосов
/ 10 марта 2010

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

Ячейки на сетке имеют одинаковые размеры (dx, dy), и между ячейками нет промежутков, но, поскольку каждая ячейка на плоскости имеет различное расстояние от начала координат, телесный угол, который они покрывают, не является постоянным - если я мог найти простую функцию, которая переводит направление (тэта, фи) в индекс клетки (ix, iy).

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

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

Ответы [ 2 ]

1 голос
/ 11 марта 2010

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

Как правило, в первом квадранте (т. Е. X> 0, y> 0), если у вас есть ячейка, заполняющая прямоугольник (x, y) -> (x + 1, y + 1), то любая строка с углы между atan2(y+1,x) и atan2(x,y+1) будут пересекать хотя бы часть ячейки.

В любом случае, если вы хотите выполнить общий поиск ближайшего соседа, вы должны разделить ваши данные на четырехугольное дерево . Это одна из рабочих лошадок вычисления ближайшего соседа в 2D. Вы также можете создавать многомасштабные сетки, если ваши данные редки (что на самом деле представляет собой особый случай четырехугольного дерева с особенно регулярным шаблоном деления, но это дает вам поиск в постоянном времени вместо log (N)).

1 голос
/ 11 марта 2010

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

Хотя они являются структурами данных, которые должны быть очень конкретными, я думаю, вы должны взглянуть на следующее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...