feat(B06): 집수정 깊이를 관 여유로 결정

집수정 벽 높이를 성토 경사선과의 교점으로 잡던 방식을 걷어내고, **관 아래 여유
0.5m + 관경 + 관 위 여유 0.5m**로 정한다(2026-08-21 사용자 확정). 위 여유는
기슭막이와 같은 REVET_FREEBOARD_M을 써서 좌·우 표현이 어긋나지 않는다.

BASIN_BOTTOM_CLEARANCE_M(0.5) 신설. 종전 바닥판 두께 0.45가 아래 여유 자리를
겸하고 있었다.

검증(13+15.7, D800): 집수정 깊이 1.8m = 0.5 + 0.8 + 0.5, 바닥 여유 0.5 확인.
계획고 스윕 24케이스 문제 0. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 18:14:10 +09:00
co-authored by Claude Opus 5
parent 38acdd02ed
commit 6a5cd725c2
2 changed files with 14 additions and 16 deletions
@@ -114,3 +114,10 @@ export const FILL_STRUCTURE_HEIGHT_M = 3.0;
* 미는 경우는 이 하한으로 막는다.
*/
export const FILL_MIN_RISE_M = 0.3;
/**
* 집수정 바닥 여유(m) — **관 하단 아래**로 두는 깊이. 상부 여유는 기슭막이와 같은
* `REVET_FREEBOARD_M`(0.5)을 쓴다. 집수정 깊이 = 바닥 여유 + 관경 + 상부 여유
* (2026-08-21 사용자 확정 — 종전에는 성토 경사선과의 교점으로 높이를 잡았다).
*/
export const BASIN_BOTTOM_CLEARANCE_M = 0.5;
@@ -17,6 +17,7 @@
import type { CrossSection, CulvertSideSpec, SectionSample } from "./B06_Section_Api_Fetch";
import {
BASIN_BOTTOM_CLEARANCE_M,
FILL_MIN_RISE_M,
FILL_SLOPE_MAX_LENGTH_M,
FILL_SLOPE_RATIO_MAX,
@@ -24,6 +25,7 @@ import {
MIN_PIPE_COVER_M,
PITCHING_THICKNESS_M,
REVET_EMBED_DEPTH_M,
REVET_FREEBOARD_M,
REVET_LEAN_RATIO,
REVET_THICKNESS_M,
revetHeightLimit,
@@ -211,22 +213,11 @@ export function computeCulvertLayout(
// 형식 기본값 = ㄴ(L)형(2026-08-20 사용자 확정). 실무 내공 1.0m(울진 돌집수정).
const shape: BasinShape = "L";
const innerWidth = 1.0;
const floorThickness = REVET_THICKNESS_M;
const roadTop = designAt ? designAt(anchor.offset) : anchor.elevation;
// 벽 높이: **상단 도로측 꼭지점이 성토 경사선(설계선)과 만나는 교점**까지
// (2026-08-20 사용자 — 기슭막이와 같은 접점 규칙). 하한은 관경 + 0.45.
const basinMinHeight = diameter + REVET_THICKNESS_M;
let wallHeight = Math.max(roadTop - anchor.elevation, basinMinHeight);
if (designAt) {
const wallBaseProbe = anchor.offset + outward * innerWidth;
for (let h = basinMinHeight; h <= 4.0 + 1e-6; h += 0.05) {
// 상단 도로측 꼭지점(기움 반전 — 상단이 도로측으로 물러난다).
const topInner = wallBaseProbe - outward * REVET_LEAN_RATIO * h;
wallHeight = h;
if (anchor.elevation + h >= designAt(topInner)) break;
}
wallHeight = Math.max(wallHeight, basinMinHeight);
}
// 집수정 깊이 = **관 아래 여유 + 관경 + 관 위 여유**(2026-08-21 사용자 확정).
// 종전에는 성토 경사선과의 교점으로 높이를 잡아 지형에 따라 들쭉날쭉했다.
// 위 여유는 기슭막이와 같은 값(0.5)을 써서 좌·우 표현이 어긋나지 않게 한다.
const floorThickness = BASIN_BOTTOM_CLEARANCE_M;
const wallHeight = diameter + REVET_FREEBOARD_M;
// 벽 단면은 기슭막이와 동일(두께 0.45). 기움은 **수직 기준 반전** — 상단이
// 도로측(내공 쪽)으로 1:0.3 물러난다(2026-08-20 사용자 정정).
const wallOf = (baseOffset: number, dir: number): OffsetPoint[] => {