fix(횡단): 사면 구간 재료를 **그린 경사비**로 가름 — 「토사 경사인데 암」 라벨 없앰
다른 창이 전 측점을 돌려 찾은 것(용화 5601e828 · route 169, 63측점 124구간). `material: "rock"` 인데 경사비가 1.0(토사)인 구간이 **13개** 나왔음. 까닭 — 재료를 **암반 경계선을 다시 재서** 붙였음. 그런데 무릎을 지난 뒤에도 경계선은 지반을 따라 계속 오르므로, 토사 경사로 그린 구간이 경계 아래로 **되돌아가 있는** 일이 흔함. 그것을 경계로 재면 그린 것과 라벨이 어긋남. 고침 — 재료는 **그 구간을 실제로 그린 경사비**를 따라 붙임(암 경사비에 가까우면 암, 토사 경사비에 가까우면 토사). 두 경사비가 같으면(2단 절토 아님) None. 영향 — 별표2 경사 판정이 갈리던 자리임. 13개가 「암인데 너무 완만」 위반으로 잘못 뜰 수 있었음. 토사 구간 50개는 종전대로 위반 0. 자체검증 — 새 시험 1건: 지반이 가파른 암 지반에서 모든 구간의 재료가 그 경사비와 맞는지 확인(어긋나면 실패). 거울 시험도 통과. 전체 542 passed · 18 skipped. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -351,12 +351,18 @@ class _SectionGeometry:
|
|||||||
berm_rise = math.tan(math.radians(self.berm.slope_deg)) * self.berm.width_m
|
berm_rise = math.tan(math.radians(self.berm.slope_deg)) * self.berm.width_m
|
||||||
if abs(rise - berm_rise) < 1e-9:
|
if abs(rise - berm_rise) < 1e-9:
|
||||||
continue
|
continue
|
||||||
|
# 재료는 **그 구간을 실제로 그린 경사비**로 가른다 — 경계선을 다시 재면
|
||||||
|
# 안 된다. 무릎을 지난 뒤에도 경계선은 지반을 따라 계속 오르므로, 토사
|
||||||
|
# 경사로 그린 구간이 경계 아래로 되돌아가 있는 일이 흔하다. 그것을 경계로
|
||||||
|
# 재면 「경사비는 토사인데 재료는 암」인 구간이 생긴다(2026-09-07 다른 창
|
||||||
|
# 실측: 용화 63측점에서 13구간). 그린 대로 적는 것이 맞다.
|
||||||
material: str | None = None
|
material: str | None = None
|
||||||
if self.two_stage:
|
if self.two_stage and abs(self.soil_cut_ratio - self.cut_ratio) > 1e-9:
|
||||||
middle_d = (start_d + end_d) / 2.0
|
drawn = run / rise
|
||||||
middle_z = (start_z + end_z) / 2.0
|
|
||||||
material = (
|
material = (
|
||||||
"soil" if middle_z >= self._rock_boundary_z(side, middle_d) else "rock"
|
"soil"
|
||||||
|
if abs(drawn - self.soil_cut_ratio) < abs(drawn - self.cut_ratio)
|
||||||
|
else "rock"
|
||||||
)
|
)
|
||||||
segments.append(
|
segments.append(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -381,11 +381,13 @@ export class SectionGeometry {
|
|||||||
const bermRise = Math.tan((this.berm.slopeDeg * Math.PI) / 180) * this.berm.widthM;
|
const bermRise = Math.tan((this.berm.slopeDeg * Math.PI) / 180) * this.berm.widthM;
|
||||||
if (Math.abs(rise - bermRise) < 1e-9) continue; // 소단(평탄부)
|
if (Math.abs(rise - bermRise) < 1e-9) continue; // 소단(평탄부)
|
||||||
}
|
}
|
||||||
|
// 재료는 **그 구간을 실제로 그린 경사비**로 가른다(짝 파이썬과 같은 까닭) —
|
||||||
|
// 경계선을 다시 재면 「경사비는 토사인데 재료는 암」인 구간이 생긴다.
|
||||||
let material: string | null = null;
|
let material: string | null = null;
|
||||||
if (this.twoStage) {
|
if (this.twoStage && Math.abs(this.soilCutRatio - this.cutRatio) > 1e-9) {
|
||||||
const middleD = (startD + endD) / 2;
|
const drawn = run / rise;
|
||||||
const middleZ = (startZ + endZ) / 2;
|
material =
|
||||||
material = middleZ >= this.rockBoundaryZ(side, middleD) ? "soil" : "rock";
|
Math.abs(drawn - this.soilCutRatio) < Math.abs(drawn - this.cutRatio) ? "soil" : "rock";
|
||||||
}
|
}
|
||||||
segments.push({
|
segments.push({
|
||||||
side,
|
side,
|
||||||
|
|||||||
Reference in New Issue
Block a user