Не являюсь сильным специалистом в svg, но основной подход такой:
смещаем все так, чтобы мышка оказалась в начале координат,
затем масштабируем,
затем перемещаем обратно.
Для этого нужно рассчитать матрицу преобразования, которая будет представлять из себя матричное произведение трех матриц: матрица переноса на (-Xмыши,-Yмыши), матрица масштабирования на scale, матрица переноса на (Xмыши, Yмыши).
Подобное реализовывал на c#:
protected override void OnMouseWheel(MouseEventArgs e)
{
if (isAllowTransfom)
{
var transform_local = transform.Clone();
var matrixOrder = MatrixOrder.Append;
var K = e.Delta > 0 ? SCALE_MUL : 1 / SCALE_MUL;
transform_local.Multiply(new Matrix(1, 0, 0, 1, -e.Location.X, -e.Location.Y), matrixOrder);
transform_local.Multiply(new Matrix(K, 0, 0, K, 0, 0), matrixOrder);
transform_local.Multiply(new Matrix(1, 0, 0, 1, e.Location.X, e.Location.Y), matrixOrder);
transform = transform_local;
OnViewWindowChanged(transform);
}
base.OnMouseWheel(GetWorldMouseEventArgs(e));
}
То есть у меня есть матрица transform, в которой содержится с каким смещением и каким масштабом отрисована картинка. При вращении колесика мыши мы эту матрицу модифицируем и все перерисовываем.
P.S. Очень важен порядок перемножения матриц.