Кажется, что вы хотите округлить до числа октанта, предположительно от -22.5°
до 337.5°
с шагом 45°
.
Октанты разделены четырьмя линиями через начало координат с уравнением
Y = X tan(Θ),
or
a.Y - b.X = 0.
с подходящими коэффициентами масштабирования.
Вычислив знаки этих выражений для четырех искомых углов, вы найдете октант. Умной комбинацией вы можете ограничиться тремя оценками знаков, так как существует 8=2³
возможностей.
Вполне вероятно, что это можно оценить с помощью инструкций SIMD, вычислив дискриминантные выражения, их знаки и подходящие комбинации их знаков, но это не тривиально.
Вероятно, преобразование в число, кратное 45°, не требуется, даже порядковая нумерация. Все зависит от того, что вы делаете с информацией о октанте.
Дополнительное предложение SIMD:
С предварительно загруженными коэффициентами вы можете вычислить все четыре линейных уравнения за один раз для пары (X, Y), используя 16-битную целочисленную арифметику (возможно, с умножением и сложением). Затем получите знаки и упакуйте их в четыре бита с помощью _mm_movemask_epi8
. Используйте четырехбитное значение в качестве входных данных для небольшой таблицы поиска.
person
Yves Daoust
schedule
31.07.2015
std::atan2()
работает медленно? Вы измеряли его процессорное время? Вы смотрели на дизассемблирование, которое компилятор C++ генерирует в режиме Release? Развеatan2
уже не одна инструкция FPU? - person Serge Rogatch   schedule 31.07.2015