Просмотр полной версии : Быстрая тригонометрия...
Горбатый любит томно подумать при вызове Sin и Cos и прочей тригонометрии.
Каким образом его можно заставить быстро расчитать параболу траэктории полёта тела,брошенного под углом, по декартовым координатам?
x = x0 + v0t cosα
y = y0 + v0t sin α - (gt^2/2)
Типа выстрела с базуки в worms или прыжка супер Марио и т.д.
Но в отличии от прыжка Марио скорость не является константой (как и угол),так что лучше всё же подойдёт пример червяков,но сопротивлением воздуха можно принебречь.
При расчетах полета снаряда/пули/тела в условиях статичной гравитации нет нужды в синусах и косинусах
у тебя есть
Xobj
Yobj
DXobj
DYobj
и считай так
Xobj=Xobj+DXobj
Yobj=Yobj+DYobj
DXobj=DXobj+DXgravity
DYobj=DYobj+DYgravity
в 99% случаев этого достаточно
в любом случае синусы быстрее всего считать по табличке, рассчитанной заранее.
Для вычисления последовательного значения синуса, можно использовать рекурсивный цифровой генератор.
Xn = k * Xn-1 - Xn-2,
где:
k = 2 * cos (2 * PI * частота генерации / частота отсчетов),
стартовое Xn-2 = -амплитуда * sin (2 * PI * частота генерации / частота отсчетов),
На каждом шаге вычисляются:
X0 = k * X1 - X2
X2 = X1
X1 = X0
Таким образом имеем генератор синуса с одним умножением и одним сложением на итерацию. Умножение можно заменить на несколько сдвигов и сложений, если правильно подобрать константу k.
p.s.: Еще проще это делалось в игре Rick Dangerous 2, где почти по синусу колебался в менюшке персонаж. Там практически 2 сложения, если я не ошибаюсь.
Быстрее всего - забить в память таблицы Брадиса :) .
Быстрее всего - забить в память таблицы Брадиса
Это сколько килобайт займёт примерно?
Это сколько килобайт займёт примерно?
http://bradis-table.narod.ru/
Andrew771
23.01.2011, 21:53
Это сколько килобайт займёт примерно?
Смотря какая точность поворота на угол. ИМХО, можно и 2 градуса. Тогда для полного круга 180 значений по 2 (наверно) байта.
Barmaley_m
25.01.2011, 00:29
При изображении поведения брошенного тела (без учета сопр. воздуха) следует заметить, что по горизонтали движение тела является равномерным: проекция скорости на горизонтальную ось не меняется. Поэтому координата тела по оси икс зависит от времени линейно:
x(t) = x0 + v_x*t
Где x0 - начальная координата, v_x - скорость по горизонтали, обе константы.
Движение тела по вертикальной оси является равноускоренным под действием силы тяжести, и координата зависит от времени квадратично:
y(t) = y0 + v_y*t + g*t*t/2
где y0 - начальная координата, v_y - начальная скорость по вертикали, g - ускорение свободного падения.
Так что синусы здесь вычислять не надо, нужны только умножения - и то, если не заметить возможности устранить и их.
Для изображения движения на экране нужно знать значения координат через равные промежутки времени dt. Если вычислять не сами координаты, а их разность с предыдущими значениями, то можно выразить значение каждой координаты в следующий момент времени через ее значение в предыдущий момент времени. Для координаты по горизонтали получим:
x[i] = x[i-1] + v_x*dt
Поскольку v_x и dt обе являются константами - то их произведение нет необходимости вычислять каждый раз заново. Можно его вычислить один раз и получить для координаты по оси икс:
x[i] = x[i-1] + dx.
Где dx = v_x*dt - константа. Умножение уходит, остается только сложение.
Аналогично можно поступить с вертикальной координатой:
y[i] = y[i-1] + v_y[i-1]*dt + g*dt*dt/2
v_y[i] = v_y[i-1] + g*dt
Здесь g*dt*dt/2 и g*dt являются постоянными величинами, так что их не надо вычислять каждый кадр, можно вычислить один раз перед выстрелом. В результате снова имеем только сложение, без умножений, не то что синусов.
Эффективный способ вычисления синусов (если для каких-то целей нужно много синусов в последовательности) через разностные уравнения подсказал Titus. Если нужен каждый раз синус разного угла (а не в последовательности) - то нужно использовать таблицы. Размер таблиц подбирать исходя из требуемой точности. Если нужна такая точность, что таблицы не умещаются в память - то использовать линейную интерполяцию между соседними значениями в таблице.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot