diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts index cda61b92..cc841a31 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts @@ -414,14 +414,13 @@ export function computeCulvertLayout( }; buildWall(culvert.inlet, inlet, inletInfo.outward, basinReason); // 유출 벽 자리 — 유입과 같은 규칙(사면선이 벽 이음선 상단점을 지나는 자리, 물매는 - // 1:1.2~2.0 범위에서 역산). 벽 밑은 관 축을 따라간 invert다 — 관이 벽을 관통하므로 - // 벽 바닥은 관 자리를 따라야 한다. - const axisRun0 = outletAnchor.offset - inlet.offset; - const axisRise0 = outletAnchor.elevation - inlet.elevation; - const invertAt = (offset: number): number => - Math.abs(axisRun0) > 1e-9 - ? inlet.elevation + axisRise0 * ((offset - inlet.offset) / axisRun0) - : inlet.elevation; + // 1:1.2~2.0 범위에서 역산). + // + // 벽 밑 = 그 자리의 **원지반**. 종전처럼 관 축(inlet → 사면 끝 직선) 위에 얹으면 + // 성토측 지반이 관 물매보다 가파른 구간에서 축이 지반 위로 떠올라 **벽이 뜬다** + // (2026-08-21 사용자 지적). 관 끝은 원지반 위라는 원칙대로 지반을 따르면 벽이 + // 지반에 앉고 관 물매가 그 자리에 맞춰진다. 역경사는 유입 invert로 클램프. + const invertAt = (offset: number): number => Math.min(groundAt(offset), inlet.elevation); let outletWallAnchor = outletAnchor; let outletPlacement: FillWallPlacement | null = null; if (designAt) { @@ -573,7 +572,8 @@ export function computeCulvertLayout( rebuild(); if (!outletWall) break; } - lengthM = target; + // 표기 길이 = **실제 그려진 관**의 올림값(목표를 적으면 도면보다 길게 적힌다). + lengthM = Math.max(1, Math.ceil(cutLength(pipeCorners) - 1e-6)); slopePct = Math.abs(outlet.offset - pipeStart.offset) > 1e-9 ? ((pipeStart.elevation - outlet.elevation) / Math.abs(outlet.offset - pipeStart.offset)) *