Важная информация

User Tag List

Показано с 1 по 9 из 9

Тема: Быстрая тригонометрия...

  1. #1
    Veteran Аватар для ALKO
    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    1,448
    Благодарностей: 358
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question Быстрая тригонометрия...

    Горбатый любит томно подумать при вызове Sin и Cos и прочей тригонометрии.
    Каким образом его можно заставить быстро расчитать параболу траэктории полёта тела,брошенного под углом, по декартовым координатам?
    x = x0 + v0t cosα
    y = y0 + v0t sin α - (gt^2/2)
    Типа выстрела с базуки в worms или прыжка супер Марио и т.д.
    Но в отличии от прыжка Марио скорость не является константой (как и угол),так что лучше всё же подойдёт пример червяков,но сопротивлением воздуха можно принебречь.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,379
    Благодарностей: 719
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    При расчетах полета снаряда/пули/тела в условиях статичной гравитации нет нужды в синусах и косинусах
    у тебя есть
    Xobj
    Yobj
    DXobj
    DYobj
    и считай так
    Xobj=Xobj+DXobj
    Yobj=Yobj+DYobj

    DXobj=DXobj+DXgravity
    DYobj=DYobj+DYgravity

    в 99% случаев этого достаточно
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

  4. #3
    Guru
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,091
    Благодарностей: 924
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    в любом случае синусы быстрее всего считать по табличке, рассчитанной заранее.

  5. #4
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    9,970
    Благодарностей: 3445
    Mentioned
    2 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Для вычисления последовательного значения синуса, можно использовать рекурсивный цифровой генератор.

    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 сложения, если я не ошибаюсь.

  6. Эти 2 пользователя(ей) поблагодарили Titus за это полезное сообщение:
    introspec (14.05.2013), psb (23.01.2011)

  7. #5
    Guru
    Регистрация
    15.01.2005
    Адрес
    USSR
    Сообщений
    2,038
    Благодарностей: 331
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Быстрее всего - забить в память таблицы Брадиса .

  8. Этот пользователь поблагодарил Wlodek за это полезное сообщение:
    GriV (25.01.2011)

  9. #6
    Veteran Аватар для ALKO
    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    1,448
    Благодарностей: 358
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Wlodek Посмотреть сообщение
    Быстрее всего - забить в память таблицы Брадиса
    Это сколько килобайт займёт примерно?

  10. Этот пользователь поблагодарил ALKO за это полезное сообщение:
    GriV (25.01.2011)

  11. #7
    Activist
    Регистрация
    20.02.2008
    Адрес
    Siauliai, Lithuania
    Сообщений
    343
    Благодарностей: 165
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    Это сколько килобайт займёт примерно?
    http://bradis-table.narod.ru/

  12. Этот пользователь поблагодарил Protom за это полезное сообщение:
    GriV (25.01.2011)

  13. #8
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,507
    Благодарностей: 671
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    Это сколько килобайт займёт примерно?
    Смотря какая точность поворота на угол. ИМХО, можно и 2 градуса. Тогда для полного круга 180 значений по 2 (наверно) байта.

  14. #9
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    883
    Благодарностей: 471
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    При изображении поведения брошенного тела (без учета сопр. воздуха) следует заметить, что по горизонтали движение тела является равномерным: проекция скорости на горизонтальную ось не меняется. Поэтому координата тела по оси икс зависит от времени линейно:
    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. Если нужен каждый раз синус разного угла (а не в последовательности) - то нужно использовать таблицы. Размер таблиц подбирать исходя из требуемой точности. Если нужна такая точность, что таблицы не умещаются в память - то использовать линейную интерполяцию между соседними значениями в таблице.

  15. Этот пользователь поблагодарил Barmaley_m за это полезное сообщение:
    GriV (25.01.2011)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Мега быстрая загрузка с кассеты???
    от ALEXEY.GORDEEV в разделе Софт
    Ответов: 47
    Последнее: 21.11.2010, 11:06
  2. Ответов: 4
    Последнее: 16.06.2010, 18:37

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •