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 | 1x | import type { Types } from '@cornerstonejs/core';
const ORIENTATION_TOLERANCE = 1e-2;
/**
* Test if a point is on a line segment
* @param lineStart - Line segment start point
* @param lineEnd - Line segment end point
* @param point - Point to test
* @returns True if the point lies on the line segment or false otherwise
*/
export default function isPointOnLineSegment(
lineStart: Types.Point2,
lineEnd: Types.Point2,
point: Types.Point2
): boolean {
// The code below runs ~4x faster than calling `line.distanceToPointSquared()` (155 vs 598 ms)
// No Math.min/max call for better performance when testing thousands of points
const minX = lineStart[0] <= lineEnd[0] ? lineStart[0] : lineEnd[0];
const maxX = lineStart[0] >= lineEnd[0] ? lineStart[0] : lineEnd[0];
const minY = lineStart[1] <= lineEnd[1] ? lineStart[1] : lineEnd[1];
const maxY = lineStart[1] >= lineEnd[1] ? lineStart[1] : lineEnd[1];
// Checks if the point lies inside the AABB
const aabbContainsPoint =
point[0] >= minX - ORIENTATION_TOLERANCE &&
point[0] <= maxX + ORIENTATION_TOLERANCE &&
point[1] >= minY - ORIENTATION_TOLERANCE &&
point[1] <= maxY + ORIENTATION_TOLERANCE;
if (!aabbContainsPoint) {
return false;
}
// Now that we know the point is inside the AABB we check if it lies on the line segment
const orientation =
(lineEnd[1] - lineStart[1]) * (point[0] - lineEnd[0]) -
(lineEnd[0] - lineStart[0]) * (point[1] - lineEnd[1]);
const absOrientation = orientation >= 0 ? orientation : -orientation;
// The orientation must be zero for points that lies on the same line
return absOrientation <= ORIENTATION_TOLERANCE;
}
|