@davepagurek/flo-mat
Version:
Medial / Scale Axis Transform (MAT/SAT) Library.
110 lines (95 loc) • 2.62 kB
text/typescript
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 }