Canvas學(xué)習(xí)筆記之變形

Canvas 學(xué)習(xí)筆記之變形 -- by Damon

狀態(tài)保存和恢復(fù)

ctx.save()
ctx.restore()

狀態(tài)包括:

  • 當(dāng)前的移動(dòng)、旋轉(zhuǎn)、縮放
  • strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, globalCompositeOperation 的值
  • 當(dāng)前的裁切路徑(cliping path)

狀態(tài)棧:
每次調(diào)用save就是入棧操作期虾,restore就是出棧操作

ctx.translate(x, y)
ctx.rotate(ratio)
ctx.scale(x, y)
ctx.setTransform(m11, m12, m21, m22, dx, dy)
ctx.resetTransform() // == ctx.setTransform(1, 0, 0, 1, 0, 0)

m11: 水平方向的縮放
m12: 水平方向的偏移
m21: 豎直方向的偏移
m22: 豎直方向的縮放
dx: 水平方向的移動(dòng)
dy: 豎直方向的移動(dòng)

常用方法
變換前先save一下?tīng)顟B(tài),然后變形肿孵,畫完后重置

Paste_Image.png
window.onload = function() {

  translate();
  rotating();
  scale();
};

// 1
function translate() {

  var cvs = document.getElementById('my-canvas-1');
  var ctx = cvs.getContext('2d');
  cvs.height = 300;
  cvs.width = 300;

  ctx.fillRect(0, 0, 300, 300);
  for (var i = 0; i < 3; i++) {
    for (var j = 0; j < 3; j++) {
      ctx.save();
      ctx.strokeStyle = '#9CFF00';
      ctx.translate(50 + j * 100, 50 + i * 100);
      ctx.beginPath();
      ctx.arc(0, 0, 20, 0, Math.PI * 2);
      ctx.closePath();
      ctx.stroke();
      ctx.restore();
    }
  }
}
// 2
function rotating() {

  var cvs = document.getElementById('my-canvas-2');
  var ctx = cvs.getContext('2d');
  cvs.height = 300;
  cvs.width = 300;

  ctx.translate(150, 150);
  for (var i = 1; i < 7; i++) {
    for (var j = 0; j < i * 6; j++) {
      ctx.save();
      ctx.fillStyle = '#F0F';
      ctx.rotate(2 * Math.PI / 6 / i * j);
      ctx.beginPath();
      ctx.arc(20 * i, 0, 4, 0, Math.PI * 2);
      ctx.closePath();
      ctx.fill();
      ctx.restore();
    }
  }
}
// 3
function scale() {

  var cvs = document.getElementById('my-canvas-3');
  var ctx = cvs.getContext('2d');
  cvs.height = 300;
  cvs.width = 300;

  ctx.translate(150, 150);
  for (var i = 1; i < 7; i++) {
    for (var j = 0; j < i * 6; j++) {
      ctx.save();
      ctx.scale(1 + i / 10, 1 + i / 10);
      ctx.fillStyle = '#F0F';
      ctx.rotate(2 * Math.PI / 6 / i * j);
      ctx.beginPath();
      ctx.arc(20 * i, 0, 4, 0, Math.PI * 2);
      ctx.closePath();
      ctx.fill();
      ctx.restore();
    }
  }
}
// 4
function transform() {
  var cvs = document.getElementById('my-canvas-2');
  var ctx = cvs.getContext('2d');
  cvs.height = 300;
  cvs.width = 300;

  ctx.translate(150, 150);
  for (var i = 1; i < 7; i++) {
    for (var j = 0; j < i * 6; j++) {
      ctx.save();
      ctx.fillStyle = '#F0F';
      ctx.rotate(2 * Math.PI / 6 / i * j);
      ctx.beginPath();
      ctx.arc(20 * i, 0, 4, 0, Math.PI * 2);
      ctx.closePath();
      ctx.fill();
      ctx.restore();
    }
  }
}

代碼地址
Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垒手,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匀谣,更是在濱河造成了極大的恐慌照棋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件武翎,死亡現(xiàn)場(chǎng)離奇詭異烈炭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)后频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門梳庆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卑惜,你說(shuō)我怎么就攤上這事膏执。” “怎么了露久?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵更米,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我毫痕,道長(zhǎng)征峦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任消请,我火速辦了婚禮栏笆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臊泰。我一直安慰自己蛉加,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布缸逃。 她就那樣靜靜地躺著针饥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪需频。 梳的紋絲不亂的頭發(fā)上丁眼,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音昭殉,去河邊找鬼苞七。 笑死藐守,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂风。 我是一名探鬼主播吗伤,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼硫眨!你這毒婦竟也來(lái)了足淆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤礁阁,失蹤者是張志新(化名)和其女友劉穎巧号,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姥闭,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丹鸿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棚品。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靠欢。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铜跑,靈堂內(nèi)的尸體忽然破棺而出门怪,到底是詐尸還是另有隱情,我是刑警寧澤锅纺,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布掷空,位于F島的核電站,受9級(jí)特大地震影響囤锉,放射性物質(zhì)發(fā)生泄漏坦弟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一官地、第九天 我趴在偏房一處隱蔽的房頂上張望酿傍。 院中可真熱鬧,春花似錦驱入、人聲如沸赤炒。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)可霎。三九已至魄鸦,卻和暖如春宴杀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾因。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工旺罢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旷余,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓扁达,卻偏偏與公主長(zhǎng)得像正卧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跪解,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 最基本的使用創(chuàng)建一個(gè)畫布所有的操作都在畫布的context上面canvas是基于狀態(tài)而不是基于對(duì)象的炉旷,比如說(shuō)顏色都...
    親愛(ài)的孟良閱讀 1,653評(píng)論 0 4
  • 書中代碼示例效果展示:Core HTML5 Canvas Examples 基礎(chǔ)知識(shí) canvas元素 canva...
    szu_bee閱讀 2,810評(píng)論 2 28
  • 1.基本用法要使用canvas元素,必須先設(shè)置其width和height屬性叉讥,制定可以繪畫的區(qū)域大小窘行。出現(xiàn)在開(kāi)始和...
    林中歡歌要找笑語(yǔ)閱讀 458評(píng)論 0 0
  • 變形 在了解變形之前,先了解狀態(tài)图仓。 狀態(tài) canvas 的狀態(tài)就是當(dāng)前畫面應(yīng)用的所有樣式和變形的一個(gè)快照罐盔,用來(lái)操作...
    Sachie閱讀 532評(píng)論 0 0
  • 父親今年八十有六,身體每況愈下救崔,生命的盡頭雖像薄霧朦朦朧朧惶看,可在流動(dòng)之間,已經(jīng)可以窺見(jiàn)它的影子了六孵。我早已萌...
    一泓囈語(yǔ)閱讀 401評(píng)論 0 3