主頁(yè) > 知識(shí)庫(kù) > 深入解析HTML5 Canvas控制圖形矩陣變換的方法

深入解析HTML5 Canvas控制圖形矩陣變換的方法

熱門(mén)標(biāo)簽:聯(lián)通400電話(huà)申請(qǐng) 高德地圖標(biāo)注賓館位置 電視購(gòu)物電銷(xiāo)外呼系統(tǒng) 杭州營(yíng)銷(xiāo)電銷(xiāo)機(jī)器人供應(yīng)商 西寧智能外呼系統(tǒng)加盟 電話(huà)機(jī)器人如何 飛亞外呼系統(tǒng) 貸款電銷(xiāo)人工和機(jī)器人哪個(gè)好 百應(yīng)電銷(xiāo)機(jī)器人產(chǎn)業(yè)

在介紹矩陣變換transform()前,我們來(lái)說(shuō)一說(shuō)什么是變換矩陣。

以上是Canvas中transform()方法所對(duì)應(yīng)的變換矩陣。而此方法正是傳入圖中所示的六個(gè)參數(shù),具體為context.transform(a,b,c,d,e,f)。

各參數(shù)意義對(duì)應(yīng)如下表:

參數(shù) 意義
a 水平縮放(1)
b 水平傾斜(0)
c 垂直傾斜(0)
d 垂直縮放(1)
e 水平位移(0)
f 垂直位移(0)

當(dāng)我們把對(duì)應(yīng)的0或1代入進(jìn)矩陣,可以發(fā)現(xiàn)這是一個(gè)單位矩陣(水平和垂直縮放默認(rèn)值是1,代表縮放1倍,即不縮放)。該方法使用一個(gè)新的變化矩陣與當(dāng)前變換矩陣進(jìn)行乘法運(yùn)算,然后得到各種變化的效果。

這里簡(jiǎn)單說(shuō)一下,當(dāng)我們想對(duì)一個(gè)圖形進(jìn)行變換的時(shí)候,只要對(duì)變換矩陣相應(yīng)的參數(shù)進(jìn)行操作,操作之后,對(duì)圖形的各個(gè)定點(diǎn)的坐標(biāo)分別乘以這個(gè)矩陣,就能得到新的定點(diǎn)的坐標(biāo)。

transform()方法

而Canvas繪圖中,就給咱們提供了一個(gè)方法來(lái)改變這個(gè)變換矩陣,那就是transform()。

默認(rèn)坐標(biāo)系是以畫(huà)布最左上角為坐標(biāo)原點(diǎn)(0,0)。越往右X軸數(shù)值越大,越往下Y軸的數(shù)值越大。在默認(rèn)坐標(biāo)系中,每一個(gè)點(diǎn)的坐標(biāo)都是直接映射到一個(gè)CSS像素上。畫(huà)布上一些特定的操作和屬性的設(shè)置都使用默認(rèn)坐標(biāo)系。然而除了默認(rèn)坐標(biāo)系之外,每個(gè)畫(huà)布還有一個(gè)還有一個(gè)“當(dāng)前變換距陣”,作為圖形狀態(tài)的一部分。該矩陣定義了畫(huà)布的當(dāng)前坐標(biāo)系。當(dāng)指定了一個(gè)點(diǎn)的坐標(biāo)后,畫(huà)布的大部分操作都將該點(diǎn)映射到當(dāng)前的坐標(biāo)系中,而不是默認(rèn)的坐標(biāo)系。當(dāng)前變換矩陣是用來(lái)指定的坐標(biāo)轉(zhuǎn)換成為默認(rèn)坐標(biāo)系中的等價(jià)坐標(biāo)。坐標(biāo)的變換還影響了文本和線(xiàn)段的繪制。
 
調(diào)用translate()方法只是簡(jiǎn)單地將坐標(biāo)原點(diǎn)進(jìn)行上、下、左、右移動(dòng)。
rotate()方法會(huì)將坐標(biāo)軸根據(jù)指定角度里進(jìn)行順時(shí)針旋轉(zhuǎn)。
scale()方法實(shí)現(xiàn)對(duì)x軸或由y軸上的距離進(jìn)行延長(zhǎng)和縮短。傳遞負(fù)值會(huì)實(shí)現(xiàn)
 
scale以坐標(biāo)原點(diǎn)做參照點(diǎn)將坐標(biāo)軸進(jìn)行翻轉(zhuǎn)。就好像鏡子中的鏡像。
translate用來(lái)將坐標(biāo)原點(diǎn)移動(dòng)到畫(huà)布最左下角,然后scale方法用于實(shí)現(xiàn)將y軸進(jìn)行翻轉(zhuǎn),這樣的就變成了越往上y軸越大。

從數(shù)學(xué)角度來(lái)理解坐標(biāo)系變換:
translate、rotate和scale方法想象成對(duì)坐標(biāo)軸的變換,就很容易理解了。從代數(shù)角度很容易理解坐標(biāo)變換,就是把變換想像成一個(gè)變換后坐標(biāo)系中的點(diǎn)(x,y),到原來(lái)的坐標(biāo)系統(tǒng)變成了(x`,y`)。
調(diào)用 c.translate(dx,dy)。的方法等效如下表達(dá)式


復(fù)制代碼
代碼如下:

x` = x+dx; //新系統(tǒng)中的x軸的0,在原系統(tǒng)中就是dx
y` = y+dy;
c.scale(sx,sy);
x` = sx*x;
y` = sy*y;
c.rotate()
x` =x*cos(a)-y*sin(a);
y` = y*cos(a)+x*sin(a);

