■························[Математика]·························■
Q: Объясните мне пожалуйста смысл, как вычисляется синус по
таблице. Вроде, как я понял, таблица вычисляется
sint=round(sin(i/256)*127+128), тогда как например посчитать
синус 30rp., то есть sin(pi/6)? И вообще, что это за магические
цифры 127,128?
A: [Alexander Shulepov 2:5020/1737.25]
Начнем с азов. В круге y нас 360 градусов, или 2*Pi. Но число
360 нам несколько не удобно, так как если мы будем использовать
precalculate (то есть создание массива со значениями sin/cos в
каждом из 360 градусов) нам придется отслеживать ситуации когда
угол синус/косинус, которого мы хотим найти находится вне
промежутка 0..360 градусов (на самом деле 0..359, так как 0 и
360 градусов - это один и тот же угол) и пpиобpазовывать этот
угол в соответствующий ему, лежащий в указанном промежутке. Как
нам этого избежать? Да очень просто, поделим круг не на 360
частей, а на 256, тогда снимается проблема отслеживания значения
угла. Нам достатючно использовать тип char для переменной в
которой хранится значение угла. Все проверки выполняются
автоматически и не жрут ресурсов. Формулы для преобразований
выводятся элементарно. Теперь насчет магических чисел... Почти
везде стараются заменить числа с плавающей запятой, на числа с
фиксированной точкой. Если fixed point y нас x.8, то все числа с
плавающей точкой умножаются на 256. В примере с водичкой, массив
высот был типа unsigned char, то есть максимальная высота равна
255. Вют отсюда и берутся числа 127, 128. 128 - это уровень
спокойной воды, а 127 есть амплитуда колебаний волн. Вот в итоге
и получается формула: sintable[k]=sin(2*PI*k/256)*127+128;
Other articles: