From 38fd7e49e0f16794a541f695353eefa461868f8d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 24 Aug 2026 19:42:07 +0900 Subject: [PATCH] =?UTF-8?q?fix(B05):=20=EA=B5=AC=EC=A1=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=84=B1=ED=86=A0=20=EB=B9=84=ED=83=88=20Z=20=EB=B0=98?= =?UTF-8?q?=EC=A0=84=20=E2=80=94=20=EC=9C=A0=EC=B6=9C=EC=B8=A1=20=EC=8B=A4?= =?UTF-8?q?=EB=A3=A8=EC=97=A3=20=EB=B0=B0=EC=97=B4=20=EB=B0=A9=ED=96=A5=20?= =?UTF-8?q?=EC=A0=95=EA=B7=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 3D 제보: 구조물 자리의 성토가 경사 방향이 뒤집혀 위로 솟는다. 원인은 직전 커밋(b5ceb861)에서 유출측 편거리 정렬을 뺀 것이다. 뒤쪽 코드가 비탈의 도로측 끝점을 **배열 위치**로 집는다 — `slopeRelative`(Corridor_Station)와 코리도 빌더(Corridor_Build)가 `side === "right" ? points.at(-1) : points[0]`로 잡고, 비탈 보간기도 오름차순 배열을 전제한다. 유출이 우측인 측점은 수집 순서(도로 → 바깥)가 편거리 내림차순이라 **바깥 끝을 도로측으로** 잡았고, 그만큼 비탈이 뒤집혀 얹혔다. 정렬로 되돌리면 다단 계단 순서가 다시 깨지므로, 체인은 그대로 두고 **배열 방향만** 오름차순으로 뒤집는다(첫 점이 마지막 점보다 바깥이면 reverse). 점 순서(성토선 > 본 기슭막이 > 추가 성토선 > 추가 기슭막이)는 보존된다. BUILD_VERSION 18 → 19(저장 코리도 만료). tsc/prettier 통과, pytest 196 passed(기존 실패 1건 유지). Co-Authored-By: Claude Opus 5 (1M context) --- B05_Profile/B05_Profile_UI_Corridor.ts | 2 +- B05_Profile/B05_Profile_UI_Corridor_Station.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/B05_Profile/B05_Profile_UI_Corridor.ts b/B05_Profile/B05_Profile_UI_Corridor.ts index 7f211e03..0b1c10a6 100644 --- a/B05_Profile/B05_Profile_UI_Corridor.ts +++ b/B05_Profile/B05_Profile_UI_Corridor.ts @@ -76,7 +76,7 @@ function fnv1a(text: string): string { * (2026-08-23 사용자 보고: "원복이 안 된 것 같다가 갑자기 반영됨"). 판번호를 해시에 * 섞어 두면 배포와 동시에 저장본이 만료된다. */ -const BUILD_VERSION = 18; // 조작값 캐시 반영 · 비탈 실루엣 순서 복구(2026-08-24). +const BUILD_VERSION = 19; // 유출측 비탈 배열 방향 정규화 — Z 반전 수정(2026-08-24). /** 종횡단 정본에서 코리도에 영향을 주는 입력만 요약해 해시 — 갱신 감지 기준. */ export function corridorHash(detail: SectionDetailResponse, routePoints: RoutePoint[]): string { diff --git a/B05_Profile/B05_Profile_UI_Corridor_Station.ts b/B05_Profile/B05_Profile_UI_Corridor_Station.ts index d7c288bc..3869aeb4 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Station.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Station.ts @@ -410,6 +410,13 @@ export function classifyStation(section: CrossSection): StationPieces | null { // 범위 밖이라 종전 정렬을 유지한다. if (side !== outletSide) { silhouette = [...silhouette].sort((a, b) => a.offset_m - b.offset_m); + } else if (silhouette[0].offset_m > silhouette[silhouette.length - 1].offset_m) { + // 뒤쪽 코드(`slopeRelative`)가 도로측 끝점을 **배열 위치**로 집는다 — 오름차순 + // 편거리 배열을 전제한다. 유출이 우측이면 수집 순서(도로 → 바깥)가 내림차순이라 + // 바깥 끝을 도로측으로 잡아 **비탈 Z가 뒤집힌다**(2026-08-24 사용자 3D 제보). + // 정렬로 되돌리면 계단 순서가 다시 깨지므로 **뒤집기만** 한다 — 점 순서(체인)는 + // 그대로이고 배열 방향만 오름차순이 된다. + silhouette = [...silhouette].reverse(); } const kind: CorridorKind = basinCut && side === inletSide ? "cut" : side === "left" ? leftRole : rightRole;