Тригономертия для 2D игр

Сентябрь 12th, 2011 § 0 comments

Немного тригонометрии для 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);

Вот этот просто пример может проиллюстрировать применение всего того не большого что здесь изложено.

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

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн