Canvas 紀錄 part 1

liy Elaine
liy Elaine
Published in
6 min readApr 24, 2021

前言

這篇文章針對比較混淆幾個 Canvas api 作比較,以下分別為個別 api 講解

正文

translate 平移

如下圖,在位移之前 (灰色矩形)和位移之後 (紅色矩形)畫了兩個矩型,並標示了位移之前和位移之後原點所在的位置 (藍色 Point),由此可知畫布 在 X 軸 位移了 100 , 在 Y 軸位移了 100

Scale 縮放

scale(float sx , float sy)

將畫布 沿著 X 軸 和 Y 軸 進行縮放

如下圖,在 縮小前繪製了 灰色矩型,並標示了原本( 200,200) 的位置 ,再縮小後 繪製了 紅色矩型,標示了縮小之後 ( 200,200) 的位置,最右上角綠色的點點是 原點(0,0)

scale(float sx, float sy, float px, float py)

sx 表示 X 軸的縮放比例 , sy 表示 Y 軸的縮放比例
px py 是縮放的軸心

這個 api 原本也不太了解,後來動手操作之後就比較了解

以下是 源碼

我們模擬上面 的canvas!!.scale(0.5f, 0.5f, 400f, 400f); 畫出 同樣 左上 為(0,0)右下為 (400,400), 但顏色不同的三個矩型,並標出原點的位置

會形成以下的圖,我們可以將 三個 矩型看成是 一個變化的過程

調用這個 api , 第一會先將 畫布做平移的動作, 也就是 px py ,我設定 px py 分別為 400 ,400 也就是 將畫布位移至 (400 ,400) 的位置

第二會將 畫布做縮小的動作, 也就是 sx sy ,我設定 sx sy 分別為 0.5f ,0.5f 也就是 畫布 X 軸 Y 軸 會被縮放成 原本的一半,

第三會將 畫布 會 將 移動的距離 回補回去,例如我們位移400 translate(400f, 400f); ,則在最後一個步驟,我們則要調用 translate(-400f, -400f) ,但這個距離好像沒有 完全移回去原本的原點(0,0) ,其實是因為我們已經進行了縮放了 0.5 ,所實際移回去的距離,可能只有 400 的一半也就是 200

如果我們完全不進行縮放, 縮放的軸心 px py 仍設定為 400 , 400 。我們看看產生的矩型會長怎樣

以下為畫出的矩型

整個過程會像下面這張圖,我們可以看到因為完全沒有縮放,所以灰色矩型被蓋過去,只剩下縮放之後的紫色矩形(大小完全一樣),因為畫布並沒有縮小,最後畫布完全移回 原點(0,0),所以最後得到的矩型會跟執行 scale () 這個 api 之前一樣

我們可以得知這個 api ,除了 畫布會縮放 依照 sx sy 縮放比例縮放,畫布也會做移動,移動的距離 (以原本畫布的量度大小)是 x 方向的距離 px - (px * sx) , y方向的距離 py -(py * sy),如上 當 sx sy 為 0.5f 整個畫布距離 會離原本的原點 大概是 原本畫布大小 200 因為畫布縮小 所以 X 軸和 Y軸 位移回去 只有 400f *0.5f, 當 sx sy 為 1f 會沒有縮小 ,先移動畫布 X 軸和 Y軸 400 f , 最後又將畫布往回移 X 軸和 Y軸 400f *1f

rotate 旋轉

rotate(float degrees) degree 是旋轉角度 , 旋轉中心座標 會是 (0,0), 會以旋轉中心 順時鐘旋轉。

範例 1 設定旋轉角度 45 度

會得到下圖

範例 1 設定旋轉角度 60度

rotate(float degrees, float px, float py) degree 是旋轉角度 , px py 是 旋轉中心 x 座標 與 y 座標。

範例

將旋轉中心設置於 正方形 中心點(350f,350f), 旋轉 45 度

skew 傾斜操作

skew (float sx , float sy), sx 和 sy 是 往 x 方向和 往 y 方向的 傾斜角度 正切值 也就是 tan 值。

這個 api 操作牽涉到 三角函數的 tan

tan 公式 為 tan(θ)=對邊​ /鄰邊

範例1

我們會得到以下圖示

skew(1f, 0f) 代表 往 X 方向 傾斜角度 正切值 (tan)為 1f ,往 Y 方向 傾斜角度 正切值 (tan)為 0f , 也就是 畫布 往 X 軸方向角度 傾斜 對邊與鄰邊等長 ,對邊除以鄰邊相除(tan)會是 1

範例2

我們會得到以下圖示

skew(0f, 1f) 代表 往 X 方向 傾斜角度 正切值 (tan)為 0f ,往 Y 方向 傾斜角度 正切值 (tan)為 1f , 也就是 會 畫布 往 Y 軸方向 傾斜 角度 對邊與鄰邊等長,對邊除以鄰邊相除(tan)會是 1

範例3

將 sx 設置成 3f sy 保持 0f, 也就是 畫布 會往 X 軸方向傾斜 角度 正切值(tan)對邊長與鄰邊長比例 會是 3 : 1

我們會得到以下圖示

我們可以很清楚看到 傾斜角度 的對邊與鄰邊比為 3 : 1

結尾

以上就是對這幾個 api 粗略的介紹,把它寫下來之後就可以複習,如果發現有誤,可以留言告訴我哦 > < ,我會盡快作更正

--

--