キャンバスに回転した形状のサイズを変更しようとしています。私の問題は、レンダリング関数を呼び出すと、シェイプの角度に応じてシェイプが「ドリフト」してしまうことです。どうすればこれを防ぐことができますか?形状の幅を変更すると、回転した形状がy軸上を移動しています
私はキャンバスをクリックすると形状が大きくなり何らかの理由で上にドリフトするという問題を示す簡単なフィドルを作った。
はここでフィドルだ:「本物」のコードでhttps://jsfiddle.net/x5gxo1p7/
<style>
canvas {
position: absolute;
box-sizing: border-box;
border: 1px solid red;
}
</style>
<body>
<div>
<canvas id="canvas"></canvas>
</div>
</body>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
canvas.width = 300;
canvas.height= 150;
var ctx = canvas.getContext('2d');
var counter = 0;
var shape = {
top: 120,
left: 120,
width: 120,
height: 60,
rotation: Math.PI/180 * 15
};
function draw() {
var h2 = shape.height/2;
var w2 = shape.width/2;
var x = w2;
var y = h2;
ctx.save();
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.translate(75,37.5)
ctx.translate(x, y);
ctx.rotate(Math.PI/180 * 15);
ctx.translate(-x, -y);
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, shape.width, shape.height);
ctx.restore();
}
canvas.addEventListener('click', function() {
shape.width = shape.width + 15;
window.requestAnimationFrame(draw.bind(this));
});
window.requestAnimationFrame(draw.bind(this));
</script>
形状がサイズ変更ハンドルをクリックするとリサイズと移動させたが、私は、この例では、十分に問題を示し思います。
EDIT:問題を明確にする更新フィドル:
https://jsfiddle.net/x5gxo1p7/9/
それが原因ctx.translate(x、y)は 'にドリフトします;'と 'ctx.translate(-x、-y);':
溶液で新しいフィドル。コメントアウトしてみてください! - https://jsfiddle.net/Pugazh/x5gxo1p7/3/ – Pugazh
その中心を中心にして形状を回転させるには、平行移動が必要です。 – Jomppe