in src/engine/actvolume/floodfill.js [69:118]
detectSeedPoint3d(xDim, yDim, zDim, pixels, vaSeedPoints, maxSeedPoints) {
const TWO = 2;
const yDimHalf = Math.floor(yDim / TWO);
const zDimHalf = Math.floor(zDim / TWO);
const numItersY = (yDimHalf - 1) * TWO;
const numItersZ = (zDimHalf - 1) * TWO;
let numSeedPointsDetected = 0;
for (let zIter = 0; zIter < numItersZ; zIter++) {
let zStep = Math.floor(zIter / TWO);
if ((zIter & 1) !== 0) {
zStep = -zStep;
}
const z = zDimHalf + zStep;
const zOff = z * xDim * yDim;
for (let yIter = 0; yIter < numItersY; yIter++) {
let yStep = Math.floor(yIter / TWO);
if ((yIter & 1) !== 0) {
yStep = -yStep;
}
const y = yDimHalf + yStep;
const yOff = y * xDim;
let xL = -1;
let xR = -1;
let x;
for (x = 0; x < xDim - 1; x++) {
const isStartInside = pixels[x + yOff + zOff] > 0 && pixels[x + 1 + yOff + zOff] === 0;
const isEndInside = pixels[x + yOff + zOff] === 0 && pixels[x + 1 + yOff + zOff] > 0;
if (isStartInside) {
xL = x;
}
if (isEndInside && xL >= 0) {
xR = x + 1;
const xSegmentLen = xR - xL + 1;
if (xSegmentLen > 1) {
vaSeedPoints[numSeedPointsDetected].x = Math.floor((xL + xR) / TWO);
vaSeedPoints[numSeedPointsDetected].y = y;
vaSeedPoints[numSeedPointsDetected].z = z;
numSeedPointsDetected++;
if (numSeedPointsDetected >= maxSeedPoints) {
return numSeedPointsDetected;
}
}
}
}
} // for (yIter)
} // for (zIter)
return numSeedPointsDetected;
}