Files
GhiVideo/docs/history/2026-06-26_1411_스테이션바-거리축-전환.md
b23042andClaude Opus 4.8 e9052143d7 feat: 스테이션바 측점 정확도 개선 + 영상 컨트롤 UI 통합 + 종합 기술문서
스테이션바/측점(체이니지)
- 역 재진입 마커 누락 수정: 측점기준 탐지에 좌표근접(pxPassesTo) 합집합 보강(중복 24px 제거)
- kmExists 판정: 좌표 반경만으로 잡힌 통과는 측점값 라벨/검색에서 제외(마커 동그라미는 유지)
- 측점값 라벨 겹침 숨김(좌측 우선), 동일항목 브래킷 클러스터
- 측점 검색 순환(통과방향 다음→끝에서 처음), 마커 기준 후보 산출, 입력값 유지/blur 삭제
- 연속 체이니지 수직투영 유틸 분리(client/src/utils/chainage.ts), Minimap 컴포넌트 추가

영상 컨트롤 UI
- 선형/드론궤적/좌측패널 토글을 재생바로 통합(settingsStore 공유·persist)
- 드론 GPS·고도 HUD 상시 표시, 경로표고·투명도 항상 노출, 겹침제외 버튼 숨김
- 재생바 요소 재배치(좌측패널→선형→드론궤적→드론위치정보→시설등급), 활성색 amber 통일

문서/도구
- 종합 기술명세서(인계+특허 기초) md/html/pdf 3종, UI개선 보고서 3종
- md→html→pdf 변환 스크립트(scripts/md2docs.sh) + 스타일(docs/assets/report.css)
- 작업 히스토리 다수 추가(docs/history/)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 14:56:27 +09:00

2.5 KiB
Raw Permalink Blame History

스테이션바 거리축(이동량 기반) 전환

소요 시간: 약 20분 Context 사용량: input ~90k / output ~9k tokens

결론

스테이션바 커서/구간/마커의 가로축을 시간(프레임) 선형 → 누적 이동거리(거리축) 로 전환. 드론이 호버링(이동 없음)하면 커서가 멈추고, 실제로 이동할 때만 커서가 진행한다. (사용자 요청 A안)

근거 / 변경 내용

  • 파일: client/src/stationbar/StationBar.tsx
  • 기존: px = 시작 + (currentTime/duration) × 트랙폭 — 순수 시간 정비례. 호버 중에도 커서 전진(배지 측점값은 정지 → 불일치).
  • 변경: 시간↔진행도 매핑을 거리축으로 교체. 핵심은 매핑 함수 한 곳에 집중되어 커서·구간색·구조물 마커가 일관되게 따라옴.
    1. progRef: 프레임별 {time, frac} 배열. frac = 누적 이동거리 비율(0~1, 단조 비감소).
    2. 진행도 산출(viewedRef 빌드 useEffect): 연속 측점값(chain)을 ±W(8프레임) 이동평균으로 평활(GPS 지터 제거) 후 프레임간 |Δ| 누적 = 실제 이동량. 전체로 정규화.
    3. cumFracAtTime(t): 시간→진행비율(이진탐색+선형보간). progRef 미준비 시 시간선형 폴백.
    4. timeAtFrac(f): 역변환(진행비율→시간) — 바 클릭/측점 seek 용.
    5. pxAtTime(t) = 시작 + cumFracAtTime(t) × 트랙폭 — 모든 배치가 공유.
    6. 라이브 커서 RAF, seekToTrackX 도 거리축 함수 사용.

동작

  • 호버(이동 無): frac 정체 → 커서 정지. 이동: frac 증가 → 좌→우 진행.
  • 전진/후진 모두 이동량으로 더해져 커서는 단조 진행(방향은 기존 주황/청록 구간색으로 구분).
  • 배지 측점값과 커서가 동일 데이터(연속 측점값)에서 파생 → 표시·이동 일관.

검증

  • tsc --noEmit 통과 + client/dist 빌드 완료. (pm2 ghiVideo 는 정적 서빙 → 재시작 불필요, 브라우저 새로고침)

다음 단계 참고 / 되돌리기

  • 사용자가 "이상하면 원복" 예정. 되돌리려면 pxAtTime/cumFracAtTime/timeAtFrac 를 기존 시간선형 ((t/duration))으로 복귀시키고 progRef/평활 블록 제거하면 됨.
  • 평활 반폭 W=8, 호버 판정은 평활로 처리(별도 데드밴드 없음). 호버 중 커서가 미세하게 기어가면 W를 키우거나 소량 데드밴드 추가.
  • 부작용: 호버가 길어도 바에서 폭 0으로 수렴 → 바 클릭으로 호버 내부 시간 미세 seek 불가(영상 타임라인 사용).