excalidraw/packages/math/rectangle.ts
Mark Tolmacs 336fa9d002
Master merge
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
2024-10-02 12:09:01 +02:00

42 lines
1.2 KiB
TypeScript

import { invariant } from "../excalidraw/utils";
import { pointFrom } from "./point";
import { segment, segmentDistanceToPoint } from "./segment";
import type { GenericPoint, Rectangle } from "./types";
export function rectangle<P extends GenericPoint>(
topLeft: P,
bottomRight: P,
): Rectangle<P> {
return [topLeft, bottomRight] as Rectangle<P>;
}
export function rectangleFromPair<P extends GenericPoint>(
pair: [a: P, b: P],
): Rectangle<P> {
return pair as Rectangle<P>;
}
export function rectangleFromArray<P extends GenericPoint>(
pointArray: P[],
): Rectangle<P> {
invariant(
pointArray.length === 4,
"Point array contains more or less points to create a rectangle from",
);
return pointArray as Rectangle<P>;
}
export function rectangleDistanceFromPoint<Point extends GenericPoint>(
r: Rectangle<Point>,
p: Point,
): number {
const sides = [
segment(pointFrom(r[0][0], r[0][1]), pointFrom(r[1][0], r[0][1])),
segment(pointFrom(r[1][0], r[0][1]), pointFrom(r[1][0], r[1][1])),
segment(pointFrom(r[1][0], r[1][1]), pointFrom(r[0][0], r[1][1])),
segment(pointFrom(r[0][0], r[1][1]), pointFrom(r[0][0], r[0][1])),
];
return Math.min(...sides.map((side) => segmentDistanceToPoint(p, side)));
}