UNPKG

@cornerstonejs/core

Version:
55 lines (54 loc) 2.21 kB
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; }