in src/engine/actvolume/actvol.js [505:561]
makeUniformityImage(pixelsSrc, xDim, yDim, zDim, zStart, zEnd, pixelsGrad, pixelsDst, koefAlpha) {
// radius neighbours
const TWICE = 2;
const RAD_UNI = 1;
const DIA_UNI = 1 + TWICE * RAD_UNI;
const SCALE_ALL_ELEMS = 1.0 / (DIA_UNI * DIA_UNI * DIA_UNI);
// let maxLen = 0.0;
let cx, cy, cz;
const zs = zStart > RAD_UNI ? zStart : RAD_UNI;
const ze = zEnd < zDim - RAD_UNI ? zEnd : zDim - RAD_UNI;
for (cz = zs; cz < ze; cz++) {
const czOff = cz * xDim * yDim;
for (cy = RAD_UNI; cy < yDim - RAD_UNI; cy++) {
const cyOff = cy * xDim;
for (cx = RAD_UNI; cx < xDim - RAD_UNI; cx++) {
let sumDx = 0.0;
let sumDy = 0.0;
let sumDz = 0.0;
let dx, dy, dz;
for (dz = -RAD_UNI; dz <= +RAD_UNI; dz++) {
const z = cz + dz;
const zOff = z * xDim * yDim;
for (dy = -RAD_UNI; dy <= +RAD_UNI; dy++) {
const y = cy + dy;
const yOff = y * xDim;
for (dx = -RAD_UNI; dx <= +RAD_UNI; dx++) {
const x = cx + dx;
const offSrc = x + yOff + zOff;
// if ((offSrc < 0) || (offSrc >= numPixelsVol)) {
// console.log('!!! Out of array');
// }
const val = pixelsSrc[offSrc];
sumDx += val * dx;
sumDy += val * dy;
sumDz += val * dz;
} // for (dx)
} // for (dy)
} // for (dz)
sumDx *= SCALE_ALL_ELEMS;
sumDy *= SCALE_ALL_ELEMS;
sumDz *= SCALE_ALL_ELEMS;
// maxLen = (gradLen > maxLen) ? gradLen : maxLen;
const gradLen = Math.sqrt(sumDx * sumDx + sumDy * sumDy + sumDz * sumDz);
pixelsGrad[cx + cyOff + czOff] = gradLen;
pixelsDst[cx + cyOff + czOff] = Math.exp(-koefAlpha * gradLen);
} // for (cx)
} // for (cy)
} // for (cz)
// console.log(`makeUniformityImage done for z = ${zs} to ${ze}`);
}