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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1280x 2x 2x 2x 2x | import { utilities as csUtils } from '@cornerstonejs/core'; import { Types } from '@cornerstonejs/core'; import type { ContourAnnotation } from '../../types'; import type { ContourWindingDirection } from '../../types/ContourAnnotation'; import * as math from '../math'; import { getParentAnnotation, invalidateAnnotation, } from '../../stateManagement'; /** * Update the contour polyline data * @param annotation - Contour annotation * @param viewport - Viewport * @param polylineData - Polyline data (points, winding direction and closed) * @param transforms - Methods to convert points to/from canvas and world spaces * @param options - Options * - decimate: allow to set some parameters to decimate the polyline reducing * the amount of points stored which also affects how fast it will draw the * annotation in a viewport, compute the winding direction, append/remove * contours and create holes. A higher `epsilon` value results in a polyline * with less points. */ export default function updateContourPolyline( annotation: ContourAnnotation, polylineData: { points: Types.Point2[]; closed?: boolean; targetWindingDirection?: ContourWindingDirection; }, transforms: { canvasToWorld: (point: Types.Point2) => Types.Point3; worldToCanvas: (point: Types.Point3) => Types.Point2; }, options?: { decimate?: { enabled?: boolean; epsilon?: number; }; } ) { const { canvasToWorld, worldToCanvas } = transforms; const { data } = annotation; const { targetWindingDirection } = polylineData; let { points: polyline } = polylineData; // Decimate the polyline to reduce tha amount of points Iif (options?.decimate?.enabled) { polyline = math.polyline.decimate( polylineData.points, options?.decimate?.epsilon ); } let { closed } = polylineData; const numPoints = polyline.length; const polylineWorldPoints = new Array(numPoints); const currentPolylineWindingDirection = math.polyline.getWindingDirection(polyline); const parentAnnotation = getParentAnnotation(annotation) as ContourAnnotation; Iif (closed === undefined) { let currentClosedState = false; // With two points it is just a line and do not make sense to consider it closed if (polyline.length > 3) { const lastToFirstDist = math.point.distanceToPointSquared( polyline[0], polyline[numPoints - 1] ); currentClosedState = csUtils.isEqual(0, lastToFirstDist); } closed = currentClosedState; } // It must be in the opposite direction if it is a child annotation (hole) let windingDirection = parentAnnotation ? parentAnnotation.data.contour.windingDirection * -1 : targetWindingDirection; Iif (windingDirection === undefined) { windingDirection = currentPolylineWindingDirection; } Eif (windingDirection !== currentPolylineWindingDirection) { polyline.reverse(); } const handlePoints = data.handles.points.map((p) => worldToCanvas(p)); Iif (handlePoints.length > 2) { const currentHandlesWindingDirection = math.polyline.getWindingDirection(handlePoints); if (currentHandlesWindingDirection !== windingDirection) { data.handles.points.reverse(); } } for (let i = 0; i < numPoints; i++) { polylineWorldPoints[i] = canvasToWorld(polyline[i]); } data.contour.polyline = polylineWorldPoints; data.contour.closed = closed; data.contour.windingDirection = windingDirection; invalidateAnnotation(annotation); } |