溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HTML5 Canvas平移,放縮,旋轉(zhuǎn)演示

發(fā)布時(shí)間:2020-07-20 04:58:34 來源:網(wǎng)絡(luò) 閱讀:471 作者:gloomyfish 欄目:移動(dòng)開發(fā)

HTML5 Canvas中提供了實(shí)現(xiàn)圖形平移,旋轉(zhuǎn),放縮的API。

平移(translate)

平移坐標(biāo)translate(x, y)意思是把(0,0)坐標(biāo)平移到(x, y),原來的(0,0)坐標(biāo)則變成(-x, -y)

圖示如下:

HTML5 Canvas平移,放縮,旋轉(zhuǎn)演示

任何原來的坐標(biāo)點(diǎn)p(ox, oy)在translate之后的坐標(biāo)點(diǎn)為p(ox-x, oy-y),其中點(diǎn)(x, y)為平移

點(diǎn)坐標(biāo)translate(x, y)。

代碼演示:

// translate is move the startpoint to centera and back to top left corner

function renderText(width, height, context) {

    context.translate(width/ 2, height / 2); // 中心點(diǎn)坐標(biāo)為(0, 0)

    context.font="18px Arial";

    context.fillStyle="blue";

    context.fillText("Please Press <Esc> to Exit Game",5,50);

    context.translate(-width/2, -height/2); // 平移恢復(fù)(0,0)坐標(biāo)為左上角

    context.fillText("I'm Back to Top",5,50);

}

 

放縮(Scale)

Scale(a, b)意思是將對象沿著XY軸分別放縮至a*x,  b*y大小。效果如圖示:

HTML5 Canvas平移,放縮,旋轉(zhuǎn)演示

// translation the rectangle.

function drawPath(context) {

    context.translate(200,200);

    context.scale(2,2);// Scale twice size of original shape

    context.strokeStyle= "green";

    context.beginPath();

    context.moveTo(0,40);

    context.lineTo(80,40);

    context.lineTo(40,80);

    context.closePath();

    context.stroke();

}

旋轉(zhuǎn)(rotate)

旋轉(zhuǎn)角度rotate(Math.PI/8)

HTML5 Canvas平移,放縮,旋轉(zhuǎn)演示

旋轉(zhuǎn)前的坐標(biāo)p(x, y)在對應(yīng)的旋轉(zhuǎn)后的坐標(biāo)P(rx, ry)為

Rx = x * cos(-angle) - y * sin(-angle);

Ry = y * cos(-angle) + x * sin(-angle);

旋轉(zhuǎn)90度可以簡化為:

Rx = y;

Ry = -x;

Canvas中旋轉(zhuǎn)默認(rèn)的方向?yàn)轫槙r(shí)針方向。演示代碼如下:

// new point.x = x * cos(-angle) -y * sin(-angle),

// new point.y = y * cos(-angle) +x * sin(-angle)

function renderRotateText(context) {

    context.font="24px Arial";

    context.fillStyle="red";

    context.fillText("i'm here!!!",5,50);

   

    // rotate -90 degreee

    // context.rotate(-Math.PI/2);

    // context.fillStyle="blue";

    // context.fillText("i'm here!!!", -400,30);

   

    // rotate 90 degreee

    context.rotate(Math.PI/2);

    context.fillStyle="blue";

    context.fillText("i'm here!!!",350,-420);

   

    console.log(Math.sin(Math.PI/2));

   

    // rotae 90 degree and draw 10 lines

    context.fillStyle="green";

    for(var i=0; i<4; i++) {

        var x = (i+1)*20;

        var y = (i+1)*60;

        var newX = y;

        var newY = -x; 

        context.fillRect(newX,newY, 200, 6);

    }

}

通常做法是旋轉(zhuǎn)與平移一起使用,先將坐標(biāo)(0,0)平移到中心位置

translate (width/2, height/2)然后再使用rotate(Math.PI/2)完成旋轉(zhuǎn)

代碼示例如下:

function saveAndRestoreContext(context) {

    context.save();

    context.translate(200,200);

    context.rotate(Math.PI/2);

    context.fillStyle="black";

    context.fillText("2D Context Rotate And Translate", 10, 10);

    context.restore();

    context.fillText("2D Context Rotate And Translate", 10, 10);

}

 全部JavaScript代碼:

		var tempContext = null; // global variable 2d context 		window.onload = function() { 			var canvas = document.getElementById("target"); 			canvas.width = 450; 			canvas.height = 450; 			 			if (!canvas.getContext) { 			    console.log("Canvas not supported. Please install a HTML5 compatible browser."); 			    return; 			} 			 			// get 2D context of canvas and draw image 			tempContext = canvas.getContext("2d"); 			// renderText(canvas.width, canvas.height, tempContext); 			saveAndRestoreContext(tempContext); 			// drawPath(tempContext); 		} 		 		// translate is move the start point to centera and back to top left corner 		function renderText(width, height, context) { 			context.translate(width / 2, height / 2); 			context.font="18px Arial"; 			context.fillStyle="blue"; 			context.fillText("Please Press <Esc> to Exit Game",5,50); 			context.translate(-width / 2, -height / 2); 			context.fillText("I'm Back to Top",5,50); 		} 		 		// translation the rectangle. 		function drawPath(context) { 			context.translate(200, 200); 			context.scale(2,2); // Scale twice size of original shape 			context.strokeStyle = "green"; 			context.beginPath(); 			context.moveTo(0, 40); 			context.lineTo(80, 40); 			context.lineTo(40, 80); 			context.closePath(); 			context.stroke(); 		} 		 		// new point.x = x * cos(-angle) - y * sin(-angle),  		// new point.y = y * cos(-angle) + x * sin(-angle) 		function renderRotateText(context) { 			context.font="24px Arial"; 			context.fillStyle="red"; 			context.fillText("i'm here!!!",5,50); 			 			// rotate -90 degreee 			// context.rotate(-Math.PI/2); 			// context.fillStyle="blue"; 			// context.fillText("i'm here!!!", -400,30); 			 			// rotate 90 degreee 			context.rotate(Math.PI/2); 			context.fillStyle="blue"; 			context.fillText("i'm here!!!", 350,-420); 			 			console.log(Math.sin(Math.PI/2)); 			 			// rotae 90 degree and draw 10 lines 			context.fillStyle="green"; 			for(var i=0; i<4; i++) { 				var x = (i+1)*20; 				var y = (i+1)*60; 				var newX = y; 				var newY = -x;	 				context.fillRect(newX, newY, 200, 6); 			} 		} 		 		function saveAndRestoreContext(context) { 			context.save(); 			context.translate(200,200); 			context.rotate(Math.PI/2); 			context.fillStyle="black"; 			context.fillText("2D Context Rotate And Translate", 10, 10); 			context.restore(); 			context.fillText("2D Context Rotate And Translate", 10, 10); 		}

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

vas
AI