キャンバスを使用する HTML5 のソフトウェアの開発に取り組んでいます。ズームして、ユーザーがマウスのクリックでキャンバスに落書きできるようにする必要があるキャンバスが 1 つあります。これまでのところ、私が見つけたいくつかの例の助けを借りて、ズームを機能させることができました。問題は、ズームした後、描画ツールのマウスの位置がおかしくなることです。ズームする前は、問題なく描画できます。ズームのコードは次のとおりです。
//Zoom
mainCanvas.onmousewheel = function(event) {
var mousex = event.clientX - mainCanvas.offsetLeft;
var mousey = event.clientY - mainCanvas.offsetTop;
var wheel = event.wheelDelta / 120;
//n or -n
var zoom = 0;
if(wheel < 0) {
zoom = 1 / 2;
if(currentzoom == 1)
return;
} else {
mousex = event.clientX - mainCanvas.offsetLeft;
mousey = event.clientY - mainCanvas.offsetTop;
zoom = 2;
if(currentzoom == 32)
return;
}
currentzoom *= zoom;
mainContext.translate(originx, originy);
mainContext.scale(zoom, zoom);
mainContext.translate(-(mousex / scale + originx - mousex / (scale * zoom ) ), -(mousey / scale + originy - mousey / (scale * zoom ) ));
originx = (mousex / scale + originx - mousex / (scale * zoom ) );
originy = (mousey / scale + originy - mousey / (scale * zoom ) );
scale *= zoom;
draw(mainContext, gridArray);
}
私が言ったように、ズームは実際の問題ではなく、問題の根源にすぎません。描画ツールのマウス位置を決定するコードは次のとおりです。
//this function determines the mouse position relative to the canvas element
function ev_canvas(ev) {
if(ev.layerX || ev.layerX == 0) {//Firefox, IE
ev._x = ev.layerX;
ev._y = ev.layerY;
} else if(ev.offsetX || ev.offsetX == 0) {//Opera
ev._x = ev.offsetX;
ev._y = ev.offsetY;
}
var func = tool[ev.type];
if(func) {
func(ev);
}
}
問題はコードの後者のブロックにあると確信していますが、それを修正するかどうかはわかりません。どんな助けでも大歓迎です。