Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 5x 5x 5x 5x | import { vec3 } from 'gl-matrix'; import * as metaData from '../metaData'; import type { IImageVolume, Point3 } from '../types'; import getSpacingInNormalDirection from './getSpacingInNormalDirection'; /** * Given an image, a point in space and the viewPlaneNormal it returns the * closest imageId of the image volume that is within half voxel spacing * of the point in space. * @param imageVolume - The image volume * @param worldPos - The position in the world coordinate system (from mouse click) * @param viewPlaneNormal - The normal vector of the viewport * @param viewUp - The viewUp vector of the camera. * * @returns The imageId for the tool. */ export default function getClosestImageId( imageVolume: IImageVolume, worldPos: Point3, viewPlaneNormal: Point3, viewUp: Point3 ): string { Iif (!imageVolume) { return; } const { direction, imageIds } = imageVolume; Eif (!imageIds || !imageIds.length) { return; } // 1. Get ScanAxis vector const kVector = direction.slice(6, 9); // 2. Check if scanAxis is not parallel to camera viewPlaneNormal const dotProducts = vec3.dot(kVector as Point3, <vec3>viewPlaneNormal); // 2.a if imagePlane is not parallel to the camera: tool is not drawn on an // imaging plane, return if (Math.abs(dotProducts) < 0.99) { return; } // 3. Calculate Spacing the in the normal direction, this will get used to // check whether we are withing a slice const spacingInNormalDirection = getSpacingInNormalDirection( imageVolume, viewPlaneNormal ); const halfSpacingInNormalDirection = spacingInNormalDirection / 2; // 4. Iterate over all imageIds and check if the tool point (worldPos) is // withing one of the slices defined by an imageId let imageIdForTool; for (let i = 0; i < imageIds.length; i++) { const imageId = imageIds[i]; // 4.a Get metadata for the imageId const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId); // 4.b Calculate the direction vector from annotation. point to the first voxel // of this image defined by imageId const dir = vec3.create(); vec3.sub(dir, worldPos, imagePositionPatient); // 4.c Calculate the distance between the vector above and the viewplaneNormal // i.e., projected distance const dot = vec3.dot(dir, viewPlaneNormal); // 4.d If the distance is withing range, return the imageId if (Math.abs(dot) < halfSpacingInNormalDirection) { imageIdForTool = imageId; } } return imageIdForTool; } |