Элементы с конкретным смещением в массиве на указанную сумму сдвига
Я пытаюсь написать функцию на C, которая будет принимать изображение (двумерный массив пикселей), а затем сдвигать все столбцы в двумерном массиве на указанное число столбцов на месте. Если цвет смещен "с" изображения, он должен обернуться вокруг.
У меня написан алгоритм, и он, кажется, работает для определенного типа изображения, с которым я работаю, это 266 пикселей в высоту и 427 в ширину, но этот алгоритм сломается, если сдвиг является каким-либо фактором изображения, которое не ' t 1 или ширина изображения.
Вот код:
void shiftImage(Picture * pic, int shift) {
int baseIndex = 0;
int width = pic->width;
//make shift as small as possible while maintaining the effect by moduloing the shift. Ensure shift is positive during modulo:
if(shift < 0) {
shift *= -1;
shift = shift % width;
shift *= -1;
} else {
shift = shift % width;
}
for(int height = 0; height < pic->height; height++) {
int index = baseIndex;
Pixel nextPixelToShift;
Pixel pixelGettingShifted = pic->pix_array[height][baseIndex];
//shift every pixel in the row by shift amount
do {
index = index + shift;
//if index < 0, then wrap to end of array and move back proper num of cols. Otherwise, wrap back to the beginning using mod.
if(index < 0) {
index = width + index;
} else {
index = index % width;
}
nextPixelToShift = pic->pix_array[height][index];
pic->pix_array[height][index] = pixelGettingShifted;
pixelGettingShifted = nextPixelToShift;
} while (index != baseIndex);
}
Любой совет, что я могу сделать, чтобы этот алгоритм работал с любой величиной смены?
Я знаю, что мог бы достичь этого, создав временный массив того же размера, что и строка на рисунке. Затем я мог бы перебрать каждый элемент в строке массива изображения и, для каждого элемента, скопировать его в временный массив со смещенным индексом. Как только я закончил копирование всего этого в временный массив, я мог просто скопировать элементы временного массива в массив рисунков. Тем не менее, я беспокоюсь об использовании памяти при этом, хотя массив будет освобожден после каждого цикла. Это также будет менее эффективным.