Я думал о платформах и врагах, движущихся по кругу в старых 2D играх, и мне было интересно, как это было сделано. Я понимаю параметрические уравнения, и для этого достаточно просто использовать sin и cos, но могут ли NES или SNES совершать триггерные вызовы в реальном времени? Я допускаю тяжелое невежество, но я думал, что это были дорогостоящие операции. Есть ли какой-нибудь умный способ рассчитать это движение дешевле?
Я работал над выводом алгоритма из идентификаторов суммы триггера, который использовал бы только предварительно рассчитанный триг, но это кажется запутанным.
Ответы:
На таких аппаратных средствах, которые вы описываете, общее решение общего случая - просто создать справочную таблицу для интересующих ее функций тригонометрии, иногда в сочетании с представлениями значений с фиксированной точкой.
Потенциальная проблема этого метода заключается в том, что он потребляет пространство памяти, хотя вы можете преуменьшить его, выбрав более низкое разрешение данных в вашей таблице или воспользовавшись периодическим характером некоторых функций, чтобы хранить меньше данных и отражать их во время выполнения.
Тем не менее, для специфического обхода кругов - либо для их растеризации, либо для перемещения чего-либо по одному, может быть использован вариант линейного алгоритма Брезенхэма . Конечно, фактический алгоритм Брезенхэма также полезен для обхода линий, которые не стоят в восьми «основных» направлениях достаточно дешево.
источник
Есть вариант алгоритма Брезенхэма от Джеймса Фрита , который должен быть еще быстрее, поскольку он полностью исключает умножение. Для этого не требуется никакой справочной таблицы, хотя можно сохранить результаты в таблице, если радиус остается постоянным. Поскольку оба алгоритма Брезенхэма и Фрита используют 8-кратную симметрию, эта таблица поиска будет относительно короткой.
источник
xoff++ + xoff
и--yoff + yoff
. Ваш список изменений исправит это, подумайте о том, чтобы исправить это на месте, а не как примечание. (См. Параграф 4 параграфа 5 стандарта C ++ для примеров и стандартов, в которых это явно выражено)balance += xoff++ + xoff
иbalance -= --yoff + yoff
. Я оставил это без изменений, так как именно так был изначально написан алгоритм Фрита, а позднее исправление было добавлено им самим (см. Здесь ). Исправлено сейчас.Вы также можете использовать приблизительную версию функций триггера, используя расширения Тейлора http://en.wikipedia.org/wiki/Taylor_series
Например, вы можете получить разумное приближение синуса, используя первые четыре члена ряда Тейлора
источник
Один удивительный алгоритм для равномерного перемещения по кругу - это алгоритм Гертцеля . Требуется только 2 умножения и 2 сложения за шаг, нет таблицы поиска и очень минимальное состояние (4 числа).
Сначала определите некоторые константы, возможно, жестко закодированные, исходя из требуемого размера шага (в данном случае 2π / 64):
Алгоритм использует 4 числа в качестве своего состояния, инициализированного так:
И, наконец, основной цикл:
Это может продолжаться вечно. Вот первые 50 баллов:
Алгоритм, конечно, может работать на оборудовании с фиксированной точкой. Чистая победа над Брезенхэмом - это постоянная скорость по кругу.
источник