/** * 스토커 지붕 위 용량 게이지 바의 비례 축소 계수를 계산한다. * * 정책: * - 게이지 바의 *최대* 크기는 maxW × maxH. 스토커가 충분히 크면 이 크기 그대로 (계수 1). * - 스토커가 그보다 작으면 지붕 footprint 안에 들어오도록 *비례* 축소 (uniform). * - *확대는 하지 않는다* (계수 상한 1) — 현재 크기가 상한이라는 요구사항. * * 방향 매핑: 바의 가로축(maxW)은 스토커의 *장축*에 정렬된다 (buildGauge 의 * `isWidthLonger ? geo.rotateY` 처리와 일치). 따라서 가용 치수도 그 기준으로 매칭한다. * * @param w 스토커 footprint 가로 (월드 단위) * @param h 스토커 footprint 세로 (월드 단위) * @param maxW 게이지 바 최대 가로 * @param maxH 게이지 바 최대 세로 * @param margin 지붕 가장자리 여백 비율 (0~1, 기본 0.85) * @returns 0 < scale <= 1 */ export function fitGaugeScale( w: number, h: number, maxW: number, maxH: number, margin: number = 0.85 ): number { const isWidthLonger = w >= h // 바 가로축(maxW)이 정렬되는 스토커 치수 = 장축, 세로축(maxH) = 단축 const availAlongW = isWidthLonger ? w : h const availAlongH = isWidthLonger ? h : w const scale = Math.min(1, (availAlongW * margin) / maxW, (availAlongH * margin) / maxH) // 음수/NaN 방어 — 0 이하로 떨어지면 안 됨 return scale > 0 && Number.isFinite(scale) ? scale : 1 }