Вы не обрабатываете векторное поле полностью, вы должны читать каждый вектор из поля. Фактически вы читаете только каждый 4-й элемент вектора
for (j = 0; j < sourceImage.height; j += 4)
for (j = 0; j < sourceImage.height; j++)
Далее вычисление исходного индекса неверно. Обратите внимание, что управляющая переменная для строки (jj
) должна быть умножена на высоту. Индекс пикселя в массиве необходимо умножить на 4, так как каждый пиксель состоит из 4 цветовых каналов:
ii * sourceImage.width + jj
(jj * sourceImage.width + ii) * 4
Расчет целевого индекса тоже неверно:
index = (n * sourceImage.width + m) * 4;
index = (m * sourceImage.width + n) * 4;
Обратите внимание, result
содержит 1 элемент для каждого пикселя, byut sourceImage.pixels
содержит 4 элемента на каждый пиксель. Таким образом, индекс, который считывается из результата, и индекс, который обращается к цели, различаются:
let result_i = m * sourceImage.width + n;
let target_i = result_i * 4;
Например:
let result = [];
for (let j = 0; j < sourceImage.height; j++) {
for (let i = 0; i < sourceImage.width; i++) {
let res = vectorField[i][j];
let ii = constrain(floor(i + res.x), 0, sourceImage.width - 1);
let jj = constrain(floor(j + res.y), 0, sourceImage.height - 1);
let source_i = (jj * sourceImage.width + ii) * 4;
let col = color(
sourceImage.pixels[source_i],
sourceImage.pixels[source_i + 1],
sourceImage.pixels[source_i + 2],
sourceImage.pixels[source_i + 3]);
result.push(col);
}
}
for(let m = 0; m < sourceImage.height; m++) {
for (let n = 0; n < sourceImage.width; n++) {
let result_i = m * sourceImage.width + n;
let target_i = result_i * 4;
let col = result[result_i];
sourceImage.pixels[target_i] = red(col);
sourceImage.pixels[target_i + 1] = green(col);
sourceImage.pixels[target_i + 2] = blue(col);
sourceImage.pixels[target_i + 3] = alpha(col);
}
}