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 | 1x | import { utilities as csUtils } from '@cornerstonejs/core';
import { vec3 } from 'gl-matrix';
import { ContourAnnotation } from '../../types/ToolSpecificAnnotationTypes';
const { isEqual } = csUtils;
/**
* Finds the index in the polyline of the specified handle. If the handle
* doesn't match a polyline point, then finds the closest polyline point.
*
* Assumes polyline is in the same orientation as the handles.
*
* @param annotation - to find the polyline and handles in
* @param handleIndex - the index of hte handle to look for.
* Negative values are treated relative to the end of the handle index.
* @returns Index in polyline of the closest handle
* * 0 for handleIndex 0
* * length for `handleIndex===handles length`
*/
export default function findHandlePolylineIndex(
annotation: ContourAnnotation,
handleIndex: number
): number {
const { polyline } = annotation.data.contour;
const { points } = annotation.data.handles;
const { length } = points;
if (handleIndex === length) {
return polyline.length;
}
if (handleIndex < 0) {
handleIndex = (handleIndex + length) % length;
}
if (handleIndex === 0) {
return 0;
}
const handle = points[handleIndex];
const index = polyline.findIndex((point) => isEqual(handle, point));
if (index !== -1) {
return index;
}
// Need to find nearest
let closestDistance = Infinity;
return polyline.reduce((closestIndex, point, testIndex) => {
const distance = vec3.squaredDistance(point, handle);
if (distance < closestDistance) {
closestDistance = distance;
return testIndex;
}
return closestIndex;
}, -1);
}
|