diff --git a/apps/web/src/lib/graph/canvas/camera-controller.test.ts b/apps/web/src/lib/graph/canvas/camera-controller.test.ts index 0e1e316..9a8d065 100644 --- a/apps/web/src/lib/graph/canvas/camera-controller.test.ts +++ b/apps/web/src/lib/graph/canvas/camera-controller.test.ts @@ -65,6 +65,9 @@ describe('CameraController', () => { expect(controller.viewport.x_min).toBeGreaterThan(viewport.x_min); expect(controller.viewport.x_max).toBeLessThan(viewport.x_max); + expect(controller.viewport.x_max - controller.viewport.x_min).toBeCloseTo( + 10 * Math.exp(-0.18) + ); expect(onChange).toHaveBeenCalledOnce(); expect(onCommit).not.toHaveBeenCalled(); expect(onInteractionChange).not.toHaveBeenCalled(); diff --git a/apps/web/src/lib/graph/canvas/camera-controller.ts b/apps/web/src/lib/graph/canvas/camera-controller.ts index f05d8bf..604d712 100644 --- a/apps/web/src/lib/graph/canvas/camera-controller.ts +++ b/apps/web/src/lib/graph/canvas/camera-controller.ts @@ -4,6 +4,9 @@ import { panViewport, pinchViewport, zoomViewport } from '$lib/graph/viewport'; import { sameViewport } from './geometry'; +const MAX_WHEEL_DELTA = 200; +const WHEEL_ZOOM_SENSITIVITY = 0.0009; + interface CameraControllerCallbacks { onChange: (viewport: Viewport) => void; onCommit: (viewport: Viewport) => void; @@ -116,7 +119,10 @@ export class CameraController { } wheel(point: PixelPoint, deltaY: number): void { - const factor = Math.exp(Math.max(-200, Math.min(200, deltaY)) * 0.0015); + const factor = Math.exp( + Math.max(-MAX_WHEEL_DELTA, Math.min(MAX_WHEEL_DELTA, deltaY)) * + WHEEL_ZOOM_SENSITIVITY + ); this.#change( zoomViewport(this.#presentationViewport, point.x, point.y, factor), false