chore(요구): 404 R 곡선 합치기 의도 분석 · 제안(갈래 넷 · 수치 · 전후 그림 다섯)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6BNBFXFndbqYxu6sZuknK
This commit is contained in:
2026-10-17 21:46:48 +09:00
co-authored by Claude Opus 5.5
parent 614f12bb88
commit db05ab6a3e
6 changed files with 102 additions and 0 deletions
@@ -0,0 +1,102 @@
# 404 R 곡선 합치기 — 의도 분석 · 제안 (요구 250-6 · 242-14)
⬜ 브레인 답 필요 — 권장안은 398-4 접선 규칙 변경이 전제. 사용자 결정 넷(맨 끝) 뒤 구현 착수.
## 1. 의도 풀이
- 사용자 말 = 「크게 하나로 볼 수 있는 굽이는 곡선 하나 · 그 사이 직선은 사라짐 · 최적 경로는 지키되 노선 단순화」.
- 지금 모양 = 같은 쪽으로 도는 굽이 하나가 작은 곡선 3~5개 + 그 사이 짧은 직선(5~15 m)으로 쪼개짐. 그림 `제안_404_earthwork.png` 확대 칸.
- 쪼개지는 까닭 셋:
- 탐색 격자 = 16방향 · 한 노드에서 22.5° 까지만 꺾음 → 90° 굽이 = 노드 4개 이상(Search.py `DIRECTIONS` · `_turn_steps`).
- 곡선 접선 = 앞뒤 직선의 **절반까지만**(polyline.py `available = …/2` · Station.py `_corner`) → 이웃끼리 직선을 반씩 나눠 가져 큰 R 이 안 들어감 → 합치려 해도 이탈이 커져 막힘.
- 측점 맞춤(Station.py)은 곡선 MC 를 측점에 놓는 데 필요한 만큼만 합침 — 곡선 수 줄이는 목표 없음.
- 풀이: 같은 쪽 연속 꺾임 묶음 → 바깥 두 직선의 교점(IP) 하나 + 큰 단곡선 하나. 사이 직선 없어짐.
- 지켜야 할 것: 최소 R(별표2 · 설계속도 20 = 15/12 m) · 지반 기울기 안 나빠짐 · 추천 선에서 이탈 한도 · MC = 일반측점(사용자 규칙).
- 합치지 않는 것: 반대 방향(S자) 이웃 — 하나의 원으로 표현 불가 · 사이 직선 남음(편경사 전환 자리).
## 2. 지식DB 근거
| 항목 | 근거 | 쓰임 |
|---|---|---|
| 최소곡선반지름 20 km/h 일반 15 · 특수 12 m | 별표2 Ⅰ.2.다 · `technical_info/01_임도/02_상세설계/평면선형.md` §1 | 합친 곡선 R 하한 |
| 내각 155° 이상 곡선 생략 가능 | 같은 곳 · `original/산림과임업기술(임도)/2. 임도/4. 노선측량.md:144` | 쓰지 않음(09-07 사용자 반대 · 곡선은 늘 둠) |
| 내각 클수록 외거 작음 → R 크게 적용 가능 | `…/2. 임도구조.md:250` | 합친 큰 R 이 정석이라는 근거 |
| 복심곡선 = 같은 방향 · 다른 곡률 원곡선이 직접 접속 | `…/4. 노선측량.md:468` · 설치법 :648 | 갈래 ① 확장(단곡선으로 이탈이 크면 복심) — 이번 수치엔 안 씀 |
| 반향곡선 = 반대 방향 직접 접속 | `…/4. 노선측량.md:467` | S자는 합치지 않음 |
| 곡선 사이 직선 최소 길이 · 곡선 최소 길이 | 임도 근거 없음 · KDS 44 20 10 4.1.3(도로 · 20 km/h 최소 곡선 길이 30 m · 교각 작을수록 긴 곡선) 참고만 | 수치 기준으로 쓰지 않음 |
| BC · MC · EC 보조측점 | `…/4. 노선측량.md:144` | MC = 일반측점은 사용자 규칙(원전은 보조측점) |
## 3. 갈래
| 갈래 | 하는 일 | 장점 | 단점 |
|---|---|---|---|
| ① 같은 쪽 이웃 합치기(지금 접선 규칙) | 같은 쪽으로 도는 이웃 IP 둘 → 바깥 직선 교점 하나 · 되풀이 · 이탈 작은 것부터 · 조건 = 최소 R · 이탈 ≤ 한도 · 기울기 안 나빠짐 → 큰 R → 엔진 측점 맞춤 | 엔진 손대는 곳 작음 | 직선 절반 규칙에 막혀 덜 합쳐짐 · 큰 R 키운 뒤 측점 맞춤이 기울기를 다시 나쁘게 함 |
| **①b 합치기 + 398-4 접선 규칙** | ① 과 같되 접선 = 직선 절반 **또는 이웃이 안 쓰는 몫까지**(끝 직선은 통째) | 곡선 수 · 같은 쪽 짧은 직선이 가장 많이 줆 · 기울기 · 토공 그대로 또는 나아짐 | 398-4(접선 규칙) 결정 필요 · 파이썬 · TS 짝 둘 다 고침 · 옛 노선 좁은 자리 모양 바뀜 · 측점 맞춤기도 같은 규칙으로 |
| ② 노선 단순화(Douglas-Peucker 6 m) | 추천 선을 굵게 단순화해 IP 줄임 → 큰 R | 곡선 수 가장 적음 | **기울기 망가짐**(최대 33~48 %) · 토공 +30~50 % — 지그재그가 기울기 때문에 있는 것 · 탈락 |
| ③ 탐색 목적식 꺾임 벌점 | `TURN_COST` 1 → 3 · 6 | 탐색 자체가 곧은 길 선호 | 16방향 격자라 굽이당 노드 수는 그대로 · 3 = 변화 없음 · 6 = 곡선 38 → 36 · 최대 기울기 19.7 → 26.8 % · 탈락 |
## 4. 수치 (검증_sub4 · v5 추천 저장분 다섯 갈래 · 이탈 한도 4 m)
잰 것: 곡선 수 · IP 수 · 같은 쪽으로 도는 이웃 곡선 사이 직선 < 20 m 수 · 최대 이탈(맞춤 전 추천 선 기준 · m) · 최대 기울기(%) · 기울기 못 지킨 곳 · MC 측점 밖 곡선 · 절성토(㎥). 잣대 = 엔진 `route_metrics` 그대로(「지금」 값이 저장본과 같음 확인).
| 갈래 | 경우 | 곡선 | IP | 같은쪽 짧은 직선 | 최대 이탈 | 최대 기울기 | 기울기 위반 | 측점 밖 | 절성토 |
|---|---|---|---|---|---|---|---|---|---|
| gradeline | 지금 | 30 | 37 | 15 | 5.05 | 19.29 | 5 | 0 | 4129 |
| | ① 합치기 + 측점 | 22 | 24 | 8 | 5.54 | 26.05 | 6 | 6 | 4243 |
| | ①b 맞춤 전 | 22 | 22 | 7 | 3.74 | 21.06 | 4 | — | 4188 |
| | ①b + 측점(어림) | 22 | 22 | 7 | 4.11 | 20.39 | 3 | 12 | 4126 |
| | ② DP + 측점 | 17 | 17 | 4 | 6.77 | 36.27 | 11 | 3 | 5491 |
| earthwork | 지금 | 38 | 45 | 17 | 4.84 | 19.67 | 4 | 0 | 3925 |
| | ① 합치기 + 측점 | 30 | 31 | 9 | 4.90 | 18.76 | 5 | 3 | 4031 |
| | ①b 맞춤 전 | 23 | 23 | 3 | 5.78 | 18.84 | 2 | — | 3891 |
| | ①b + 측점(어림) | 23 | 23 | 3 | 5.92 | 16.11 | 1 | 14 | 3890 |
| | ② DP + 측점 | 19 | 20 | 7 | 8.28 | 40.56 | 10 | 4 | 5196 |
| gentle | 지금 | 33 | 36 | 14 | 4.84 | 17.53 | 4 | 0 | 3924 |
| | ① 합치기 + 측점 | 21 | 26 | 6 | 5.99 | 27.75 | 5 | 5 | 4207 |
| | ①b 맞춤 전 | 20 | 20 | 5 | 5.78 | 14.25 | 1 | — | 3830 |
| | ①b + 측점(어림) | 20 | 20 | 5 | 5.95 | 14.75 | 1 | 15 | 3873 |
| | ② DP + 측점 | 19 | 20 | 7 | 8.53 | 36.80 | 9 | 4 | 5123 |
| weighted | 지금 | 35 | 40 | 16 | 5.00 | 27.08 | 7 | 1 | 4984 |
| | ① 합치기 + 측점 | 24 | 25 | 8 | 5.46 | 27.08 | 4 | 4 | 4803 |
| | ①b 맞춤 전 | 21 | 21 | 4 | 4.57 | 27.08 | 4 | — | 5272 |
| | ①b + 측점(어림) | 21 | 21 | 4 | 3.65 | 27.08 | 4 | 13 | 5178 |
| | ② DP + 측점 | 16 | 16 | 3 | 6.58 | 36.71 | 12 | 2 | 6803 |
| follow | 지금 | 25 | 25 | 3 | 4.95 | 35.76 | 14 | 0 | 8234 |
| | ① 합치기 + 측점 | 18 | 18 | 3 | 7.87 | 34.04 | 9 | 0 | 8016 |
| | ①b 맞춤 전 | 18 | 18 | 4 | 3.74 | 36.41 | 10 | — | 7763 |
| | ①b + 측점(어림) | 18 | 18 | 5 | 4.00 | 34.76 | 9 | 13 | 7725 |
- ③ earthwork: TURN_COST 1 = 지금과 같음 · 3 = 같음 · 6 = 곡선 36 · 최대 기울기 26.81 % · 기울기 위반 4.
- 이탈 한도 6 m 도 돌림 — 4 m 와 곡선 수 차이 0~2개 · 이탈 · 기울기만 나빠짐 → 4 m 권장(`ROUTE_RECOMMEND_MAX_GAP_M` 과 같음).
- 읽는 법:
- ①b = 곡선 −25~40 %(평균 32 → 21) · 같은 쪽 짧은 직선 14~17 → 3~7(follow 는 3 → 4~5 그대로) · 기울기 위반 같거나 줆 · 절성토 ±3 % · 이탈 ≤ 6 m.
- ① = 직선 절반 규칙 탓에 덜 합쳐지고(곡선 22~30) · 측점 맞춤 뒤 기울기가 나빠지는 갈래가 생김(gradeline 26 % · gentle 28 %).
- 「①b + 측점(어림)」 측점 밖 12~15 = 이 시험용 간이 맞춤기 값(IP 밀기 · R 바꾸기만 · 되돌림 · 합치기 · 꺾임만 갈래 없음 · 막힘 대부분 = 「옮긴 조각이 더 가파름」 검사). 엔진 맞춤기를 398-4 규칙으로 고치면 줄어들 값 — 실제 수는 구현 뒤 잼.
그림(옅은 회색 = 맞춤 전 추천 선 · 곡선 = 파랑/주황 번갈아 · 점 = BC/EC · 위 = 전체 · 아래 = 곡선 빽빽한 곳 확대):
- `제안_404_earthwork.png` — 지금 · ① · ①b · ② 네 칸
- `제안_404_gradeline.png` · `_gentle.png` · `_weighted.png` · `_follow.png` — 지금 · ①b 두 칸
## 5. 398-4 와 관계
- 398-4 = 좁은 자리 접선을 직선 절반 대신 「이웃이 안 쓰는 몫까지」. 합치기 효과 대부분이 이 규칙에서 나옴(① 곡선 30 → ①b 23 · earthwork).
- 진단(earthwork · ① 뒤 남은 같은 쪽 쌍 17): 절반 규칙이면 이탈 > 6 m 로 막힘 9 · 직선 통째면 그중 8 이 이탈 ≤ 5 m.
- 바꿀 곳 = 선 짜기 짝 둘(`common_util_route_polyline.py` · `logic/B05_Profile_UI_RouteEdit_Curve.ts` · 거울 시험) + 측점 맞춤(`…_Station.py` `_corner` · `_placements` 자리 셈) + 손 편집 측점 맞춤 TS 짝(`logic/B05_Profile_RouteEdit_StationFit.ts`).
- 옛 노선: 넣은 R 이 직선 절반에 막혀 줄어 있던 곡선만 넣은 R 쪽으로 커짐(나머지 그대로).
## 6. 권장 — ①b
1. 398-4 접선 규칙 먼저(짝 · 거울 시험).
2. 추천 엔진 `_trace` 뒤 · `settle`(측점 맞춤) 앞에 「같은 쪽 이웃 합치기」 한 바퀴(Pool.py · 새 파일 `…_RouteInitial_Merge.py`):
- 조건 = 같은 쪽 회전 · 교점이 앞뒤 직선 앞쪽 · R ≥ 최소 R · 탐색 경로 이탈 ≤ 4 m · 옮긴 조각 기울기 안 나빠짐 · 이탈 작은 것부터 되풀이 · 끝에 R 키움.
- S자 · 머리핀 뒤집힘 · 끝 노드는 안 합침.
3. 측점 맞춤이 합친 곡선을 못 놓으면 그 합치기만 풀어 지금 길로(측점 밖이 지금보다 늘지 않게).
4. `ALGO_VERSION` 5 → 6 · 손 편집 [측점 스냅]엔 안 넣음 · 시험 = 같은 쪽 쌍 합쳐짐 · S자 안 합쳐짐 · 기울기 막힘 · 측점 밖 ≤ 지금.
- 기대: 곡선 −30 % 안팎 · 같은 쪽 짧은 직선 ¼ · 기울기 · 토공 그대로.
## 7. 사용자 결정 물음
1. 398-4 접선 규칙(이웃이 안 쓰는 몫까지) 바꿈 — 옛 노선 좁은 자리 곡선 모양 바뀜 · 허락?
2. 합친 큰 곡선이 MC = 일반측점에 못 놓일 때 — 합치기 풀기(권장 · 측점 밖 안 늘어남) / 측점 밖으로 둠(곡선 더 줄어듦)?
3. 이탈 한도 4 m(추천 큰 R 한도와 같음) — 그대로?
4. S자(반대 방향) 사이 짧은 직선은 남김 — 그대로?
Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB