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 | 80x 80x 640x 80x 80x 80x 80x 80x 80x 640x 640x 160x 640x 127x 80x | import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';
import getVolumeActorCorners from './getVolumeActorCorners';
import type { VolumeActor, Point3, ActorSliceRange } from '../types';
/**
* Given a `vtkVolumeActor`, and a normal direction,
* calculate the range of slices in the focal normal direction that encapsulate
* the volume. Also project the `focalPoint` onto this range.
*
* @param volumeActor - The `vtkVolumeActor`.
* @param viewPlaneNormal - The normal to the camera view.
* @param focalPoint - The focal point of the camera.
*
* @returns an object containing the `min`, `max` and `current`
* positions in the normal direction.
*/
export default function getSliceRange(
volumeActor: VolumeActor,
viewPlaneNormal: Point3,
focalPoint: Point3
): ActorSliceRange {
const corners = getVolumeActorCorners(volumeActor);
// Get rotation matrix from normal to +X (since bounds is aligned to XYZ)
const transform = vtkMatrixBuilder
.buildFromDegree()
.identity()
.rotateFromDirections(viewPlaneNormal, [1, 0, 0]);
corners.forEach((pt) => transform.apply(pt));
const transformedFocalPoint = [...focalPoint];
transform.apply(transformedFocalPoint);
const currentSlice = transformedFocalPoint[0];
// range is now maximum X distance
let minX = Infinity;
let maxX = -Infinity;
for (let i = 0; i < 8; i++) {
const x = corners[i][0];
if (x > maxX) {
maxX = x;
}
if (x < minX) {
minX = x;
}
}
return {
min: minX,
max: maxX,
current: currentSlice,
actor: volumeActor,
viewPlaneNormal,
focalPoint,
};
}
|