fix(b06): 물넘이포장 도수로/돌붙임 길이 = 성토 사면보다 길면 원지반 이음 조각까지 한 선 · 월류 높이선 성토 쪽 = 성토선 점선 연장과 교점 (315)
- 315-1 fordChuteLine — 길이 맞춘 선의 첫 조각만 쓰던 흠(원지반 이음 조각 버림) · 이은 조각까지 한 선 · 길이 없음 · 짧은 길이 · 절토 쪽 그대로 - 315-2 overflowLine — 성토 쪽(노면 끝 밖 설계선이 내려감) = 성토 사면선을 노면 끝 너머 위로 연장해 월류 높이선과 만나는 자리에서 끝 · 절토 · 늘인 노면 끝(294-3) 그대로 · 같은 점선 양식(B06 카드 · B07 [상세] 같은 그림) - 시험 test_315_ford_chute_overflow 새로 · test_287 월류선 기대값 315 규칙 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TteK8mfYZetk5P3bEZkyVZ
This commit is contained in:
@@ -6,7 +6,8 @@
|
||||
* (`ford_slope_deg` → `slope_pct`)로 지대 낮은 쪽 한 경사로 기울여 낸 면 · 설계 중심점이 그 위.
|
||||
* 노면 밖은 설계선 그대로 — 노면 끝에서 성토 · 절토 사면이 이어짐(늘어나지 못한 자리 = 성토).
|
||||
* · 포장층 = 노면공 포장 형상(`appendPavementOverlay`)을 노견까지.
|
||||
* · 월류 높이선(회색 점선) = 노면 위로 월류 높이(`depth_m`)만큼 · 노면과 같은 각도.
|
||||
* · 월류 높이선(회색 점선) = 노면 위로 월류 높이(`depth_m`)만큼 · 노면과 같은 각도 · 성토 쪽은 성토선을
|
||||
* 점선으로 늘여 이음(315-2).
|
||||
* · 도수로 · 돌붙임 띠 = 유출(지대 낮은 쪽) 성토사면.
|
||||
* ========================================================================== */
|
||||
|
||||
@@ -119,15 +120,12 @@ export function appendFordPavementOverlay(
|
||||
if (typeof spec.chainage_m === "number")
|
||||
el.setAttribute("data-structure-id", `pipe-${spec.chainage_m.toFixed(2)}`);
|
||||
});
|
||||
// 월류 높이선 — 콘크리트 윗면(설계 노면) 위로 월류 높이만큼 · 같은 각도(그림_183)
|
||||
// 월류 높이선 — 콘크리트 윗면(설계 노면) 위로 월류 높이만큼 · 같은 각도(그림_183) · 성토 쪽 = 성토선 연장(315-2)
|
||||
const depth = spec.depth_m ?? 0;
|
||||
if (depth > 0)
|
||||
svg.append(
|
||||
line(
|
||||
[
|
||||
`${x(edges.left.offset_m)},${y(edges.left.elevation_m + depth)}`,
|
||||
`${x(edges.right.offset_m)},${y(edges.right.elevation_m + depth)}`,
|
||||
],
|
||||
overflowLine(design, depth).map((p) => `${x(p.offset)},${y(p.elevation)}`),
|
||||
"b06-chart__ford-deck-plan",
|
||||
),
|
||||
);
|
||||
@@ -145,6 +143,35 @@ export function fordEdges(design: CrossDesign): CrossDesign["road_edges"] | unde
|
||||
return reach.side === "left" ? { ...edges, left: end } : { ...edges, right: end };
|
||||
}
|
||||
|
||||
/**
|
||||
* 월류 높이선(315-2) — 노면 양 끝 위 월류 높이 · 노면과 같은 각도. 성토 쪽(노면 끝 밖 설계선이 내려감)은
|
||||
* 성토 사면선을 노면 끝 너머 위 · 안쪽으로 늘여 월류 높이선과 만나는 자리에서 끝 → 노면 끝까지 그 연장선.
|
||||
* 절토 쪽 · 늘인 노면 끝(294-3)은 노면 끝 위 그대로. 좌(+offset) → 우 차례.
|
||||
*/
|
||||
export function overflowLine(design: CrossDesign, depth: number): OffsetPoint[] {
|
||||
const edges = fordEdges(design);
|
||||
if (!edges) return [];
|
||||
const { left, right } = edges;
|
||||
const span = Math.abs(left.offset_m - right.offset_m);
|
||||
const side = (edge: typeof left, other: typeof left): OffsetPoint[] => {
|
||||
const top = { offset: edge.offset_m, elevation: edge.elevation_m + depth };
|
||||
const outward = Math.sign(edge.offset_m - other.offset_m) || 1;
|
||||
const next = (design.design_line ?? [])
|
||||
.filter((p) => (p.offset_m - edge.offset_m) * outward > 1e-6)
|
||||
.sort((a, b) => (a.offset_m - b.offset_m) * outward)[0];
|
||||
const cut = edge.offset_m === design.tilt_reach?.offset_m; // 늘인 끝 = 원지반(294-3 · 절토)
|
||||
if (cut || !next || next.elevation_m >= edge.elevation_m - 1e-6 || span < 1e-9) return [top];
|
||||
// 안쪽 d m 에서 성토선 = edge + fill·d · 월류선 = edge + depth + road·d → d = depth / (fill − road)
|
||||
const fill = (edge.elevation_m - next.elevation_m) / Math.abs(next.offset_m - edge.offset_m);
|
||||
const road = (other.elevation_m - edge.elevation_m) / span;
|
||||
if (fill <= road + 1e-9) return [top];
|
||||
const d = Math.min(depth / (fill - road), span);
|
||||
const meet = { offset: edge.offset_m - outward * d, elevation: edge.elevation_m + fill * d };
|
||||
return [{ offset: edge.offset_m, elevation: edge.elevation_m }, meet];
|
||||
};
|
||||
return [...side(left, right), ...side(right, left).reverse()];
|
||||
}
|
||||
|
||||
/** 원지반 꺾은선의 그 오프셋 표고(밖은 끝값). */
|
||||
function groundZ(ground: readonly OffsetPoint[], offset: number): number | null {
|
||||
if (!ground.length) return null;
|
||||
@@ -193,16 +220,16 @@ export function outletFillLine(
|
||||
|
||||
/**
|
||||
* 물넘이 도수로 · 돌붙임 선(286-3 · 294-4) — 낮은 쪽 끝단에서 성토사면 따라 · 길이 비움 = 원지반 닿으면 끝 ·
|
||||
* 길이 넣음 = 그 길이(사면보다 길면 원지반 따라 이어) · 양측 절토(늘인 노면 끝이 원지반) = 길이 없으면 안 그림.
|
||||
* 횡단 띠 · 3D 띠가 같이 씀(그림 전용).
|
||||
* 길이 넣음 = 그 길이(사면보다 길면 원지반 따라 이어 · 315-1 이은 조각까지 한 선) · 양측 절토(늘인 노면 끝이
|
||||
* 원지반) = 길이 없으면 안 그림. 횡단 띠 · 3D 띠가 같이 씀(그림 전용).
|
||||
*/
|
||||
export function fordChuteLine(
|
||||
design: CrossDesign,
|
||||
chute?: { length_m?: number },
|
||||
ground?: readonly OffsetPoint[],
|
||||
): OffsetPoint[] {
|
||||
return (
|
||||
chuteRun([{ points: outletFillLine(design, ground) }], chute?.length_m, ground)[0]?.points ?? []
|
||||
return chuteRun([{ points: outletFillLine(design, ground) }], chute?.length_m, ground).flatMap(
|
||||
(run, i) => (i ? run.points.slice(1) : run.points),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user