function pipeline(inputs, prevOutputs = {}) {
let {
textSettings,
zoom,
ballSet,
epsilon,
raTreeCut,
nodeFillRate
} = inputs;
let {
piece,
pieceImageData,
piecePoints,
zoomedShape,
pieceBalls,
pieceTree,
pieceRaTree,
pieceRaCutTree,
ballApproximation,
ballApproximationErrorImage,
ballApproximationErrorImagePoints,
pieceRects,
rectApproximation,
rectApproximationErrorImage,
rectApproximationErrorImagePoints,
groundPoints
} = prevOutputs;
piece =
piece ||
textImage(
textSettings.text,
textSettings.fontSize,
textSettings.fontFamily,
textSettings.fontVariant
);
pieceImageData =
pieceImageData || binarizeImageData(getImageData(piece), 128);
zoomedShape =
zoomedShape ||
textImage(
textSettings.text,
textSettings.fontSize,
textSettings.fontFamily,
textSettings.fontVariant,
zoom
);
groundPoints = groundPoints || imageDataPoints(getImageData(zoomedShape));
piecePoints = piecePoints || imageDataPoints(pieceImageData);
pieceBalls =
pieceBalls ||
(function () {
if (ballSet == "SDT+filter") return ballCoverNew(pieceImageData, epsilon);
if (ballSet == "DMA") return ballCover(pieceImageData);
const pixelRadius = Math.SQRT2 / 2;
return piecePoints.map(({ x, y }) => new Ball(x, y, pixelRadius));
})();
// pieceTree =
// pieceTree ||
// (function () {
// let pieceTree = bottomUp(pieceBalls);
// pieceTree.computeEnclosingCircles();
// return pieceTree;
// })();
pieceRaTree = pieceRaTree || new RA(piecePoints);
pieceRaCutTree =
pieceRaCutTree || pieceRaTree.cutTree(raTreeCut).approxTree(nodeFillRate);
ballApproximation =
ballApproximation ||
(function () {
const [w, h] = [piece.width * zoom, piece.height * zoom];
const ctx = DOM.context2d(w, h, 1);
ctx.canvas.style.cssText = `
image-rendering: crisp-edges;
image-rendering: pixelated;
-webkit-image-rendering: pixelated;
-webkit-image-rendering: crisp-edges;`;
let balls = pieceBalls.map(
({ x, y, r }) => new Ball(x * zoom, y * zoom, r * zoom)
);
drawBalls(ctx, balls);
return ctx.canvas;
})();
ballApproximationErrorImage =
ballApproximationErrorImage || errorImage(zoomedShape, ballApproximation);
ballApproximationErrorImagePoints =
ballApproximationErrorImagePoints ||
imageDataPoints(getImageData(ballApproximationErrorImage));
pieceRects =
pieceRects || [...pieceRaCutTree.approximation(20)].map((t) => t.box);
rectApproximation =
rectApproximation ||
(function () {
const [w, h] = [piece.width * zoom, piece.height * zoom];
const ctx = DOM.context2d(w, h, 1);
ctx.canvas.style.cssText = `
image-rendering: crisp-edges;
image-rendering: pixelated;
-webkit-image-rendering: pixelated;
-webkit-image-rendering: crisp-edges;`;
let boxes = pieceRects;
let raster = rasterizeBoxes(boxes, w, h, zoom);
ctx.putImageData(raster, 0, 0);
return ctx.canvas;
})();
rectApproximationErrorImage =
rectApproximationErrorImage || errorImage(zoomedShape, rectApproximation);
rectApproximationErrorImagePoints =
rectApproximationErrorImagePoints ||
imageDataPoints(getImageData(rectApproximationErrorImage));
return {
piece,
pieceImageData,
piecePoints,
zoomedShape,
pieceBalls,
pieceTree,
pieceRaTree,
pieceRaCutTree,
ballApproximation,
ballApproximationErrorImage,
ballApproximationErrorImagePoints,
pieceRects,
rectApproximation,
rectApproximationErrorImage,
rectApproximationErrorImagePoints,
groundPoints
};
}