В ходе разработки различных игровых приложений или симуляторов часто ставится задача перемещения объекта или группы объектов вдоль направляющей кривой. При этом необходимо постоянно адаптировать относительное положение объектов, поворачивая их на соответствующий угол. Примером такой задачи является приложение с функционалом построения траекторий перемещения игроков [1]. Направление перемещения игрока по траектории задается изображением стрелки, находящейся на одном из концов траектории. Поворот стрелки необходимо совершать на угол, соответствующий реальному углу наклона траектории в конечной фазе.
Для решения поставленной задачи можно использовать различные математические методы: векторный, матричный или тригонометрический [2]. Для рассматриваемого случая было решено использовать тригонометрический метод, т.к. его реализация наиболее проста при использовании языка программирования ActionScript версии 3.0 [3].
Для построения изображения стрелки нам нужно два прямоугольных треугольника, симметричных относительно траектории (рисунок 1).
Рисунок 1. Схема для вычисления поворота стрелки
Рассмотрим один из треугольников ABC. Изначально известны координаты двух его вершин A и B, лежащих на одном отрезке, являющемся последним участком траектории. Нам необходимо найти координаты вершины C, находящейся в стороне от траектории. При этом треугольник ABC является прямоугольным с прямым углом в вершине A.
Найдем угол между стороной AB и осью OY:
Ниже приведен фрагмент листинга программы, в которой реализован алгоритм решения поставленной задачи.
…
tPoint = Line.path.getPathPoint(Line.path.Length — 15);
xa = tPoint.x;
ya = tPoint.y;
tPoint = Line.path.getPathPoint(Line.path.Length);
xb = tPoint.x;
yb = tPoint.y;
b = 5;
fi = Math.atan((xa — xb) / (ya — yb));
xc = xa + b * Math.cos(Math.PI — fi);
yc = ya + b * Math.sin(Math.PI — fi);
mc.graphics.LineStyle(1, 0xFFFFFF, 1, false,
LineScaleMode.NONE, CapsStyle.SQUARE);
mc.graphics.moveTo(xb, yb);
mc.graphics.LineTo(xc, yc);
xc = xa — b * Math.cos(Math.PI — fi);
yc = ya — b * Math.sin(Math.PI — fi);
mc.graphics.LineTo(xc, yc);
…
Данный метод можно использовать и для других подобных задач, где необходимо совершать повороты объектов. Однако в целом ряде случаев, когда необходимо динамическое выполнение операции поворота над одним и тем же объектом, наиболее эффективно будет использовать метод с применением матрицы поворота.
Список литературы:
- Maggio E., Cavallaro A. Video tracking. Theory and practice. Wiley, 292 pages, 2011.
- Szeliski R. Computer Vision. Algorithms and Applications. Washington, Springer, 793 pages, 2011.
- Программирование на Adobe ActionScript 3.0 — type=»book» name=»РАЗРАБОТКА АЛГОРИТМА ПОВОРОТА ОБЪЕКТА ОТНОСИТЕЛЬНО НАПРАВЛЯЮЩЕЙ ДВИЖЕНИЯ» description=»При создании динамических сцен на двумерной плоскости зачастую ставится задача по перемещению объекта вдоль направляющей кривой. В работе предложен тригонометрический метод решения задачи. Применение данного метода показало высокую эффективность, когда работа над объектом осуществляется эпизодически. Однако для непрерывного выполнения операции поворота целесообразнее использовать матрицу поворота.» author=»Егорова Дарья Владимировна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-03-12″ edition=»ЕВРАЗИЙСКИЙ СОЮЗ УЧЕНЫХ_30.05.2015_05(14)» ebook=»yes» ]