diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs index 63bfaf3..a88484e 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs @@ -170,23 +170,25 @@ namespace AGVNavigationCore.Controls private void UnifiedAGVCanvas_MouseWheel(object sender, MouseEventArgs e) { - // 현재 마우스 위치를 월드 좌표로 변환 (줌 전) - var mouseWorldBefore = ScreenToWorld(e.Location); + // 마우스 커서 위치 (스크린 좌표) + Point mouseScreenPos = e.Location; + // 줌 전 마우스가 가리키는 월드 좌표 + float worldX_before = (mouseScreenPos.X - _panOffset.X) / _zoomFactor; + float worldY_before = (mouseScreenPos.Y - _panOffset.Y) / _zoomFactor; + + // 이전 줌 팩터 저장 float oldZoom = _zoomFactor; - // 줌 팩터 계산 (휠 델타 기반) - 더 부드러운 줌 + // 줌 팩터 계산 (휠 델타 기반) if (e.Delta > 0) - _zoomFactor = Math.Min(_zoomFactor * 1.15f, 5.0f); // 확대 (더 부드러움) + _zoomFactor = Math.Min(_zoomFactor * 1.15f, 5.0f); // 확대 else - _zoomFactor = Math.Max(_zoomFactor / 1.15f, 0.1f); // 축소 (더 부드러움) + _zoomFactor = Math.Max(_zoomFactor / 1.15f, 0.1f); // 축소 - // 줌 후 마우스 위치의 월드 좌표 - var mouseWorldAfter = ScreenToWorld(e.Location); - - // 마우스 위치가 같은 월드 좌표를 가리키도록 팬 오프셋 조정 - _panOffset.X += (int)((mouseWorldBefore.X - mouseWorldAfter.X) * _zoomFactor); - _panOffset.Y += (int)((mouseWorldBefore.Y - mouseWorldAfter.Y) * _zoomFactor); + // 줌 후에도 마우스가 같은 월드 좌표를 가리키도록 팬 오프셋 조정 + _panOffset.X = (int)(mouseScreenPos.X - worldX_before * _zoomFactor); + _panOffset.Y = (int)(mouseScreenPos.Y - worldY_before * _zoomFactor); Invalidate(); }