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 | import { vec3 } from 'gl-matrix'; import { metaData } from '..'; import { Point2, Point3 } from '../types'; /** * Given the imageId and a 2d coordinates on the image space with [0,0] being the top left corner * of the top left pixel, and options which includes the imageId, it returns the * 3d coordinates on the world space. * @param imageId - The image id * @param imageCoords - The 2d coordinates on the image * @returns The 3d coordinates on the world. * */ export default function imageToWorldCoords( imageId: string, imageCoords: Point2 ): Point3 | undefined { const imagePlaneModule = metaData.get('imagePlaneModule', imageId); if (!imagePlaneModule) { throw new Error(`No imagePlaneModule found for imageId: ${imageId}`); } const { columnCosines, columnPixelSpacing, rowCosines, rowPixelSpacing, imagePositionPatient: origin, } = imagePlaneModule; // calculate the image coordinates in the world space const imageCoordsInWorld = vec3.create(); // move from origin in the direction of the row cosines with the amount of // row pixel spacing times the first element of the image coordinates vector vec3.scaleAndAdd( imageCoordsInWorld, origin, rowCosines, // to accommodate the [0,0] being on the top left corner of the top left pixel // but the origin is at the center of the top left pixel rowPixelSpacing * (imageCoords[0] - 0.5) ); vec3.scaleAndAdd( imageCoordsInWorld, imageCoordsInWorld, columnCosines, columnPixelSpacing * (imageCoords[1] - 0.5) ); return Array.from(imageCoordsInWorld) as Point3; } |