zoom.ts 962 B

123456789101112131415161718192021222324252627282930
  1. import { NormalizedZoomValue, PointerCoords, Zoom } from "../types";
  2. export const getNewZoom = (
  3. newZoomValue: NormalizedZoomValue,
  4. prevZoom: Zoom,
  5. canvasOffset: { left: number; top: number },
  6. zoomOnViewportPoint: PointerCoords = { x: 0, y: 0 },
  7. ): Zoom => {
  8. return {
  9. value: newZoomValue,
  10. translation: {
  11. x:
  12. zoomOnViewportPoint.x -
  13. canvasOffset.left -
  14. (zoomOnViewportPoint.x - canvasOffset.left - prevZoom.translation.x) *
  15. (newZoomValue / prevZoom.value),
  16. y:
  17. zoomOnViewportPoint.y -
  18. canvasOffset.top -
  19. (zoomOnViewportPoint.y - canvasOffset.top - prevZoom.translation.y) *
  20. (newZoomValue / prevZoom.value),
  21. },
  22. };
  23. };
  24. export const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {
  25. const normalizedZoom = parseFloat(zoom.toFixed(2));
  26. const clampedZoom = Math.max(0.1, Math.min(normalizedZoom, 10));
  27. return clampedZoom as NormalizedZoomValue;
  28. };