Мне показалось, что я уже отправил ответ на этот вопрос, но не смог его найти.
Вот обсуждение о решении, реализованном в http://sketch.paperjs.org (оинструмент масштабирования).
А вот скрипка , демонстрирующая мою реализацию стабильного панорамирования / масштабирования.
// This controls the zoom intensity.
var ZOOM_FACTOR = 1.5;
// Draw a circle.
new Path.Circle({
center: view.center,
radius: 50,
fillColor: 'orange'
});
// On mouse drag...
function onMouseDrag(event) {
// ...update view center.
paper.view.center = event.downPoint.subtract(event.point).add(paper.view.center);
};
// On mouse scroll...
$('canvas').mousewheel(function(event) {
// Store previous view state.
var oldZoom = view.zoom;
var oldCenter = view.center;
// Get mouse position.
// It needs to be converted into project coordinates system.
var mousePosition = view.viewToProject(new Point(event.offsetX, event.offsetY));
// Update view zoom.
var newZoom = event.deltaY > 0
? oldZoom * ZOOM_FACTOR
: oldZoom / ZOOM_FACTOR;
view.zoom = newZoom;
// Update view position.
view.center += (mousePosition - oldCenter) * (1 - (oldZoom / newZoom));
});