建議使用transform()的時(shí)候,可以在如下幾個(gè)情況下使用:

1.使用context.transform (1,0,0,1,dx,dy)代替context.translate(dx,dy)
2.使用context.transform(sx,0,0,sy,0,0)代替context.scale(sx, sy)
3.使用context.transform(0,b,c,0,0,0)來(lái)實(shí)現(xiàn)傾斜效果(最實(shí)用)。
不用再使用它去實(shí)現(xiàn)旋轉(zhuǎn)了,另外也沒(méi)有也不用全記這些結(jié)論,直接記下abcdef六個(gè)參數(shù)的意義,效果是一樣的。

下面我們看一個(gè)代碼,熟悉一下:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>矩陣變換</title>   
  6.     <style>   
  7.         body { background: url("./images/bg3.jpg") repeat; }  
  8.         #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }   
  9.     </style>   
  10. </head>   
  11. <body>   
  12. <div id="canvas-warp">   
  13.     <canvas id="canvas">   
  14.         你的瀏覽器居然不支持Canvas?!趕快換一個(gè)吧??!   
  15.     </canvas>   
  16. </div>   
  17.   
  18. <script>   
  19.     window.onload = function(){   
  20.         var canvas = document.getElementById("canvas");   
  21.         canvas.width = 800;   
  22.         canvas.height = 600;   
  23.         var context = canvas.getContext("2d");   
  24.         context.fillStyle = "#FFF";   
  25.         context.fillRect(0,0,800,600);   
  26.   
  27.         context.fillStyle = "yellow";   
  28.         context.strokeStyle = "#00AAAA";   
  29.         context.lineWidth = 5;   
  30.   
  31.         context.save();   
  32.         //平移至(300,200)   
  33.         context.transform(1,0,0,1,300,200);   
  34.         //水平方向放大2倍,垂直方向放大1.5倍   
  35.         context.transform(2,0,0,1.5,0,0);   
  36.         //水平方向向右傾斜寬度10%的距離,垂直方向向上傾斜高度10%的距離   
  37.         context.transform(1,-0.1,0.1,1,0,0);   
  38.         context.fillRect(0,0,200,200);   
  39.         context.strokeRect(0,0,200,200);   
  40.         context.restore();   
  41.     };   
  42. </script>   
  43. </body>   
  44. </html>  

運(yùn)行結(jié)果:

setTransform()方法
transform()方法的行為相對(duì)于由 rotate(),scale(), translate(), or transform() 完成的其他變換。例如:如果我們已經(jīng)將繪圖設(shè)置為放到兩倍,則 transform() 方法會(huì)把繪圖放大兩倍,那么我們的繪圖最終將放大四倍。這一點(diǎn)和之前的變換是一樣的。

但是setTransform()不會(huì)相對(duì)于其他變換來(lái)發(fā)生行為。它的參數(shù)也是六個(gè),context.setTransform(a,b,c,d,e,f),與transform()一樣。

這里我們通過(guò)一個(gè)例子來(lái)說(shuō)明:
繪制一個(gè)矩形,通過(guò) setTransform() 重置并創(chuàng)建新的變換矩陣,再次繪制矩形,重置并創(chuàng)建新的變換矩陣,然后再次繪制矩形。

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>矩陣變換</title>   
  6.     <style>   
  7.         body { background: url("./images/bg3.jpg") repeat; }  
  8.         #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }   
  9.     </style>   
  10. </head>   
  11. <body>   
  12. <div id="canvas-warp">   
  13.     <canvas id="canvas">   
  14.         你的瀏覽器居然不支持Canvas?!趕快換一個(gè)吧!!   
  15.     </canvas>   
  16. </div>   
  17.   
  18. <script>   
  19.     window.onload = function(){   
  20.         var canvas = document.getElementById("canvas");   
  21.         canvas.width = 800;   
  22.         canvas.height = 600;   
  23.         var context = canvas.getContext("2d");   
  24.         context.fillStyle = "#FFF";   
  25.         context.fillRect(0,0,800,600);   
  26.   
  27.         context.fillStyle="yellow";   
  28.         context.fillRect(200,100,250,100)   
  29.   
  30.         context.setTransform(1,0.5,-0.5,1,30,10);   
  31.         context.fillStyle="red";   
  32.         context.fillRect(200,100,250,100);   
  33.   
  34.         context.setTransform(1,0.5,-0.5,1,30,10);   
  35.         context.fillStyle="blue";   
  36.         context.fillRect(200,100,250,100);   
  37.     };   
  38. </script>   
  39. </body>   
  40. </html>    

運(yùn)行結(jié)果:

解釋一下過(guò)程:每當(dāng)我們調(diào)用 setTransform() 時(shí),它都會(huì)重置前一個(gè)變換矩陣然后構(gòu)建新的矩陣,因此在下面的例子中,不會(huì)顯示紅色矩形,因?yàn)樗谒{(lán)色矩形下面。

標(biāo)簽:牡丹江 撫州 內(nèi)蒙古 煙臺(tái) 邯鄲 安慶 晉中 玉溪

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入解析HTML5 Canvas控制圖形矩陣變換的方法》,本文關(guān)鍵詞  深入,解析,HTML5,Canvas,控制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《深入解析HTML5 Canvas控制圖形矩陣變換的方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于深入解析HTML5 Canvas控制圖形矩陣變換的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章