diff --git a/B06_Section/B06_Section_UI_Cross_Axes.ts b/B06_Section/B06_Section_UI_Cross_Axes.ts index cccbf371..f7e5d72b 100644 --- a/B06_Section/B06_Section_UI_Cross_Axes.ts +++ b/B06_Section/B06_Section_UI_Cross_Axes.ts @@ -33,6 +33,8 @@ const X_LABEL_MIN_PX = 48; /** Y 눈금 라벨이 겹치지 않는 최소 간격(px). */ const Y_LABEL_MIN_PX = 14; const X_TARGET_TICKS = 7; +/** 표고(Y) 눈금 최소 간격(m) — 1m 아래 단위는 표기하지 않는다. */ +const MIN_ELEVATION_STEP_M = 1; const Y_TARGET_TICKS = 10; /** @@ -99,10 +101,11 @@ export function createCrossAxes( const rawTop = toRaw(displayAt(plotTop)); const rawBottom = toRaw(displayAt(plotBottom)); const rawSpan = rawTop - rawBottom; - const yStep = niceTickStep( - rawSpan, - Y_TARGET_TICKS, - Math.floor((plotBottom - plotTop) / Y_LABEL_MIN_PX), + // 표고 눈금은 **1m 아래로 내려가지 않는다**(2026-08-23 사용자 지시) — 0.5m 표기는 + // 도면에서 읽을 일이 없다. 확대해도 1m 간격까지만 촘촘해진다. + const yStep = Math.max( + niceTickStep(rawSpan, Y_TARGET_TICKS, Math.floor((plotBottom - plotTop) / Y_LABEL_MIN_PX)), + MIN_ELEVATION_STEP_M, ); const yDecimals = Math.max(0, Math.ceil(-Math.log10(yStep) - 1e-9)); for (let raw = Math.ceil(rawBottom / yStep) * yStep; raw <= rawTop + 1e-9; raw += yStep) { diff --git a/B06_Section/B06_Section_UI_Longitudinal.ts b/B06_Section/B06_Section_UI_Longitudinal.ts index dd8208c1..4599b034 100644 --- a/B06_Section/B06_Section_UI_Longitudinal.ts +++ b/B06_Section/B06_Section_UI_Longitudinal.ts @@ -220,7 +220,8 @@ export function createLongitudinalProfile( const rawSpan = elevationSpan / exaggeration; const rawTop = elevationMid + rawSpan / 2; // 라벨 글자(최대 13px, sticky 축)가 겹치지 않게 눈금 간격은 16px 이상 띄운다. - const tickStep = niceTickStep(rawSpan, 10, Math.floor(plotHeight / 16)); + // 표고 눈금은 1m 아래로 내려가지 않는다(2026-08-23 사용자 지시). + const tickStep = Math.max(niceTickStep(rawSpan, 10, Math.floor(plotHeight / 16)), 1); const tickDecimals = Math.max(0, Math.ceil(-Math.log10(tickStep) - 1e-9)); for ( let value = Math.ceil((elevationMid - rawSpan / 2) / tickStep) * tickStep;