fix(B06): 교차점 자동 줌아웃이 5m 사면 규칙에 잘리던 문제

자동 줌아웃 판정이 배수관용 slopeToeOffset(성토사면 5m에서 컷오프)을 써서, 사면이
5m를 넘는 측점은 필요 폭을 과소 산정했고 교차점이 화면 밖에 남았다(2026-08-23
사용자 보고).

- _UI_Cross_Fit 재작성: 설계선(design_line)과 지반선의 **실제 교차점**을 0.1m
  간격으로 훑어 찾는다(노면·노견·측구 구간은 건너뜀). 설계선이 만나기 전에 끝나면
  끝단 기울기 차로 외삽하고 1m 올림.
- 카드 자동 줌아웃(effectiveHalfWidth)이 이 값을 쓴다. 보유 샘플 밖으로는 넓히지
  않는다(지반이 없어 빈 화면이 될 뿐).
- [적용]은 전 측점 중 필요한 최대 폭까지 함께 넓힌다 — 20m를 넘으면 그 값으로
  재생성해 각 카드가 자동 줌아웃할 지반을 확보한다.

자체검증: node tmp/tests/test_toe_extrapolate.mjs (사면 18m 교차점을 5m 컷오프
없이 탐색, 설계선이 15m에서 끊겨도 외삽으로 같은 자리), tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-23 18:54:38 +09:00
co-authored by Claude Opus 5
parent 91f843b5bb
commit eb41202bf4
3 changed files with 100 additions and 29 deletions
+14 -4
View File
@@ -119,12 +119,22 @@ export function createCrossSectionCard(
/** 유출측 추가 기슭막이 개수 제어(2026-08-22). */
extraWalls?: ExtraWallControl,
): CrossCardElement {
// 실효 표시 반폭 — 개별값 > 전역값(2026-08-06). **구조물 없는 상태**의 절·성토선이
// 원지반과 만나는 지점이 반폭 밖이면 이 카드만 자동 줌아웃(2026-08-22 사용자).
// 실효 표시 반폭 — 개별값 > 전역값(2026-08-06). 절·성토선이 원지반과 만나는 지점
// (교차점)이 반폭 밖이면 **이 카드만** 자동 줌아웃한다(2026-08-22, 판정 기준 개편
// 2026-08-23: 배수관용 5m 사면 규칙 대신 실제 교차점 = toeFitHalfWidth).
// 보유 샘플 밖까지는 넓히지 않는다 — 지반이 없어 빈 화면이 될 뿐이고, 그 경우
// [보기 반폭 적용]이 필요한 폭으로 백엔드 재생성을 건다.
const baseHalfWidth = stationWidth?.widthFor(section) ?? crossHalfWidth;
const requiredHalfWidth = culvertRequiredHalfWidth(section);
const sampledExtent = Math.max(
0,
...section.samples.map((sample) => Math.abs(sample.offset_m ?? 0)),
);
const requiredHalfWidth = Math.min(
Math.max(culvertRequiredHalfWidth(section) ?? 0, toeFitHalfWidth(section) ?? 0),
sampledExtent,
);
const effectiveHalfWidth =
baseHalfWidth !== undefined && requiredHalfWidth !== null
baseHalfWidth !== undefined && requiredHalfWidth > 0
? Math.max(baseHalfWidth, requiredHalfWidth)
: baseHalfWidth;
const card: CrossCardElement = document.createElement("article");