Пересечение прямой ячеек сетки
От: BYBelorus Беларусь N/A
Дата: 25.05.13 12:22
Оценка:
Добрый день.
Вопрос глупейший, подозреваю сказывается отсутствие ВО в области (менеджер самого среднего звена по образованию)

Есть сетка N x M, есть точка S(x,y) из которой проведена прямая в F(x,y).
Задача определить ячейки которые пересекаются прямой с некой толерантностью (если прямая идёт очень близко к некой ячейке но не пересекает её, мы всё равно засчитаем по причине попадания в зону толерантности).

Вот недокартинка иллюстрирующая что мне нужно.
https://www.dropbox.com/s/gjxdwqapyafdh69/Clipboard01.png
На картинке розовая — прямая, зеленое — зона толерантности, и алгоритм должен обозначить левую нижнюю ячейку как попадающую под прямую.

Сейчас алгоритм написан крайне неэффективно. Я прохожу по каждой точке прямой с константным небольшим шагом (около 1/100) размера ячейки и проверяю принадлежность точки на этом шаге какой либо ячейке. После этого проверяется зона вокруг точки (проверяю псевдоокружность с константным радиусом с шагом 45 градусов, и проверяю ячейки по этой окружности).

Оно примерно даёт то что нужно, но работает с совершенно неприемлемой скоростью да и точность далека от идеала (а для алгоритма крайне нежелательны false-negative результаты, уж лучше false-positive).

Подскажите пожалуйста в какую сторону покопать.
Ищу работу Windows Phone разработчиком.
Re: Пересечение прямой ячеек сетки
От: BYBelorus Беларусь N/A
Дата: 25.05.13 12:28
Оценка:
Вернее конечно же алгоритм должен вернуть все 4 ячейки в результате. Имеется в виду что левая нижняя тоже должна быть в результате (хоть и не под прямой непосредственно)
Ищу работу Windows Phone разработчиком.
Re: Пересечение прямой ячеек сетки
От: Qbit86 Кипр
Дата: 25.05.13 12:40
Оценка:
Здравствуйте, BYBelorus, Вы писали:

BYB>Есть сетка N x M, есть точка S(x,y) из которой проведена прямая в F(x,y).

BYB>Задача определить ячейки которые пересекаются прямой с некой толерантностью (если прямая идёт очень близко к некой ячейке но не пересекает её, мы всё равно засчитаем по причине попадания в зону толерантности).

Вначале посчитай координаты точек S', F', S'' и F'' — концов отрезков, представляющих собой границы полосы толерантности. Вместо решения задачи для «толстого» отрезка реши два экземпляра задачи для «тонких» отрезков.

BYB>Подскажите пожалуйста в какую сторону покопать.


Тебе нужно найти пересечение твоего отрезка с несколькими вертикальными линиями сетки, проходящими через AABB твоего отрезка. Две ячейки, прилегающие к каждой точке пересечения пометь. Аналогично для нескольких горизонтальных линий сетки.
Глаза у меня добрые, но рубашка — смирительная!
Re: Пересечение прямой ячеек сетки
От: watch-maker  
Дата: 25.05.13 13:34
Оценка: 68 (1)
Здравствуйте, BYBelorus, Вы писали:

BYB>Подскажите пожалуйста в какую сторону покопать.

Стоит посмотреть на алгоритм Ву. Он как раз находит ячейки, и долю пересечения их с толстой прямой. Вот из этой доли уже можно вычислять свой уровень толерантности.
Либо можешь начать даже с алгоритма Брезенхема — он проще, так как считает лишь точное пересечение, то есть с ним всё равно придётся проверять пару соседей ячейки. Но по крайней мере этот алгоритм ускорит продвижение вдоль прямой в сотню раз.
Re: Пересечение прямой ячеек сетки
От: minorlogic Украина  
Дата: 25.05.13 15:11
Оценка:
Найди растояние от прямой до ближайшего угла прямоугольника и добавь свйо толеранс. (растояние от точки до прямой легко гуглится)
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Пересечение прямой ячеек сетки
От: MBo  
Дата: 26.05.13 03:21
Оценка:
Q>Вначале посчитай координаты точек S', F', S'' и F'' — концов отрезков, представляющих собой границы полосы толерантности. Вместо решения задачи для «толстого» отрезка реши два экземпляра задачи для «тонких» отрезков.

Q>Тебе нужно найти пересечение твоего отрезка с несколькими вертикальными линиями сетки, проходящими через AABB твоего отрезка. Две ячейки, прилегающие к каждой точке пересечения пометь. Аналогично для нескольких горизонтальных линий сетки.


Угу, а вот алгоритм для нахождения заметаемых ячеек:
http://www.cse.yorku.ca/~amana/research/grid.pdf
http://www.flipcode.com/archives/Raytracing_Topics_Techniques-Part_4_Spatial_Subdivisions.shtml
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.