在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ Ch13 平移變換
Ch22 最后的API
Ch14 旋轉變換
Ch19 全局陰影與圖像合成
Ch12 三次貝塞爾曲線
Ch4 多線條組成圖形
Ch7 填充顏色
Ch6 線條的屬性
Ch20 裁剪和繪制圖像
CANVAS——Draw on the Web
Ch18 文本對齊與度量
Ch8 填充樣式
Ch15 縮放變換
Ch9 繪制標準圓弧
Ch2 開始前的準備
Ch16 矩陣變換
Ch3 從線段開始
Ch10 使用切點繪制圓弧
Ch21 非零環(huán)繞原則
Ch11 二次貝塞爾曲線
Ch5 繪制矩形
Ch17 文本顯示與渲染
Ch1 HTML5簡介
Ch13 平移變換

Ch13 平移變換

圖形變換

從今天開始,我們就開始談一談圖形變換。圖形變換是指用數(shù)學方法調整所繪形狀的物理屬性,其實質是坐標變形。所有的變換都依賴于后臺的數(shù)學矩陣運算,所以我們只要使用變換的功能即可,無需去理解這些運算。談到圖形變換,不得不得說的三個基本變換方法就是:

  1. 平移變換:translate(x,y)
  2. 旋轉變換:rotate(deg)
  3. 縮放變換:scale(sx,sy)

其實坐標變形的本質是變換矩陣,所以在最后我們會談一談一個萬能的變換方法——矩陣變換transform()。那么,我們按部就班,這一節(jié)我們來談一談平移變換。

平移變換translate()

平移變換,故名思議,就是一般的圖形位移。比如這里我想將位于(100,100)的矩形平移至(200,200)點。那么我只要在繪制矩形之前加上context.translate(100,100)即可。

這里的translate()只傳入兩個參數(shù),其實就是新畫布坐標系原點的坐標。下面結合代碼來看看效果。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>平移變換</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧?。?    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        context.fillStyle = "#00AAAA";
        context.fillRect(100,100,200,100);

        context.fillStyle = "red";
        context.translate(100,100);
        context.fillRect(100,100,200,100);

    };
</script>
</body>
</html>

演示 13-1

運行結果:

平移變換

這里的藍色矩形,是矩形原來的位置,然后調用translate()方法,將矩形位移至(200,200),即紅色矩形的位置。我們來用一張圖看看,它是怎么做到平移變換的。

解析平移變換

沒錯,其實這里的平移變換實質就是在平移坐標系,而對translate()傳入的參數(shù),實質就是新坐標系相對于舊坐標系的原點。這使得我們依舊是在(100,100)繪制的紅色矩形,在平移坐標系之后,變到了(200,200)處。

注意使用狀態(tài)保存

其實這里有一個坑,我們如果想把矩形平移至(300,300)怎么辦呢?或許我們會想,直接調用context.translate(200,200)就可以了。好,我們看看效果。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>平移變換</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧?。?    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        context.fillStyle = "#00AAAA";
        context.fillRect(100,100,200,100);

        context.fillStyle = "red";
        context.translate(100,100);
        context.fillRect(100,100,200,100);

        context.fillStyle = "green";
        context.translate(200,200);
        context.fillRect(100,100,200,100);

    };
</script>
</body>
</html>

演示 13-2

運行結果:

圖形變換的坑

這里的綠色矩形并沒有如我們所愿在(300,300)位置處,而是跑到了(400,400)這里。為什么呢?想必大家已經知道了答案——Canvas是基于狀態(tài)的繪制。在我們第一次平移之后,坐標系已經在(100,100)處了,所以如果繼續(xù)平移,這個再基于新坐標系繼續(xù)平移坐標系。那么要怎么去解決呢?很簡單,有兩個方法。

第一,在每次使用完變換之后,記得將坐標系平移回原點,即調用translate(-x,-y)。

第二,在每次平移之前使用context.save(),在每次繪制之后,使用context.restore()。

切記,千萬不要再想著我繼續(xù)緊接著第一次平移之后再平移translate(100,100)不就行了,這樣你自己的坐標系就會亂套,根本找不到自己的坐標系原點在哪,在多次變換或者封裝函數(shù)之后,會坑死你。所以一定要以最初狀態(tài)為最根本的參照物,這是原則性問題。這里我建議使用第二種方法,而且在涉及所有圖形變換的時候,都要這么處理,不僅僅是平移變換。

具體使用如下。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>平移變換</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧?。?    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        context.fillStyle = "#00AAAA";
        context.fillRect(100,100,200,100);

        context.save();
        context.fillStyle = "red";
        context.translate(100,100);
        context.fillRect(100,100,200,100);
        context.restore();

        context.save();
        context.fillStyle = "green";
        context.translate(200,200);
        context.fillRect(100,100,200,100);
        context.restore();

    };
</script>
</body>
</html>

演示 13-3

運行結果:

狀態(tài)保存結合圖形變換

因此,在使用圖形變換的時候,要記得結合使用狀態(tài)保存。

好了,這一節(jié)的內容很少,我們繼續(xù)前進。