All files / core/src/RenderingEngine/helpers planarVolumeRendering.ts

0% Statements 0/12
0% Branches 0/4
0% Functions 0/2
0% Lines 0/12

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                                                                                                                               
import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
import type { ICamera, IImageVolume, Point3 } from '../../types';
import getSliceRange from '../../utilities/getSliceRange';
import getSpacingInNormalDirection from '../../utilities/getSpacingInNormalDirection';
import snapFocalPointToSlice from '../../utilities/snapFocalPointToSlice';
 
export interface PlanarVolumeSliceNavigationState {
  currentSliceIndex: number;
  sliceRange: ReturnType<typeof getSliceRange>;
  spacingInNormalDirection: number;
}
 
export function getPlanarVolumeSliceNavigationState(args: {
  actor: vtkVolume;
  camera: Pick<ICamera, 'focalPoint' | 'position' | 'viewPlaneNormal'>;
  imageVolume: IImageVolume;
}): PlanarVolumeSliceNavigationState {
  const { actor, camera, imageVolume } = args;
  const { focalPoint, viewPlaneNormal } = camera;
  const sliceRange = getSliceRange(actor, viewPlaneNormal, focalPoint);
  const spacingInNormalDirection = getSpacingInNormalDirection(
    imageVolume,
    viewPlaneNormal
  );
  const steps = Math.round(
    (sliceRange.max - sliceRange.min) / spacingInNormalDirection
  );
  const range = sliceRange.max - sliceRange.min;
 
  if (steps <= 0 || range === 0) {
    return {
      currentSliceIndex: 0,
      sliceRange,
      spacingInNormalDirection,
    };
  }
 
  const fraction = (sliceRange.current - sliceRange.min) / range;
 
  return {
    currentSliceIndex: Math.round(fraction * steps),
    sliceRange,
    spacingInNormalDirection,
  };
}
 
export function getPlanarVolumeSlicePoint(args: {
  camera: Pick<ICamera, 'focalPoint' | 'position' | 'viewPlaneNormal'>;
  delta: number;
  sliceRange: ReturnType<typeof getSliceRange>;
  spacingInNormalDirection: number;
}): { newFocalPoint: Point3; newPosition: Point3 } {
  const { camera, delta, sliceRange, spacingInNormalDirection } = args;
 
  return snapFocalPointToSlice(
    camera.focalPoint,
    camera.position,
    sliceRange,
    camera.viewPlaneNormal,
    spacingInNormalDirection,
    delta
  );
}