Элементы с круговым смещением в массиве на указанную величину сдвига - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь написать функцию на C, которая будет принимать изображение (двумерный массив пикселей), а затем сдвигать все столбцы в двумерном массиве на указанное число столбцов на месте.Если цвет смещен «с» изображения, он должен обернуться вокруг.

У меня написан алгоритм, и он, кажется, работает для определенного типа изображения, с которым я работаю, это 266 пикселей в высоту и 427 в ширину, но этот алгоритм сломается, если сдвиг будет каким-либо факторомизображения, которое не 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);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...