detectSeedPoint3d()

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;
  }