UNPKG

@davepagurek/flo-mat

Version:

Medial / Scale Axis Transform (MAT/SAT) Library.

110 lines (95 loc) 2.62 kB
import { getBounds } from 'flo-bezier3'; import { memoize } from 'flo-memoize'; import { Loop } from 'flo-boolean'; import { Curve } from '../curve/curve.js'; import { PointOnShape } from '../point-on-shape/point-on-shape.js'; import { createPos } from '../point-on-shape/create-pos.js'; /** @internal */ const INF = Number.POSITIVE_INFINITY; /** * @internal */ const getLoopBounds = memoize(function(loop: Loop): { minX: PointOnShape; minY: PointOnShape; maxX: PointOnShape; maxY: PointOnShape } { const extremes: { bezier: Curve, t: number, val: number }[][] = [ [ { bezier: undefined!, t: undefined!, val: INF}, { bezier: undefined!, t: undefined!, val: INF} ], [ { bezier: undefined!, t: undefined!, val: -INF}, { bezier: undefined!, t: undefined!, val: -INF} ] ]; loop.curves.forEach(function(curve: Curve): void { const ps = curve.ps; // const bounds = getBounds_(ps); const bounds = getBounds(ps); { { const v = bounds.box[0][0]; const x = extremes[0][0].val; if (v < x || (v === x && bounds.ts[0][0] > extremes[0][0].t)) { extremes[0][0] = { bezier : curve, t : bounds.ts[0][0], val : v }; } } { const v = bounds.box[0][1]; const x = extremes[0][1].val; if (v < x || (v === x && bounds.ts[0][1] > extremes[0][1].t)) { extremes[0][1] = { bezier : curve, t : bounds.ts[0][1], val : v }; } } } { { const v = bounds.box[1][0]; const x = extremes[1][0].val; if (v > x || (v === x && bounds.ts[1][0] > extremes[1][0].t)) { extremes[1][0] = { bezier : curve, t : bounds.ts[1][0], val : v }; } } { const v = bounds.box[1][1]; const x = extremes[1][1].val; if (v > x || (v === x && bounds.ts[1][1] > extremes[1][1].t)) { extremes[1][1] = { bezier : curve, t : bounds.ts[1][1], val : v }; } } } }); return { // minX : new PointOnShape(extremes[0][0].bezier, extremes[0][0].t), // minY : new PointOnShape(extremes[0][1].bezier, extremes[0][1].t), // maxX : new PointOnShape(extremes[1][0].bezier, extremes[1][0].t), // maxY : new PointOnShape(extremes[1][1].bezier, extremes[1][1].t) minY : createPos(extremes[0][1].bezier, extremes[0][1].t, true), minX : createPos(extremes[0][0].bezier, extremes[0][0].t, true), maxX : createPos(extremes[1][0].bezier, extremes[1][0].t, true), maxY : createPos(extremes[1][1].bezier, extremes[1][1].t, true) }; }); export { getLoopBounds }