diff --git a/B06_Section/B06_Section_UI_Cross_View.ts b/B06_Section/B06_Section_UI_Cross_View.ts index a3a3ec08..84b15c98 100644 --- a/B06_Section/B06_Section_UI_Cross_View.ts +++ b/B06_Section/B06_Section_UI_Cross_View.ts @@ -321,9 +321,12 @@ export function createCrossSectionCard( // Y축 눈금: 표고 범위를 10칸 안팎으로 나누되 눈금값이 1·2·5 계열로 딱 떨어지게 한다 // (종단면도와 같은 규칙). 5등분 고정은 눈금값이 소수로 흘러 표고를 못 읽었다 // (2026-08-23 사용자 지시). 라벨 겹침 방지로 눈금 간격은 14px 이상 띄운다. + // 눈금 범위는 **실제로 보이는 플롯 상·하단**(y() 기준)에서 뽑는다 — elevationMid를 + // 중심으로 잡으면 displayMax의 면적표 여유(headroom)만큼 아래로 밀려 X축 라벨 줄 + // 아래에 격자선이 삐져나왔다(2026-08-23 사용자 보고). const rawDisplaySpan = displaySpan / exaggeration; - const rawBottom = elevationMid - rawDisplaySpan / 2; - const rawTop = elevationMid + rawDisplaySpan / 2; + const rawTop = elevationMid + (displayMax - elevationMid) / exaggeration; + const rawBottom = rawTop - rawDisplaySpan; const plotHeightPx = heightPx - CROSS_PAD.top - CROSS_PAD.bottom; const tickStep = niceTickStep(rawDisplaySpan, 10, Math.floor(plotHeightPx / 14)); const tickDecimals = Math.max(0, Math.ceil(-Math.log10(tickStep) - 1e-9));