diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts index 3f0a736f..df60e4a5 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts @@ -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, diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts index 02bf62d4..445c53ec 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts @@ -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; }