20 июня 2011 г.

Душераздирающее зрелище — сказал он наконец...

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

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

Итак:

A ...p1...p2...p3....................... B

speed - скорость (= 3)
angle - минимальный угол(шаг угла) поворота при обходе препятствий (= 15)
change - выполняется обход препятствия в данный момент или нет (= false)

1) На расстоянии speed от точки А, в направлении точки В, строим точку р1 (рХ).

2) Если точка рХ находится на пустом месте (можно туда передвинуть юнита) - двигаем, запоминаем что это не обход препятствия(change = false), потом по аналогии с пунктами 1 и 2 строим точку р2 (,p3,p4,... до B).
построение новой точки осуществляется на расстоянии speed от предыдущей, и в направлении к точки B.

3) Если точка рХ занята - поворачиваем точку рХ вокруг точки р(Х-1) на угол angle* и запоминаем что мы начали обход препятствия (change = true)
*важно! поворот выполняется в произвольную сторону. но! если уже происходит обход препятствия (change == true)- направления поворота менять нельзя!

3.1) Если после поворота позиция доступна - передвигаем юнита и начинаем строить следующую точку (пункт 1)
3.2) Если после поворота позиция занята - поворачиваем точку рХ вокруг точки р(Х-1) на угол -angle*

*на практике мы попробуем повернуть точку в другую сторону.
если результата нет - увеличим угол поворота (на значение angle) и снова пробуем то в одну то в другую пока не найдём первую свободную (на которую можно перейти) точку.


если обход уже выполняется поворачивать нужно только в одну сторону! (просто увеличиваем угол и проверяем доступность).



Алгоритм прекрасно подходит для покадрового перемещения обьектов с обходом простых препятствий (например здания "обычных форм" с проходом между ними и тд).
Если на карте присутствуют препятствия из сложных форм - необходимо написать отдельный обработчик для случаев когда в пункте 3.2 начинаются попытки поворота на угол более чем 180 градусов.
(это значит юнит зашел в тупик...)

Алгоритм не претендует на поиск пути выхода из лабиринта с минотавром!

базовые функции геометрии можно найти тут http://palij.blogspot.com/2011/03/6.html или тут http://www.google.com.ua/

Комментариев нет:

Отправить комментарий