fix(B06): 추가 기슭막이 바닥을 원지반에 앉힘

연계(추가) 기슭막이가 성토사면과 안 맞는다는 지적(3-5)을 수치로 재니, 어긋난 곳은
접점이 아니라 바닥이었음 — 상단은 1:1.2 성토선에 붙는데 키는 요청값 그대로라
지형이 모자라면 바닥이 떴음(실측 0.12~0.87m).

자리는 그대로 두고 키를 지반까지 맞춤 — 지반이 낮으면 형태 높이 한계까지 키우고,
높으면 최소 높이까지 줄임. 조정창 되받기 값도 조정된 높이로 나감.

검증: 264.06 0.394 → 0.000m(키 1.00 → 1.39), 821.62 0.427 → 0.000, 914.93 0.122 → 0.000.
731.31 은 0.873 → 0.373 으로 줄되 남음(돌쌓기(메) 높이 한계 2.0m — 경고 유지가 맞음).
테스트 390 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-06 20:03:28 +09:00
co-authored by Claude Opus 5
parent 818042e45c
commit 89820848ec
@@ -312,8 +312,9 @@ export function buildOutletExtras(input: OutletExtrasInput): OutletExtrasResult
),
limit,
);
/** 기준선(근입 위)~상단 — 도형·자리 계산은 종전대로 이 값으로 한다. */
const exposed = height - REVET_EMBED_DEPTH_M;
/** 기준선(근입 위)~상단 — 도형·자리 계산은 종전대로 이 값으로 한다.
* 지형이 요청 높이만큼 안 나오면 아래 스캔 뒤 **낮춰서** 바닥을 지반에 앉힌다. */
let exposed = height - REVET_EMBED_DEPTH_M;
/** 자리 x(벽 하단 중점)에 지반 안착 + 상단이 성토선에 닿는 데 필요한 높이. */
const heightAt = (x: number): number => {
@@ -416,26 +417,36 @@ export function buildOutletExtras(input: OutletExtrasInput): OutletExtrasResult
if (!placeable(appliedX, appliedD)) break; // 자동 자리조차 매몰 — 이 단은 불가.
appliedD = Math.round(appliedD * 10) / 10;
appliedX = Math.round(appliedX * 10) / 10;
appliedAdjusts.push({
x: appliedX,
d: appliedD,
h: adjust.h != null ? height : null,
m: adjust.m,
});
const topElevation = autoTop - appliedD;
const anchorX = autoOffset + outward * appliedX;
const base = topElevation - exposed; // 근입 0.5 위 기준선
// 바닥을 **원지반에 앉힌다**(2026-09-06 사용자 지적: 연계 기슭막이가 사면과 안 맞음).
// 상단은 1:1.2 성토선에 붙어 있어야 하므로 자리는 그대로 두고 **키만** 지반까지
// 맞춘다 — 지반이 낮으면 키우고(형태 한계까지), 높으면 줄인다(최소 높이까지).
// 예전에는 요청 높이를 그대로 써 바닥이 최대 0.87m 떠 있었다(실측 264.06·731.31).
const groundBase = groundAt(anchorX);
const fitted = Math.min(
Math.max(topElevation - groundBase, EXTRA_WALL_MIN_HEIGHT_M - REVET_EMBED_DEPTH_M),
limit - REVET_EMBED_DEPTH_M,
);
const appliedExposed = Number.isFinite(fitted) ? fitted : exposed;
const base = topElevation - appliedExposed; // 근입 0.5 위 기준선
const wall = buildExtraWall(
i,
{ offset: anchorX, elevation: base },
outward,
exposed,
appliedExposed,
material,
Math.max(0, base - groundAt(anchorX)),
Math.max(0, base - groundBase),
form,
);
walls.push(wall);
// 되받기 — 지반에 맞춰 조정한 값이 **실제 적용 높이**다(조정창이 그대로 받아 적는다).
appliedAdjusts.push({
x: appliedX,
d: appliedD,
h: adjust.h != null ? appliedExposed + REVET_EMBED_DEPTH_M : null,
m: adjust.m,
});
// 성토선: src → (수평 선반 x>0이면 선반 끝) → 이음선 상단점. 사면길이 = 경사부.
const shelfRun = Math.max(0, appliedX - FILL_SLOPE_RATIO_MIN * appliedD);
const shelf: OffsetPoint | null =