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 | import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';
import type { Types } from '@cornerstonejs/core';
import { vec3 } from 'gl-matrix';
/**
* Gets a point from an array of numbers given its index
* @param points - array of number, each point defined by three consecutive numbers
* @param idx - index of the point to retrieve
* @returns
*/
export function getPoint(points, idx): Types.Point3 {
const idx3 = idx * 3;
if (idx3 < points.length) {
return vec3.fromValues(
points[idx3],
points[idx3 + 1],
points[idx3 + 2]
) as Types.Point3;
}
}
/**
* Extract contour point sets from the outline of a poly data actor
* @param polyData - vtk polyData
* @returns
*/
export function getPolyDataPointIndexes(polyData: vtkPolyData) {
const linesData = polyData.getLines().getData();
let idx = 0;
const lineSegments = new Map<number, number[]>();
// Populate lineSegments map
while (idx < linesData.length) {
const segmentSize = linesData[idx++];
const segment = [];
for (let i = 0; i < segmentSize; i++) {
segment.push(linesData[idx + i]);
}
lineSegments.set(segment[0], segment);
idx += segmentSize;
}
const contours = [];
// Function to find an available starting point
const findStartingPoint = (map) => {
for (const [key, value] of map.entries()) {
if (value !== undefined) {
return key;
}
}
return -1;
};
// Build contours
let startPoint = findStartingPoint(lineSegments);
while (startPoint !== -1) {
const contour = [startPoint];
while (lineSegments.has(startPoint)) {
const nextPoint = lineSegments.get(startPoint)[1];
if (lineSegments.has(nextPoint)) {
contour.push(nextPoint);
}
lineSegments.delete(startPoint);
startPoint = nextPoint;
}
contours.push(contour);
startPoint = findStartingPoint(lineSegments);
}
return contours.length ? contours : undefined;
}
/**
* Extract contour points from a poly data object
* @param polyData - vtk polyData
* @returns
*/
export function getPolyDataPoints(polyData: vtkPolyData) {
const contoursIndexes = getPolyDataPointIndexes(polyData);
if (!contoursIndexes) {
return;
}
const rawPointsData = polyData.getPoints().getData();
return contoursIndexes.map((contourIndexes) =>
contourIndexes.map((index) => getPoint(rawPointsData, index))
);
}
|