1. 程式人生 > >canvas星空和圖形變換

canvas星空和圖形變換

圖形變換。


一、畫一片星空
先畫一片canvas.width寬canvas.height高的黑色星空,再畫200個隨機位置,隨機大小,隨機旋轉角度的星星。


 View Code
 產生一個扁平化設計中200個星星的效果。






二、影象變換和狀態儲存
1、用標準路徑+圖形變換思想重構
上面drawStar函式承載的功能太多來,整個繪製路徑的指定,同時把五角星的位移,大小,旋轉多少度全部揉合在一個函式裡了。


假如需要變為畫一個四角形?六角形?程式碼改起來就比較麻煩了。


標準做法:修改函式結構。


介面不變,省去了旋轉角度,畫一個標準星星。假設外圓半徑是內圓半徑的兩倍,所以只需要傳入一個小r。drawStar裡呼叫一個startPath()函式來繪製一個標準五角星的路徑。


標準的五角星路徑:只傳入一個context,在(0,0)的位置繪製來一個大圓半徑為1,同時沒有任何偏移,任何旋轉的的五角星。


在drawStar裡勾繪出標準五角星後再通過圖形變換使得標準五角星的位移變成在(x,y)的位置,大小變成R這麼大,同時旋轉rot角度。再進行具體的繪製。


這樣一個設計的結構可以避免之前的問題。比如需求變成要畫六角形,四角形,只需要把starPath()裡面路徑勾繪的程式碼進行相應的更改即可。


更高階的複用:starPath()函式以引數的形式傳入drawStar()中。這樣drawStar可以叫drawSheap使用者可以繪製任意的圖形,只需要傳入繪製圖形的標準路徑,變更的位移量,大小量,旋轉量即可。 


複製程式碼
//rot順時針旋轉的角度
function drawStar(ctx,x,y,r,R,rot){
    starPath(ctx);
    //繪製在(x,y)大小為R,旋轉rot度的五角星
    //...
}


function starPath(ctx){
    ctx.beginPath();
    //角度轉弧度:除以180*PI
    for(var i=0;i<5;i++){
        ctx.lineTo(Math.cos((18+i*72)/180*Math.PI),
            -Math.sin((18+i*72)/180*Math.PI));
            ctx.lineTo(Math.cos((54+i*72)/180*Math.PI),
            -Math.sin((54+i*72)/180*Math.PI));
    }
    ctx.closePath();
}
複製程式碼
總結:圖形學裡繪製先繪製標準路徑,再通過圖形變換成需求大小。


2,圖形變換
三種基本操作:


位移translate(x,y)
旋轉rotate(deg)
縮放 scale(sx,sy)
translate會疊加


綠色正方形位置經過2次translate後到達了(200,200)。並不是程式碼裡看起來的(150,150)。


 View Code




為了避免上述問題,最佳實踐是使用圖形變換之後,再反向操作把圖形變換的結果逆轉過來。如下:


 View Code




3,canvas狀態的儲存save()和恢復restore()
逆轉圖形變換太麻煩了,canvas提供了一個save()API,儲存當前的圖形狀態,狀態包括所有我們設定的狀態,自然也包括圖形變換的狀態。


在完成圖形變換並且具體繪製以後,在最後再呼叫一次context.restore()。


restore()和save()是成對出現的,restore()返回在save()時候canvas的所有狀態, 這是一個非常好的保持canvas繪圖狀態的方法,在save()和restore()之間可以隨意的更改canvas的狀態而不影響後續的繪製效果。


複製程式碼
window.onload=function(){
    var canvas=document.getElementById("canvas");


    canvas.width=400;
    canvas.height=400;


    var context=canvas.getContext(www.douniu178.com"2d");


    context.save(www.taohuayuan178.com );
    context.fillStyle="red";
    context.translate(50,50);
    context.fillRect(0,0,200,200);
    //context.translate(-50,-50);//反向操作
    context.restore(www.dashuju178.com);


    context.save()
    context.fillStyle="green";
    context.translate(150,150);
    context.fillRect(0,0,200,200);
    // context.translate(-150,-150);//反向操作
    context.restore();
}   
複製程式碼
Note:繪製整體元素,特別是在其中使用圖形變換的時候,都應該先save()一下,最終結束繪製時再restore()一下以保證canvas圖形繪製的正確。


三、應用translate,rotate和scale
1、使用translate和rotate繪製固定大小星星的星空
沒有用scale.


ctx.translate(x,y);
ctx.rotate(rot/180*Math.PI);
 View Code
效果和上面圖片一樣。


2、scale副作用
不僅放在大小,還會放大座標,邊框等。


