Элементы с конкретным смещением в массиве на указанную сумму сдвига

Я пытаюсь написать функцию на 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);
}

Любой совет, что я могу сделать, чтобы этот алгоритм работал с любой величиной смены?

Я знаю, что мог бы достичь этого, создав временный массив того же размера, что и строка на рисунке. Затем я мог бы перебрать каждый элемент в строке массива изображения и, для каждого элемента, скопировать его в временный массив со смещенным индексом. Как только я закончил копирование всего этого в временный массив, я мог просто скопировать элементы временного массива в массив рисунков. Тем не менее, я беспокоюсь об использовании памяти при этом, хотя массив будет освобожден после каждого цикла. Это также будет менее эффективным.

0 ответов

Другие вопросы по тегам