All files / packages/tools/src/utilities/math/aabb distanceToPointSquared.ts

0% Statements 0/11
0% Branches 0/4
0% Functions 0/1
0% Lines 0/11

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                                                                                               
import { Types } from '@cornerstonejs/core';
 
/**
 * Calculates the distance of a point to an AABB using 2D Box SDF (Signed Distance Field)
 *
 * The SDF of a Box
 * https://www.youtube.com/watch?v=62-pRVZuS5c
 *
 * @param aabb - Axis-aligned bound box
 * @param point - 2D point
 * @returns The closest distance between the 2D point and the AABB
 */
export default function distanceToPointSquared(
  aabb: Types.AABB2,
  point: Types.Point2
): number {
  const aabbWidth = aabb.maxX - aabb.minX;
  const aabbHeight = aabb.maxY - aabb.minY;
  const aabbSize = [aabbWidth, aabbHeight];
  const aabbCenter: Types.Point2 = [
    aabb.minX + aabbWidth / 2,
    aabb.minY + aabbHeight / 2,
  ];
 
  // Translates the point as the center of the AABB is the new origin.
  // THe point is also mirroed to the first quadrant to simplify the math.
  const translatedPoint = [
    Math.abs(point[0] - aabbCenter[0]),
    Math.abs(point[1] - aabbCenter[1]),
  ];
 
  // Calculate the distance from the point to the vertical and horizontal AABB borders
  const dx = translatedPoint[0] - aabbSize[0] * 0.5;
  const dy = translatedPoint[1] - aabbSize[1] * 0.5;
 
  // dx >  0 && dy >  0: diagonal line connecting the point to AABB's corner
  // dx >  0 && dy <= 0: a line parallel to x-axis connecting the point to AABB's right side
  // dx <= 0 && dy >  0: a line parallel to y-axis connecting the point to AABB's top side
  // dx <= 0 && dy <= 0: the point is inside the AABB
  if (dx > 0 && dy > 0) {
    return dx * dx + dy * dy;
  }
 
  const dist = Math.max(dx, 0) + Math.max(dy, 0);
 
  return dist * dist;
}