На то он и тест на уровень знания. Он не дает ответа «ДА» или «НЕТ». Тут много исходов. И обычно тесты не является основанием приема на работу или отказа, а просто тема для разговора.
Согласен, это кажется бредом, но загляните в сишный код какой-либо старой библиотеки. Вы измените свою точку зрения. Среди железячников такого кода масса. Руки бы им оторвать за такой код.
Извините, в матрице A ошибка:
a1 a2
0 1
и ответ:
a1 = cos(alpha)
a2 = sin(alpha)
b1 = -sin(alpha) / cos(alpha) = -tg(alpha)
b2 = 1 / cos(alpha)
Еще такой подход не работает на углах поворота близких к 90 градусам. Можно работать от -45 до 45, а иначе работать с модификацией, которая как бы поворачивающей заранее изображение на 90 градусов (меняет х и у местами).
Здесь синус и косинус угла надо вычислять заранее только один раз на кадр. Как вариант можно таблицу записать и интерполировать. Но зачем это делать, если это уже сделано в CORDIC?
При рекуррентном вычислении надо быть осторожным. Ошибка копиться будет. Можно обратно в 0 градусов не вернуться.
Поворот на ПЛИС можно сделать двумя последовательными косыми сдвигами. Отдельно по строкам, отдельно по столбцам. Тогда с памятью идет поточная работа. В результате выходит последовательное применение двух одномерных фильтров. Справедливости ради, стоит сказать, что это не совсем «косой сдвиг», но суть близкая. Пусть сначала идет обработка по строкам (матрица A), а потом по столбцам (матрица B). Матрица поворота (М) раскладывается так (для аффинных преобразований такой прием проходит): B * A = M A вида (косой горизонтальный сдвиг)
a1 a2
1 0 B вида (косой вертикальный сдвиг)
1 0
b1 b2
т.е.
x* = a1 x + a2 y
y* = b1 x* + b2 y (стоит обратить внимание, что «x» тут новое)
Осталось найти коэффициенты (a1, a2, b1, b2) этих матриц. Выходит система уравнений. Ответ:
a1 = cos(alpha)
a2 = sin(alpha)
b1 = cos(alpha) / sin(alpha) = ctg(alpha)
b2 = -1 / sin(alpha)
Лучше С задавать не в функции P.
a1 a2
0 1
и ответ:
a1 = cos(alpha)
a2 = sin(alpha)
b1 = -sin(alpha) / cos(alpha) = -tg(alpha)
b2 = 1 / cos(alpha)
Еще такой подход не работает на углах поворота близких к 90 градусам. Можно работать от -45 до 45, а иначе работать с модификацией, которая как бы поворачивающей заранее изображение на 90 градусов (меняет х и у местами).
При рекуррентном вычислении надо быть осторожным. Ошибка копиться будет. Можно обратно в 0 градусов не вернуться.
B * A = M
A вида (косой горизонтальный сдвиг)
a1 a2
1 0
B вида (косой вертикальный сдвиг)
1 0
b1 b2
т.е.
x* = a1 x + a2 y
y* = b1 x* + b2 y (стоит обратить внимание, что «x» тут новое)
Осталось найти коэффициенты (a1, a2, b1, b2) этих матриц. Выходит система уравнений. Ответ:
a1 = cos(alpha)
a2 = sin(alpha)
b1 = cos(alpha) / sin(alpha) = ctg(alpha)
b2 = -1 / sin(alpha)