HTML5 Canvas は、グラフィックの変換、回転、スケーリングのための API を提供します。
平行移動(translate)
平行移動座標translate(x,y)は、(0,0)座標を(x,y)に平行移動し、元の(0,0)座標を変換することを意味します。は (-x, -y) になります
図は次のとおりです。
任意の元の座標点 p(ox, oy) の変換後の座標点は p(ox-x, oy -y)、ここで点 (x, y) は移動
点の座標translate(x, y) です。
コードのデモ:
// 変換は開始点を中心に移動し、左上隅に戻します。
function renderText(width, height, context) {
context.translate(width/ 2, height / 2); are (0, 0)
context.font="18px Arial";
context.fillStyle="blue";
context.fillText("ゲームを終了するには を押してください",5, 50);
context.translate(-width/2, -height/2); // 変換により (0,0) 座標が左上隅に復元されます
context.fillText("トップに戻りました",5,50) ;
}
Scale(Scale) Scale(a, b) は、XY 軸に沿ってオブジェクトを a にスケールすることを意味しますそれぞれ *x、b*y サイズ。効果は図に示すとおりです。
// 四角形を移動します。
functiondrawPath(context) {
context.translate(200,200);// スケールします。元の形状の 2 倍のサイズ
context.strokingStyle= "green";
context.moveTo(0,40);
context.lineTo(80,40); 🎜>context.lineTo(40, 80);
context.closePath();
}
回転 (回転)
回転角度rotate (Math.PI/8)
回転前の座標 p(x, y) と回転後の対応する座標 P(rx, ry) は
Rx = x * cos(-- angle) - y * sin(-angle);
Ry = y * cos(-angle) x * sin(-angle);
90 度の回転は次のように簡略化できます。
Rx = y;
Ry = -x;
キャンバスのデフォルトの回転方向は時計回りです。デモ コードは次のとおりです:
コードをコピー function renderRotateText(context) {
context.font="24px Arial";
context.fillStyle="red";
context.fillText("ここにいます!!!",5,50 );
/ / -90 度回転
// context.rotate(-Math.PI/2);
// context.fillStyle="blue"; "ここにいるよ!!", -400,30);
// 90 度回転
context.fillStyle="blue"; 🎜>context.fillText( "ここにいます!!!",350,-420);
console.log(Math.sin(Math.PI/2));
// 90 度回転し、 10 行を描画します
context.fillStyle="green";
for(var i=0; ivar x = (i 1)*20; (i 1)*60 ;
var newX = y;
context.fillRect(newX,newY, 200, 6); >
通常のアプローチは、回転と移動を一緒に使用することです。最初に座標 (0,0) を中心位置に移動します
translate (width/2, height/2) それから、rotate(Math) を使用します。 .PI/2) を使用して回転を完了します
コード例は次のとおりです:
コードをコピー
コード
function saveAndRestoreContext(context ) {
context.save();
context.rotate(Math.PI/2) ); すべての JavaScript コード:
コードをコピーします
コードは次のとおりです:
var tempContext = null; // グローバル変数 2D コンテキスト
window.onload = function() {
var Canvas = document.getElementById("target");
canvas.width = 450;
canvas.height = 450;
if (!canvas.getContext) {
console.log("キャンバスはサポートされていません。HTML5 互換のブラウザをインストールしてください。");
戻る;
}
// キャンバスの 2D コンテキストを取得し、画像を描画します
tempContext = Canvas.getContext("2d");
// renderText(canvas.width, Canvas.height, tempContext);
saveAndRestoreContext(tempContext);
//drawPath(tempContext);
}
// 翻訳は開始点を中心に移動し、左上隅に戻します
function renderText(width, height, context) {
context.translate(width / 2, height / 2) );
context.font="18px Arial";
context.fillStyle="blue";
context.fillText("ゲームを終了するには を押してください",5,50);
context.translate(-width / 2, -height / 2);
context.fillText("トップに戻る",5,50);
}
// 四角形を移動します。
関数drawPath(context) {
context.translate(200, 200);
context.scale(2,2); // 元の形状の 2 倍のサイズに拡大縮小します
context.bloodStyle = "green";
context.beginPath();
context.moveTo(0, 40);
context.lineTo(80, 40);
context.lineTo(40, 80);
context.closePath();
context.ストローク();
}
// 新しい point.x = x * cos(-angle) - y * sin(-angle),
// 新しい point.y = y * cos(-angle) x * sin (-angle)
function renderRotateText(context) {
context.font="24px Arial";
context.fillStyle="red";
context.fillText("ここにいるよ!!!",5,50);
// -90 度回転
// context.rotate(-Math.PI/2);
// context.fillStyle="blue";
// context.fillText("ここにいるよ!!!", -400,30);
// 90 度回転 e
context.rotate(Math.PI/2);
context.fillStyle="blue";
context.fillText("ここにいるよ!!!", 350,-420);
console.log(Math.sin(Math.PI/2));
// 90度回転して10本の線を描きます
context.fillStyle="green";
for(var i=0; ivar x = (i 1)*20;
var y = (i 1)*60;
var newX = y;
var newY = -x;
context.fillRect(newX, newY, 200, 6);
}
}
関数 saveAndRestoreContext(context) {
context.save();
context.translate(200,200);
context.rotate(Math.PI/2);
context.fillStyle="black";
context.fillText("2D コンテキストの回転と移動", 10, 10);
context.restore();
context.fillText("2D コンテキストの回転と移動", 10, 10);
}