@davepagurek/flo-mat
Version:
Medial / Scale Axis Transform (MAT/SAT) Library.
85 lines • 3.03 kB
JavaScript
import { getBounds } from 'flo-bezier3';
import { memoize } from 'flo-memoize';
import { createPos } from '../point-on-shape/create-pos.js';
/** @internal */
const INF = Number.POSITIVE_INFINITY;
/**
* @internal
*/
const getLoopBounds = memoize(function (loop) {
const extremes = [
[
{ 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) {
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 };
//# sourceMappingURL=get-loop-bounds.js.map