В глубине души вы спрашиваете: «Как я могу использовать графический процессор для решения этой проблемы?»
Современные графические процессоры - это, по сути, линейные движки алгебры, поэтому первым шагом будет определение вашей проблемы в виде матрицы, которая преобразует входную координату в ее вывод в однородном пространстве:
Например, вы бы представляли преобразование масштабирования x на & frac12 ;, масштабирование y на 1,2 и перевод вверх и влево на две единицы в виде:
, и вы можете разработать аналогичные преобразования для вращения , сдвига и т. Д.
После того как ваше преобразование представлено в виде умножения матрицы на вектор, все, что вам нужно сделать, это загрузить исходные данные в текстуру, указать преобразование как матрицу проекции и отобразить его в результат. Графический процессор выполняет умножение на пиксель. (Вы также можете написать шейдеры и т. Д., Которые выполняют более сложную математику, учитывают несколько векторов и матриц, а что-нет, но это основная идея.)
Тем не менее, после того, как ваша задача выражена в виде линейного преобразования, вы можете заставить ее работать намного быстрее и на процессоре, используя, например, SIMD или одну из много линейной алгебры библиотеки там. Если вам не нужна производительность в режиме реального времени или действительно большой объем данных для обработки, использование CUDA / GL / шейдеров и т. Д. Может оказаться более сложным, чем это того стоит, поскольку при инициализации библиотек задействовано несколько неуклюжих механизмов, настраивающих рендер. цели, изучение деталей разработки графики и т. д.
Простое преобразование вашего внутреннего цикла из специальной математики в хорошо оптимизированную подпрограмму линейной алгебры может дать вам достаточный прирост производительности на процессоре, который вы тут же сделали.