@cornerstonejs/core
Version:
Cornerstone3D Core
43 lines (42 loc) • 2.18 kB
JavaScript
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;
};
}