fix(photos): overlay UAT nits + 90% crop fill (#67,#68)

Length dim already mask tip-to-tip (locked by test). Width labels move
axis-left off the wood via labelAt; font steps down to max(22, scale*1.0).
Inventory/overlay crop FILL 0.8→0.9; CAPTURE/PHOTOS docs match.
This commit is contained in:
2026-09-15 21:46:58 +00:00
parent 15895cae0c
commit 9bc35f7edd
4 changed files with 16 additions and 10 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
import type { Mask, Source } from '../capture/capture.types';
const FLOOR = 800; // shorter side, px
const FILL = 0.8; // 80% fill at the widest and tallest points of the slab
const FILL = 0.9; // 90% fill at the widest and tallest points of the slab
const ASPECT_W = 3;
const ASPECT_H = 4;
+10 -4
View File
@@ -45,6 +45,8 @@ export interface OverlayWidthMark {
center: [number, number];
left: [number, number];
right: [number, number];
/** Axis-left of the slab, outside the wood edge (opposite of length dim). */
labelAt: [number, number];
label: string;
}
@@ -159,6 +161,7 @@ export function buildOverlayPlan(input: OverlayPlanInput): OverlayPlan {
const { bottom, top, ux, uy } = oriented;
const [rx, ry] = axisRightUnit(ux, uy);
const pad = Math.max(16, scale * 0.75);
const stations = overlayWidthStations(lengthIn);
const widths: OverlayWidthMark[] = [];
for (const stationIn of stations) {
@@ -170,12 +173,16 @@ export function buildOverlayPlan(input: OverlayPlanInput): OverlayPlan {
// left = opposite of axis-right; right = axis-right tip on slab edge
const leftSrc: [number, number] = [ox + rx * extent.minP, oy + ry * extent.minP];
const rightSrc: [number, number] = [ox + rx * extent.maxP, oy + ry * extent.maxP];
// Width number sits axis-left outside the slab (past left tip).
const labelOff = extent.minP - pad - scale * 0.4;
const labelSrcW: [number, number] = [ox + rx * labelOff, oy + ry * labelOff];
const widthIn = (extent.maxP - extent.minP + 1) / scale;
widths.push({
stationIn,
center: mapToInventory(ox, oy),
left: mapToInventory(leftSrc[0], leftSrc[1]),
right: mapToInventory(rightSrc[0], rightSrc[1]),
labelAt: mapToInventory(labelSrcW[0], labelSrcW[1]),
label: fmtInches(widthIn),
});
}
@@ -190,7 +197,6 @@ export function buildOverlayPlan(input: OverlayPlanInput): OverlayPlan {
const extent = probeExtent(bitset, widthPx, heightPx, ox, oy, rx, ry);
if (extent && extent.maxP > maxRight) maxRight = extent.maxP;
}
const pad = Math.max(16, scale * 0.75);
const outward = maxRight + pad;
const aSrc: [number, number] = [bottom[0] + rx * outward, bottom[1] + ry * outward];
const bSrc: [number, number] = [top[0] + rx * outward, top[1] + ry * outward];
@@ -198,7 +204,7 @@ export function buildOverlayPlan(input: OverlayPlanInput): OverlayPlan {
// Nudge label further outward a bit
const labelSrc: [number, number] = [midSrc[0] + rx * (scale * 0.4), midSrc[1] + ry * (scale * 0.4)];
const fontPx = Math.max(28, Math.round(scale * 1.2));
const fontPx = Math.max(22, Math.round(scale * 1.0));
return {
stroke: '#000000',
@@ -263,7 +269,7 @@ export function drawOverlayPlan(
// Widths
for (const w of plan.widths) {
arrow(w.left, w.right);
ctx.fillText(w.label, w.center[0], w.center[1]);
ctx.fillText(w.label, w.labelAt[0], w.labelAt[1]);
}
ctx.restore();
@@ -282,7 +288,7 @@ export function inventorySourceMap(
outW: number,
outH: number,
): InventoryMap {
const FILL = 0.8;
const FILL = 0.9;
const x0 = Math.max(0, Math.round(slabBounds.x));
const y0 = Math.max(0, Math.round(slabBounds.y));
const x1 = Math.min(source.widthPx, x0 + Math.max(1, Math.round(slabBounds.w)));