feat(B06): 성토 물매 1:1.2 고정 — 벽이 나간 만큼 노폭 연장

물매를 1:1.2~2.0 범위에서 역산하던 방식을 걷어내고 **수평 1.2 : 수직 1 고정**으로
바꿨다(2026-08-21 사용자 확정). 벽이 1:1.2 사면이 닿는 자리보다 밖에 있으면 물매를
완만하게 바꾸는 대신 **노폭을 그만큼 늘린다** — 기슭막이를 바깥으로 1m 밀면 노폭이
약 1m 늘어난다.

- fillSlopeOf가 [원 노견 → 연장된 노견 → 벽 이음선 상단점] 폴리라인을 돌려주고,
  설계선 오버레이가 그 폴리라인을 그린다(노면 연장 구간이 수평으로 붙는다).
- 반대로 벽이 안쪽이라 물매가 1:1.2보다 급해지는 자리는 노폭으로 못 맞춘다(도로를
  좁힐 수는 없다) — 자동 자리를 1:1.2가 될 때까지 바깥으로 미는 처리를 유지한다.
- fillSlope.roadWideningM 신설, 툴팁에 "노폭 연장 x.xxm" 표시.

검증(계획고 스윕 24케이스): 물매 23건이 정확히 1:1.200(나머지 1건은 성토고 0.2m로
사면이랄 게 없는 측점). 벽 이동 시험 — 밖으로 1m씩 밀 때 노폭 연장 1.52→3.27→
4.22→5.21m, 물매는 계속 1:1.200. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 18:35:53 +09:00
co-authored by Claude Opus 5
parent 6391bb4c7e
commit 67ec86b05f
5 changed files with 116 additions and 92 deletions
+16 -16
View File
@@ -451,14 +451,8 @@ export function appendCrossDesignOverlay(
maxOffset: number;
minElevation?: number;
maxElevation?: number;
minSlope?: {
from: { offset: number; elevation: number };
to: { offset: number; elevation: number };
};
maxSlope?: {
from: { offset: number; elevation: number };
to: { offset: number; elevation: number };
};
minSlope?: { points: Array<{ offset: number; elevation: number }> };
maxSlope?: { points: Array<{ offset: number; elevation: number }> };
},
): void {
const line = design.design_line;
@@ -604,14 +598,20 @@ export function appendCrossDesignOverlay(
// 을 그린다. 벽 자리가 관 길이 맞춤으로 옮겨져도 노견 → 벽 이음선 상단점을 잇는 단일
// 각도가 유지된다(2026-08-21 사용자 ②, 성토 사면은 단일 각도).
for (const segment of [trim?.minSlope, trim?.maxSlope]) {
if (!segment) continue;
const seg = document.createElementNS(SVG_NS, "line");
seg.setAttribute("x1", String(x(segment.from.offset)));
seg.setAttribute("y1", String(toDisplayY(segment.from.elevation)));
seg.setAttribute("x2", String(x(segment.to.offset)));
seg.setAttribute("y2", String(toDisplayY(segment.to.elevation)));
seg.setAttribute("class", "b06-chart__design-cross");
svg.append(seg);
if (!segment || segment.points.length < 2) continue;
// 폴리라인 — [원 노견, (연장된 노견), 벽 이음선 상단점]. 물매가 1:1.2 고정이라
// 벽이 밖으로 나간 만큼 노면이 연장된다(2026-08-21 사용자 확정).
for (let i = 1; i < segment.points.length; i += 1) {
const a = segment.points[i - 1];
const b = segment.points[i];
const seg = document.createElementNS(SVG_NS, "line");
seg.setAttribute("x1", String(x(a.offset)));
seg.setAttribute("y1", String(toDisplayY(a.elevation)));
seg.setAttribute("x2", String(x(b.offset)));
seg.setAttribute("y2", String(toDisplayY(b.elevation)));
seg.setAttribute("class", "b06-chart__design-cross");
svg.append(seg);
}
}
// 차도·노견 경계 짧은 수직 틱(N-4-2): ±3.6px(기존 ±6의 60%). 노면 단일 기울기라 육안