feat(B06): 기슭막이 하단을 수평 기초로 — 높이는 상~하단 전체로 표기

- 하단선 = 수평(기초공사 기준 — 2026-08-22 사용자 확정). 깊이는 벽
  발자국 안 원지반(또는 관 invert) 최저점 − 0.5m. 종전 지반 추종
  경사 하단 폐지.
- 전면 1:0.3 경사선을 하단까지 연장 — 바닥이 깊어진 만큼 발끝이
  바깥으로. 발끝 지반이 더 낮으면 한 번 더 내림(2-pass).
- WallLayout.height = 상단~하단 전체 높이(근입 포함)로 변경 — 툴팁
  H 표기 기준. 설계 파라미터(폭·기움)는 invert 기준 높이 유지.
- 검증: 4+4.3(H 2.0/2.1)·13+15.7(H 1.9) 하단 수평·관 감싸기 SVG
  실좌표 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-22 09:46:20 +09:00
co-authored by Claude Opus 5
parent a24cfe1378
commit 93d2838f4c
2 changed files with 29 additions and 14 deletions
@@ -385,26 +385,39 @@ export function computeCulvertLayout(
const topBack: OffsetPoint = { offset: backOffset, elevation: topElevation };
// 상단 변: 사다리꼴 상단(t/2) + 띠(t). 이음선은 상단 변 중간점에서 1:0.3으로 바닥까지.
const topFront = topJoint + outward * thickness;
// 근입: 하단선 **원지반을 수직으로 0.5m 내린 선**이다(2026-08-21 사용자 확정).
// 종전에는 수평 바닥이라 사면에서 앞 모서리가 떴다.
// 기슭막이는 **배관을 묻고 보강하는 구조물 — 관을 감싸야 한다**(2026-08-22 사용자
// 확정): 하단은 어떤 경우에도 관 하단(invert = anchor.elevation) 아래 0.5m를
// 확보한다. 관이 지반보다 낮게 묻힌 자리는 invert−0.5가 지반−0.5보다 깊고,
// 바닥이 원지반에서 뜬 벽(floatGapM>0)도 관 기준 0.5는 그대로 내려간다
// (뜬 공간은 별도 지지 구조물 — 추가 예정).
const bottomAt = (offset: number): number =>
(floatGapM > 1e-6 ? anchor.elevation : Math.min(groundAt(offset), anchor.elevation)) -
// 하단선: **수평**(2026-08-22 사용자 확정 — 기초공사는 수평 기초라 지반을 따라
// 기울지 않는다). 깊이는 벽 발자국 안 기준선(원지반 또는 관 invert)의 **최저점**
// 아래 0.5m — 기슭막이는 관을 감싸는 구조물이라 관 하단(invert) 아래 0.5m는 어떤
// 경우에도 확보한다. 바닥이 원지반에서 뜬 벽(floatGapM>0)은 관 invert 기준 0.5
// 내려간다(뜬 공간은 별도 지지 구조물 — 추가 예정).
// 전면(계류측) 경사선(1:0.3)은 그대로 하단까지 **연장**한다 — 바닥이 깊어진 만큼
// 전면 발끝이 바깥으로 나간다. 발끝 지반이 더 낮으면 한 번 더 내린다(2-pass).
const frontXAt = (elevation: number): number =>
topFront + outward * REVET_LEAN_RATIO * (topElevation - elevation);
let bottomElevation =
(floatGapM > 1e-6
? anchor.elevation
: Math.min(groundAt(backOffset), groundAt(frontBase), anchor.elevation)) -
REVET_EMBED_DEPTH_M;
const bottomBack: OffsetPoint = { offset: backOffset, elevation: bottomAt(backOffset) };
const bottomFront: OffsetPoint = { offset: frontBase, elevation: bottomAt(frontBase) };
if (floatGapM <= 1e-6) {
const toeGround = Math.min(groundAt(frontXAt(bottomElevation)), anchor.elevation);
bottomElevation = Math.min(bottomElevation, toeGround - REVET_EMBED_DEPTH_M);
}
const bottomBack: OffsetPoint = { offset: backOffset, elevation: bottomElevation };
const bottomFront: OffsetPoint = {
offset: frontXAt(bottomElevation),
elevation: bottomElevation,
};
const wall: WallLayout = {
role: spec.role,
form: spec.revet_form ?? null,
lengthM: spec.revet_length_m ?? null,
backOffset,
outerOffset: frontBase,
outerOffset: bottomFront.offset,
base: anchor.elevation,
height,
// 높이 = **상단~하단(수평 기초) 전체 높이**(2026-08-22 사용자 확정 — 종전에는
// 관 invert~상단만 적었다). 설계 파라미터(경사·폭)는 invert 기준 높이로 유지.
height: topElevation - bottomElevation,
floatGapM,
outward,
topBack,
@@ -35,6 +35,7 @@ export interface WallLayout {
/** 전면(계류측) 바닥 offset. */
outerOffset: number;
base: number;
/** 벽 전체 높이(m) = 상단 ~ 수평 기초 하단(2026-08-22 사용자 확정 — 근입 포함). */
height: number;
/**
* 바닥이 원지반에서 뜬 간격(m, 2026-08-22 사용자 확정). 손으로 안쪽에 당겨 높이
@@ -49,7 +50,8 @@ export interface WallLayout {
topBack: OffsetPoint;
/** 이음선 상단점(평행사변형↔사다리꼴 상단 교차점) — 성토 사면선이 여기서 끝난다. */
topJoint: OffsetPoint;
/** 하단선 양 끝 — **원지반을 수직 0.5m 내린 선**이라 사면에서는 기울어 있다. */
/** 하단선 양 끝 — **수평 기초**(2026-08-22 사용자 확정): 발자국 최저 지반(또는 관
* invert) 0.5m 표고의 수평선. 전면 발끝은 1:0.3 경사선을 하단까지 연장한 자리다. */
bottomBack: OffsetPoint;
bottomFront: OffsetPoint;
}