私はapiから受け取ったデータでCanvasを構築していますが、これはすべて問題ありません。私はその次のコード `canvas.addEventListener( 'ホイール'、(イベントとの事実にstuckedだと、とにかく、数日である:MouseWheelEventが)=> { event.preventDefault();スケーリング/パンニング後のキャンバス座標
let coords = Positioning.transformedPoint(
event.pageX - canvas.offsetLeft,
event.pageY - canvas.offsetTop
);
canvasMethods.clear();
canvasMethods.translate(coords.x, coords.y);
if (event.wheelDeltaY > 0) {
canvasMethods.scale(ZoomDirection.ZOOM_IN);
} else if (event.wheelDeltaY < 0) {
canvasMethods.scale(ZoomDirection.ZOOM_OUT);
}
canvasMethods.translate(-coords.x, -coords.y);
this._renderFn();
}, false);
canvas.addEventListener('mousedown', (event: MouseEvent) => {
event.preventDefault();
this._dragging = true;
this._dragStart = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
}, false);
canvas.addEventListener('dblclick', (event: MouseEvent) => {
let coords = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
this._clickFn(coords);
});
canvas.addEventListener('mousemove', (event: MouseEvent) => {
if (this._dragging) {
event.preventDefault();
this._dragEnd = Positioning.transformedPoint(
event.pageX - canvas.offsetLeft,
event.pageY - canvas.offsetTop
);
let coords = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
canvasMethods.translate(coords.x - this._dragStart.x, coords.y - this._dragStart.y);
canvasMethods.clear();
this._renderFn();
this._dragStart = this._dragEnd;
}
}, false);
canvas.addEventListener('mouseup', (event: MouseEvent) => {
event.preventDefault();
this._dragging = false;
this._dragStart = null;
this._dragEnd = null;
})
}`
私はノーマルスケールでは右の座標を取得しますが、スケールするとすぐに増分エラーが発生します(基本的に実際のポイントとマウスカーソルの距離はますます大きくなります)。 Matrix私は以下の方法でラッパーとしてSVGメソッドを使用します。 `export class Positioning { static svg = document.createElementNS( 'http://www.w3.org/2000/svg'、 'svg'); private static xform = Positioning.svg.createSVGMatrix();
static transformedPoint(x: number, y: number): SVGPoint {
let coords = Positioning.svg.createSVGPoint();
coords.x = x;
coords.y = y;
return coords.matrixTransform(Positioning.xform.inverse());
}
} `
私は、これは何とかcalingに関係しているが、私は本当にスケーリングのアカウントを取得し、比率を得るために、適切な操作を行う方法を見つけ出すことはできませんことを知っています。私はまた、この回答を確認しましたZoom Canvas to Mouse Cursorかなり正確ですが、実際に彼は私が再調整することができない何らかの方法でそれのアカウントを取得します。他の誰かが同じ問題に直面しましたか?
あなたは正しいアイデアを持っています:すべての変換を[変換行列](http://simonsarris.com/blog/471-a-transformation-class-for-canvas-to-keep-track-変換マトリクスを変換した後、変換された座標と変換されていない座標を変換するためにマトリックスを使用します。 – markE
ええ、私はかなり近くですが、私は困惑の最後の部分を理解できません、あなたは何を意味する変換されたとuntransformedの間で変換する行列を反転することによって?あなたが私のサービスがすでに行列を逆転しているのを見ることができるからです。 –