Естественным функциональным способом представления изображения является использование индексной функции:
Image :: (Int,Int) -> Color
. При таком представлении будет выполнено перетаскивание области от одного изображения к другому с помощью
blit area a b = \(x,y) -> if (x,y) `isInsideOf` area then a (x,y) else b (x,y)
*.1006 * Если требуется перевод или другое преобразование, его можно напрямую применить к координатам:
translate (dx,dy) image = \(x,y) -> b (x+dx,y+dy)
Это представление дает вам естественный способ работы с точками изображения.Например, вы можете легко работать с непрямоугольными областями и выполнять такие хитрости, как интерполяция изображения в качестве отдельной функции вместо того, чтобы быть частью ваших обычных алгоритмов масштабирования изображения:
quadraticInterpolation :: ((Int,Int) -> Color) -> ((Double,Double) -> Color)
В некоторых случаях производительность может пострадатьслучаи, например, когда вы объединяете несколько изображений в одно, а затем выполняете вычисления с результатом.Это приводит к цепочке тестов для каждого пикселя для каждого последующего расчета.Однако, применяя памятку, мы можем временно преобразовать функциональное представление в массив и преобразовать его обратно в его индексную функцию, тем самым устраняя снижение производительности для последовательных операций.
Обратите внимание, что памятка также может использоваться дляввести параллелизм в процесс.