こんばんは。きわさです。
またまたcanvas関連です。
今回は画像を回転させてみます。
function test1() {
var img = document.getElementById("image");
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.rotate(5 * Math.PI / 180);
context.drawImage(img, 0, 0, canvas.width, canvas.height);
return;
}
context.rotate(5 * Math.PI / 180) で指定した分だけ回転させます。
ただ、画像を回転させるわけではないので、回転後に描画処理が必要です。
test() を呼び出すと5度右回転した画像が表示されます。
もう一度押すとさらに5度、、とこれだと残像が残ってしまいます。
しかも回転する位置がイメージと違うかもしれません。
まず残像を消します。
var angle = 0;
function test2() {
var img = document.getElementById("image");
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.clearRect(0, 0, canvas.width, canvas.height);
angle += 5;
context.rotate(angle * Math.PI / 180);
context.drawImage(img, 0, 0, canvas.width, canvas.height);
context.rotate(-angle * Math.PI / 180);
return;
}
回転して描画する前に、context.clearRect(0, 0, canvas.width, canvas.height) でcanvasをクリアしています。
これだと2度目以降は回転した領域をクリアしてしまうので、描画後に context.rotate(-angle * Math.PI / 180) でもとに戻しています。
次は回転の位置を変えます。
中心を軸にして回転するようにします。
var angle = 0;
function test3() {
var img = document.getElementById("image");
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.clearRect(0, 0, canvas.width, canvas.height);
angle += 5;
context.translate(canvas.width/2, canvas.height/2);
context.rotate(angle * Math.PI / 180);
context.drawImage(img, -canvas.width/2, -canvas.height/2, canvas.width, canvas.height);
context.rotate(-angle * Math.PI / 180);
context.translate(-canvas.width/2, -canvas.height/2);
return;
}
回転の前に context.translate(canvas.width/2, canvas.height/2) を追加しました。
これでcanvasの長さの半分だけ移動してから回転させることで、中心を軸に回転しています。
そして、描画はcanvas内で行いたいので、移動分だけ描画位置をずらしています。
描画後には translate の移動も元に戻しています。
サンプルを置いてみます。
