@cornerstonejs/core
Version:
Cornerstone3D Core
55 lines (54 loc) • 2.21 kB
JavaScript
import { vec3 } from 'gl-matrix';
import * as metaData from '../metaData.js';
import { MetadataModules } from '../enums/index.js';
import { coreLog } from './logger.js';
import getSpacingInNormalDirection from './getSpacingInNormalDirection.js';
import { EPSILON } from '../constants/index.js';
const log = coreLog.getLogger('utilities', 'getClosestImageId');
export default function getClosestImageId(imageVolume, worldPos, viewPlaneNormal, options) {
const { direction, spacing, imageIds } = imageVolume;
const { ignoreSpacing = false } = options || {};
if (!imageIds?.length) {
return;
}
const kVector = direction.slice(6, 9);
const dotProduct = vec3.dot(kVector, viewPlaneNormal);
if (Math.abs(dotProduct) < 1 - EPSILON) {
return;
}
let halfSpacingInNormalDirection;
if (!ignoreSpacing) {
const spacingInNormalDirection = getSpacingInNormalDirection({ direction, spacing }, viewPlaneNormal);
halfSpacingInNormalDirection = spacingInNormalDirection / 2;
}
let closestImageId;
let minDistance = Infinity;
for (let i = 0; i < imageIds.length; i++) {
const imageId = imageIds[i];
const imagePlaneModule = metaData.get(MetadataModules.IMAGE_PLANE, imageId);
if (!imagePlaneModule?.imagePositionPatient) {
log.warn(`Missing imagePositionPatient for imageId: ${imageId}`);
continue;
}
const { imagePositionPatient } = imagePlaneModule;
const dir = vec3.create();
vec3.sub(dir, worldPos, imagePositionPatient);
const distance = Math.abs(vec3.dot(dir, viewPlaneNormal));
if (ignoreSpacing) {
if (distance < minDistance) {
minDistance = distance;
closestImageId = imageId;
}
}
else {
if (distance < halfSpacingInNormalDirection && distance < minDistance) {
minDistance = distance;
closestImageId = imageId;
}
}
}
if (closestImageId === undefined) {
log.warn('No imageId found within the specified criteria (half spacing or absolute closest).');
}
return closestImageId;
}