Задать вопрос
SlandShow
@SlandShow
70% of my body is made of movies.

Как правильно реализовать поворот и движение фигуры?

Всем доброго времени суток.

Суть задачи заключается в реализации поворота фигуры (например, треугольника) налево или направо на N градусов.
При этом само движение должно осуществляться только одной кнопкой. А треугольник будет направляться в разные стороны в зависимости от поворота.

Т.е при нажатии, допустим, на клавишу W треугольник перемещается вперед в зависимости от его текущего поворота. Если мне надо повернуть налево, то я сначала нажимаю на клавишу A и вместе с ней еще нажимаю на W.

Мне нужно сделать аналог игры Asteroids

Как лучше реализовать такой алгоритм, так как самому ничего в голову не приходит?

P.S: В прошу использовать си-подобные или питон. Ну алгоритмический язык или псевдокод тоже подойдет.

Заранее благодарю.
  • Вопрос задан
  • 1117 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Это базовые элементарные вещи - используйте тригонометрию. Если направление d градусов (от горизонтальной оси) и вам надо сдвинутся вдоль него на расстояние s, то изменения по осям:

dx = s*cos(d);
dy = s*sin(d);

Обычно, аргументы библиотечных функций cos и sin задаются в радианах. Так что, если у вас d в градусах -то его надо домножить на Pi/180.0

Эти же синусы и косинусы нужно использовать для отрисовки треугольника. Если, координаты центра x0, y0 - то координаты вершины-острия будут
x0+triangle_size*cos(d);
y0+triangle_size*sin(d);

Две другие вершины строятся точно так же, но, для вытянутой формы нужна другая константа множитель и углы там будут d+120.0 и d-120.0 (разные углы дадут разную форму треугольника).

Соответственно, алгоритм - при нажатии кнопки поворота увеличиваете или уменьшаете d. При нажатии кнопки движения сдвигаете координаты треугольника на (dx, dy).

Более продвинутые и быстрые решения используют матрицы поворота. Но проще всего это будет понять так - вы не считаете cos(d) и sin(d) каждый раз. А храните их значения. При повороте на угол alpha вам надо будет подсчитать новые значения, используя стандартные тригонометрические формулы из старых значений:

cos(d+alpha) = cos(d)*cos(alpha) - sin(d)*sin(alpha);
sin(d+alpha) = cos(d)*sin(alpha) + sin(d)*cos(alpha);

Прелесть этого метода в том, что при фиксированном шаге изменения угла alpha - вам нужно подсчитать синус и косинус только один раз для alpha, и потом использовать их везде при пересчете.
Ответ написан
Комментировать
Shull
@Shull
хочу быть хорошим IT-шником
Скажите, а может... Не поворачивать его вовсе? Может, лучше заменить его в час "X" другим треугольником, смотрящим в нужную сторону?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы