UNPKG

@cornerstonejs/core

Version:
43 lines (42 loc) 2.18 kB
import * as vec3 from 'gl-matrix/esm/vec3.js'; import PointsManager from './PointsManager.js'; export function createPositionCallback(imageData) { const currentPos = vec3.create(); const dimensions = imageData.getDimensions(); const positionI = PointsManager.create3(dimensions[0]); const positionJ = PointsManager.create3(dimensions[1]); const positionK = PointsManager.create3(dimensions[2]); const direction = imageData.getDirection(); const rowCosines = direction.slice(0, 3); const columnCosines = direction.slice(3, 6); const scanAxisNormal = direction.slice(6, 9); const spacing = imageData.getSpacing(); const [rowSpacing, columnSpacing, scanAxisSpacing] = spacing; const worldPosStart = imageData.indexToWorld([0, 0, 0]); const rowStep = vec3.fromValues(rowCosines[0] * rowSpacing, rowCosines[1] * rowSpacing, rowCosines[2] * rowSpacing); const columnStep = vec3.fromValues(columnCosines[0] * columnSpacing, columnCosines[1] * columnSpacing, columnCosines[2] * columnSpacing); const scanAxisStep = vec3.fromValues(scanAxisNormal[0] * scanAxisSpacing, scanAxisNormal[1] * scanAxisSpacing, scanAxisNormal[2] * scanAxisSpacing); const scaled = vec3.create(); for (let i = 0; i < dimensions[0]; i++) { positionI.push(vec3.add(scaled, worldPosStart, vec3.scale(scaled, rowStep, i))); } for (let j = 0; j < dimensions[1]; j++) { positionJ.push(vec3.scale(scaled, columnStep, j)); } for (let k = 0; k < dimensions[2]; k++) { positionK.push(vec3.scale(scaled, scanAxisStep, k)); } const dataI = positionI.getTypedArray(); const dataJ = positionJ.getTypedArray(); const dataK = positionK.getTypedArray(); return (ijk, destPoint = currentPos) => { const [i, j, k] = ijk; const offsetI = i * 3; const offsetJ = j * 3; const offsetK = k * 3; destPoint[0] = dataI[offsetI] + dataJ[offsetJ] + dataK[offsetK]; destPoint[1] = dataI[offsetI + 1] + dataJ[offsetJ + 1] + dataK[offsetK + 1]; destPoint[2] = dataI[offsetI + 2] + dataJ[offsetJ + 2] + dataK[offsetK + 2]; return destPoint; }; }