Немного тригонометрии для 2D игр, первое, что нужно это способы перевода из радианы в углы и из углов в радианы. Листинги будут на C#, но на любой другой язык могу быть перенесены без проблем, я считаю.
Имеем угол в градусах, хотим получить угол в радианах.
radianAngle = GradAngle*(Math.PI/180);
Имеем угол в радианах, хотим получить угол в градусах.
GradAngle=RadianAngle*(180/Math.PI);
Для того что бы определить расстояние между двумя точками в декартовой системе координат, можно воспользоваться теоремой Пифагора о прямоугольных треугольниках (идея состоит в построении прямоугольного треугольника, две искомые точки будут представлять гипотенузу в нем). Как следствие получим следующее уравнение.
double distance = Math.Sqrt(Math.Pow(x1-x2,2)+Math.Pow(y1-y2,2));
Для нахождения проекции отрезка на оси абсцисс и/или ординат нужно воспользоваться тригонометрическими формулами.
Проекция на ось абсцисс.
double x = Math.Cos(angle)*length;
Проекция на ось ординат.
double y = Math.Sin(angle)*length;
Это определенный минимум, спрашивается, зачем это нужно, представим, что нам нужно смоделировать поведение некоторого физического объекта, пусть это будет воздушный шарик и действовать на него будут 3 силы.
Сила притяжения, подъемная сила и сила ветра (ветер дует слева на право). Для того что бы смоделировать поведение этого шарика, нам нужно суммировать значения этих трех векторов. Наши расчеты примут следующий вид.
int Gravity = 4; int GravityAngle = 90; int Wind = 5; int WindAngle = 45; int RisePower = 6; int RisePowerAngle = 270; int x = (int)(Gravity * Math.Cos(GravityAngle * Math.PI / 180)); int y = (int)(Gravity * Math.Sin(GravityAngle * Math.PI / 180)); x += (int)(Wind * Math.Cos(WindAngle * Math.PI / 180)); y += (int)(Wind * Math.Sin(WindAngle * Math.PI / 180)); x += (int)(RisePower * Math.Cos(RisePowerAngle * Math.PI / 180)); y += (int)(RisePower * Math.Sin(RisePowerAngle * Math.PI / 180));
Рассмотрим еще один пример, у нас есть тайл велосипеда, он ориентирован по горизонтали, но нам нужно, чтобы при изменении направления движения менялся и сам угол поворота, этого тайла. Выход будет в следующем,
что бы узнать, на сколько повернуть изображения, можно воспользоваться формулой.
RotationAngle = Math.Atan2(x_mov,y_mov)*(180/Math.PI);
Вот этот просто пример может проиллюстрировать применение всего того не большого что здесь изложено.
Оставить комментарий