From 0c51aef49e689641342ed77b29f443acf096390e Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 28 Jul 2026 18:28:02 +0900 Subject: [PATCH] auto: 2026-07-28 18:28 (EOMSANGDON-HOME) --- B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts b/B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts index 89843297..7635d957 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts +++ b/B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts @@ -381,7 +381,17 @@ export function createSurfaceMapViewer(): SurfaceMapViewer { "wheel", (event) => { event.preventDefault(); + const prevScale = scale; scale = Math.min(8, Math.max(0.5, scale * (event.deltaY < 0 ? 1.15 : 0.87))); + // 마우스 커서 아래 지점이 줌 전후로 같은 화면 위치에 머물도록 offset 보정. + // screen = center + (base - center)·scale + offset 이므로, + // 커서 고정 조건을 풀면 offset' = (cursor - center)·(1 - r) + offset·r (r = scale'/scale). + const ratio = scale / prevScale; + const rect = viewport.getBoundingClientRect(); + const cursorX = event.clientX - rect.left - rect.width / 2; + const cursorY = event.clientY - rect.top - rect.height / 2; + offsetX = cursorX * (1 - ratio) + offsetX * ratio; + offsetY = cursorY * (1 - ratio) + offsetY * ratio; scheduleDraw(); }, { passive: false },