Ваша реализация зума по курсу мыши использует аффинные преобразования, и в целом она выглядит почти правильно. Однако, поведение зума в углах экрана может быть проблематичным из-за того, как осуществляется трансформация.
Когда вы используете `translateSelf` для центрирования точки зума, стоит учитывать, что вы изменяете систему координат, и, как следствие, это может привести к нежелательному смещению объекта при больших масштабах или при нахождении курсора в пределах блока.
Вот улучшенная версия вашего кода, которая должна исправить проблемы с масштабированием:
```javascript
const screen = document.getElementById("screen");
const world = document.getElementById("world");
const m = new DOMMatrix([1, 0, 0, 1, 0, 0]);
const p = new DOMPoint();
const OnZoom = function(e) {
e.preventDefault(); // предотвратить стандартное поведение прокрутки
const zoom = 1 + (0.02 * Math.sign(e.deltaY));
const rect = world.getBoundingClientRect();
// Изменяем координаты курсора относительно блока (world)
p.x = e.clientX - rect.left;
p.y = e.clientY - rect.top;
// Модернизируем матрицу трансформаций
const scaleX = m.a * zoom;
const scaleY = m.d * zoom;
m.translateSelf(p.x, p.y); // Перемещаем к курсору
m.scaleSelf(zoom, zoom); // Масштабируем
m.translateSelf(-p.x, -p.y); // Возвращаем обратно
world.style.transform = m.toString();
};
screen.addEventListener("wheel", OnZoom); // Используем 'wheel' вместо 'mousewheel'
```
### Вот некоторые пояснения по улучшенной версии:
1. **Использование `e.preventDefault()`**: Это предотвратит прокрутку страницы при использовании зума.
2. **Использование `wheel` события**: Событие `wheel` является более современным и предпочтительным для работы с прокруткой.
3. **Корректное изменение позиции**: Мы перемещаем центр зума к координатам курсора, а затем применяем масштабирование. Этот порядок действий позволяет уменьшить сдвиг объекта относительно курсора, даже если он находится в углу.
4. **Изменение `m.a` и `m.d` для расчета при масштабировании**: Это изменение обеспечивает более адекватное масштабирование на основе текущих значений.
Попробуйте использовать эту версию и проверьте, будет ли она работать лучше при зуме в различных частях изображения.