Я борюсь с реализацией масштабирования холста (на колесе мыши), используя Vanilla Javascript, но безуспешно.
Масштабирование должно применяться к координатам мыши, когда колесо прокручивается.Это было задано здесь ранее, но моя ситуация совершенно иная, учитывая, что Я не могу использовать canvasContext.translate
, а значения offsetX
и offsetY
должны храниться в абсолютном представлении (не масштабироваться)
Я был бы очень признателен за некоторый свет.
В следующем фрагменте я приведу свою текущую и дисфункциональную реализацию.Вы увидите, как это работает, когда вы увеличиваете и уменьшаете масштаб, сохраняя те же координаты увеличения, но как только вы перемещаете мышь к новым координатам (когда масштаб! = 1) и продолжаете масштабирование, новые смещения становятся неправильными.
// initiate variabks : canvas ref, offsets, scale...
const context = document.getElementById('c').getContext('2d');
let scale = 1;
let scaleFactor = 0.2;
let offsetX=0;
let offsetY=0;
// Handle mousenwheel zoom
context.canvas.onwheel= function(e){
e.preventDefault();
// calculate scale direction 6 new value
let direction = e.deltaY > 0 ? 1 : -1;
scale += scaleFactor * direction;
// calculatethe new offsets (unscaled values)
offsetX = e.offsetX - (e.offsetX / scale);
offsetY = e.offsetY - (e.offsetY / scale);
// apply new scale
context.setTransform(1, 0, 0, 1, 0, 0);
context.scale(scale, scale);
}
// clear canvas and draw two boxes
// NO CHANGES CAN BE DONE IN THIS FUNCTION
function render(){
context.beginPath();
context.clearRect(0,0,context.canvas.width/scale,context.canvas.height/scale);
context.rect(100-offsetX,50-offsetY,50,50);
context.rect(200-offsetX,50-offsetY,50,50);
context.stroke();
document.getElementById("info").innerHTML=`
Scale : ${scale} <br>
Offets : ${ Math.round(offsetX) + ' , ' + Math.round(offsetY)} <br>
`;
requestAnimationFrame( render );
}
render()
<canvas id="c" width="350" height="150" style="border: 1px solid red;"></canvas>
<div id="info"></div>