複製程式碼
 var canvas=document.getElementById("canvas");


    canvas.width=400;
    canvas.height=400;


    var context=canvas.getContext("2d");


    context.save();
    context.scale(1,1);
    context.strokeRect(10,10,100,100);
    context.restore();


    context.save()
    context.scale(2,2,);
    context.strokeRect(10,10,100,100);
    context.restore();


    context.save()
    context.scale(3,3,);
    context.strokeRect(10,10,100,100);
    context.restore();
}   
複製程式碼




3, 應用scale繪製星空
座標是通過translate變換的,始終是(0,0)所以scale後還是(0,0)。


放棄外邊框的繪製。


 View Code
星星沒有外邊框。






四、深入理解圖形變換
圖形變換的實質是對圖形的頂點座標的再計算。計算過程通過變換矩陣來完成。


二維的變換矩陣是3*3,三維的變換矩陣是4*4。






使用transform(a,b,c,d,e,f)設定變換矩陣每次設定是在之前的基礎上設定的。


可以用setTransform(a,b,c,d,e,f))忽略掉之前所有的變換矩陣。先設定為單位矩陣再變換。


複製程式碼
window.onload=function(){
    var canvas=document.getElementById("canvas");


    canvas.width=400;
    canvas.height=400;


    var context=canvas.getContext("2d");


    context.fillStyle="red";
    context.strokeStyle="#058";
    context.lineWidth=5;
    /////////////////////////////
    // a c e
    // b d f 
    // 0 0 1
    /////////////////////////////
    // a,d 水平,垂直縮放
    // b,c 水平,垂直傾斜
    // e,f 水平,垂直位移
    /////////////////////////////
    context.save();
    // context.transform(1,0,0,1,0,0);
    //transform級聯操作
    context.transform(1,0,0,1,50,100);
    context.transform(2,0,0,1.5,0,0);
    context.transform(1,-0.2,-0.2,1,0,0);
    //setTransform()只使用當前變換
    context.setTransform(1,0,0,1,100,100);
    context.fillRect(50,50,100,100);
    context.strokeRect(50,50,100,100);
    context.restore(www.douniu157.com);

複製程式碼
這部分內容和css3的動畫的內容本質都是一樣的,都是圖形學的內容。


css3動畫可以參考我之前的部落格:


css3中變形與動畫(一)


css3中變形與動畫(二)


css3中變形與動畫(三)


 


本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.www.boshenyl.cn /starof/p/8626422.html 有問題歡迎與我討論,共同進步。 

相關推薦

canvas星空圖形變換

圖形變換。一、畫一片星空先畫一片canvas.width寬canvas.height高的黑色星空,再畫200個隨機位置,隨機大小,隨機旋轉角度的星星。 View Code 產生一個扁平化設計中200個星星的效果。二、影象變換和狀態儲存1、用標準路徑+圖形變換思想重構上面dra

canvas基礎學習(二)-線條的屬性與星空圖形變換

以下是星空程式碼實現: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &

HTML5 Canvas圖形變換

很多時候,我們繪製出一個圖形之後,並不能達到我們預期的效果,這個時候,適當地運用圖形的變換(transformations,如旋轉和縮放等),可以創建出大量複雜多變的圖形。 1、儲存和恢復Canvas狀態 Canvas指的是當前畫面的所有樣式、變形和裁切的一個快照,以堆的

計算機圖形學-實驗5-掌握Bezier樣條曲面生成思想、複習基本圖元繪製、互動操作幾何變換相關內容

實驗五:(2學時) 一、 實驗目的: 掌握Bezier樣條曲面生成思想、複習基本圖元繪製、互動操作和幾何變換相關內容 二、 實驗內容: 1、在視窗中畫三維座標,包括原點和三個座標軸; 2、畫一條Bezier樣條曲面,包含4*4個控制點; 3、利用滑鼠或鍵盤控制曲面在螢幕

canvas圖形變換

1.translate(x,y)——位移,位移會產生疊加,所以在進行下一次位移之前要清除前面已產生的位移,canvas提供了另外一種方法,就是在繪製之前用save()儲存一下之前的狀態,然後繪製完之後用restore()恢復到之前儲存的狀態。 2.rotate(deg)——

CSS3實現五子棋Web小遊戲,Canvas畫布DOM兩種實現,並且具有悔棋撤銷悔棋功能。

posit oct padding 角色 sar pac osi fse ech 用Canvas實現五子棋的思路: 1、點擊棋盤,獲取坐標x,y,計算出棋子的二維數組坐標i和j, 2、棋子的實現,先arc一個圓,再填充漸變色。 3、下完一步棋後切換畫筆和角色。 4、贏法算法

CSS3-Canvas畫布(圖形-圓)

oct function 對象 htm con utf-8 context set 支持 <!DOCTYPE html5><html lang="en"><head> <meta charset="UTF-8">

canvas 繪制圖形

.html script alpha iam 二次貝塞爾曲線 creat -m 屬性 其他 什麽是canvas?    <canvas> 元素用於圖形的繪制,通過腳本 (通常是JavaScript)來完成.    <canvas> 標簽只是圖形容器,

利用canvas繪制圖形

趨勢 增加 互聯網 所有 獲取 內部 曲線 必須 需要 繪制圖有很多種方法,可以借助flash實現,也可以使用SVG和VML來繪圖。本章將要學習一種新的繪圖方法——使用Canvas元素,它是基於HTML5原生的繪圖功能。使用Canvas元素,可以繪制圖形,也可以實現

canvas遊戲動畫中的碰撞檢測

底部 bsp rect circle 進行 eight nbsp odi word 碰撞檢測關鍵步驟 碰撞檢測需要處理經歷下面兩個關鍵的步驟: 計算判斷兩個物體是否發生碰撞 發生碰撞後,兩個物體的狀態和動畫效果的處理 計算碰撞 只要兩個物體相互接觸,它們就會發生碰撞

windows2012 core的啟用圖形界面的啟用

name isa dism disable 圖形界面 server 圖形 win ren 1.啟用coredism /online /disable-feature /featurename:servercore-fullserver2.啟用桌面dism /online /

Mysql的安裝圖形化界面的使用

blog 由於 登錄 我的博客 目錄 服務 str img 應該 訪問mysql網址:https://dev.mysql.com/                     下面需要登錄你的oracle賬號進行下載就好~   下載之後是一解壓包形式存在的~   解壓之後的文件

aria2下載工具命令行圖形化界面使用

ipa -o size alt ads 完成後 1-1 今天 none 如圖是搭建好圖形化界面下載軟件的一個截圖,可以看到界面很是熟悉的感覺。下面就開始我們今天的教程吧。Question?這是個啥東西?命令行怎麽用?圖形化怎麽用? Answer:aria2就是個下載軟件,具

圖片圖形之位圖(4)

APK PNG JPG WEBP 概要 在Android應用中加載位圖很棘手的原因有很多: 位圖可以非常輕松地消耗應用程序的內存預算。例如,Pixel手機上的相機最多可拍攝4048x3036像素(1200萬像素)的照片。如果使用的位圖配置是ARGB_8888Android 2.3(API級

CSS3 圖形變換

ans tran TP spa ont size RM cal pan 1、zoom 和 transform:scale 的區別 : http://www.zhangxinxu.com/wordpress/2015/11/zoom-transform-sca

三維圖形變換

四階 視圖 分類 平移 缺點 兩種 直線 交點 之間 三維圖形變換 是在二維方法基礎上增加了對z坐標的考慮得到的。與二維變換類似,引入齊次坐標表示,即:三維空間中某點的變換可以表示成點的齊次坐標與四階的三維變換矩陣相乘。 一、平移變換 二.比例變換 例如:對長方體進

CG-二維三維圖形變換-學習筆記

結果 設備 right 可行性 spl http 情況下 width 範圍 一、計算機圖形學中坐標系分類 世界坐標系、建模坐標系、觀察坐標系、設備坐標系、規範化坐標系 其中:規範化坐標系是一個中間坐標系,坐標值取值範圍0-1; 二、二維圖形變換 1. 變換種類:比例、旋轉、

關於Echarts動態資料之圖形變換

    我使用的是.net作為後臺語言,而與前臺aspx中的js進行資料流通是很多人不知道的地方,那麼我就先從這裡說起。 1. 學過java的都知道java是jsp的指令碼語言,同理.net也是aspx的指令碼語言,例如呼叫後臺陣列使用<%=a

canvas 中的圖形事件判斷

瞭解canvas這個標籤後,會發現在一個canvas類似一個img圖片,在canvas中繪製的圖形都是一個整體,所有的事件也都是發生在這一個標籤上,沒有辦法直接判斷事件是發生在canvas中的某個圖形上。但是通過canvas中的路徑的概念可以解決這個問題。 關鍵:通過路徑來繪製圖形,用每一個圖形是一

圖形變換中涉及到的數學知識(向量叉乘、矩陣相乘、齊次座標)

文章目錄 1. 向量 1.1 點乘 1.2 叉乘 2. 矩陣 3. 齊次座標 1. 向量 1.1 點乘 兩個n維向量點乘: