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 | import { vec2 } from 'gl-matrix';
import type { Types } from '@cornerstonejs/core';
import areLineSegmentsIntersecting from './areLineSegmentsIntersecting';
/**
* Checks whether the line (`p1`,`q1`) intersects any of the other lines in the
* `points`, and returns the closest value.
* @param points - Polyline points
* @param p1 - Start point of the line segment
* @param q1 - End point of the line segment
* @param closed - Test the intersection against the line that connects the first to the last when closed
* @returns The closest line segment from polyline that intersects the line segment [p1, q1]
*/
export default function getClosestLineSegmentIntersection(
points: Types.Point2[],
p1: Types.Point2,
q1: Types.Point2,
closed = true
): { segment: Types.Point2; distance: number } | undefined {
let initialQ2Index;
let p2Index;
if (closed) {
p2Index = points.length - 1;
initialQ2Index = 0;
} else {
p2Index = 0;
initialQ2Index = 1;
}
const intersections = [];
for (let q2Index = initialQ2Index; q2Index < points.length; q2Index++) {
const p2 = points[p2Index];
const q2 = points[q2Index];
if (areLineSegmentsIntersecting(p1, q1, p2, q2)) {
intersections.push([p2Index, q2Index]);
}
p2Index = q2Index;
}
if (intersections.length === 0) {
return;
}
// Find intersection closest to the start point
const distances = [];
intersections.forEach((intersection) => {
const intersectionPoints = [
points[intersection[0]],
points[intersection[1]],
];
const midpoint = [
(intersectionPoints[0][0] + intersectionPoints[1][0]) / 2,
(intersectionPoints[0][1] + intersectionPoints[1][1]) / 2,
];
distances.push(vec2.distance(<vec2>midpoint, p1));
});
const minDistance = Math.min(...distances);
const indexOfMinDistance = distances.indexOf(minDistance);
return {
segment: intersections[indexOfMinDistance],
distance: minDistance,
};
}
|