canvas中的坐標(biāo)系

原文鏈接:https://www.codeproject.com/articles/598955/coordinateplussystemplusinplushtml-pluscanvas-cpl

canvas中的坐標(biāo)系,用y軸向上增長(zhǎng)繪圖

在某些動(dòng)畫類型中,默認(rèn)坐標(biāo)系是不方便的窄赋,幸好哟冬,你可以使用轉(zhuǎn)型方式來改變它...

HTML5 Canvas中的坐標(biāo)系統(tǒng)以左上角為其原點(diǎn)(0, 0)。這個(gè)解決方案在屏幕圖形學(xué)領(lǐng)域并不新鮮(例如windows窗體和svg也是如此)忆绰。過去標(biāo)準(zhǔn)的CRT監(jiān)視器從上到下顯示圖像行浩峡,并且從左到右創(chuàng)建行中的圖像。因此错敢,定位原點(diǎn)(0翰灾,0)在左上角是直觀的,它使創(chuàng)建硬件和軟件處理圖形更容易稚茅。

不幸的是有些時(shí)候纸淮,canvas中的默認(rèn)坐標(biāo)系統(tǒng)是有點(diǎn)不切實(shí)際的。比如你想創(chuàng)建彈丸運(yùn)動(dòng)動(dòng)畫亚享,對(duì)于上升的彈丸咽块,y坐標(biāo)是上升的這看起來是很自然的,但是這會(huì)導(dǎo)致一個(gè)很奇怪的效果:

default_coord.jpg

您可以通過修改傳遞給繪圖方法的y值來解決這個(gè)問題:

contexnt.fillRect(x, offsetY - y, size, size);

對(duì)于y=0欺税,彈丸將被放置在由offsetY決定的位置(將offsetY設(shè)置為canvas的高度侈沪,以使y=0是畫布的最底部)飒货。 y的值愈大,彈跳將越會(huì)高峭竣,但是問題是你的代碼中將會(huì)有幾百個(gè)地方使用y坐標(biāo),如果你有一次忘記使用offsetY晃虫,那么整個(gè)圖像可能被破壞皆撩。

幸運(yùn)的是,canvas允許你使用變換來改變坐標(biāo)系統(tǒng)哲银。有兩種轉(zhuǎn)換方法對(duì)我們很有用:translate(x, y)和scale(x, y)扛吞。前者允許我們將原點(diǎn)移動(dòng)到任何位置,后者用于改變繪制對(duì)象的大小荆责,但是它也可以用來反轉(zhuǎn)坐標(biāo)滥比。

單次執(zhí)行以下代碼將坐標(biāo)系原點(diǎn)移動(dòng)到點(diǎn)(0, offsetY),并建立y軸值隨著朝向屏幕頂部的增加:

   context.translate(0, offsetY);
   context.scale(1, -1);
translate_and_scale_small.jpg

但是這里有個(gè)catch:提供-1作為scale的第二個(gè)參數(shù)的結(jié)果是整個(gè)圖像是為倒置y坐標(biāo)創(chuàng)建的做院。這也適用于文本(調(diào)用fillText將呈現(xiàn)字母上下顛倒)盲泛。因此,在寫任何文本之前键耕,您必須恢復(fù)默認(rèn)的y軸配置寺滚。因?yàn)槭謩?dòng)恢復(fù)畫布狀態(tài)是笨挫的,方法save()和restore()屈雄,這兩個(gè)方法分別用于在堆棧上保存畫布狀態(tài)和從畫布狀態(tài)堆棧中恢復(fù)狀態(tài)村视。建議在變換之前使用保存save方法。canvas的狀態(tài)不僅包括變換酒奶,還包括一些如填充樣式或者線寬之類的值...

 context.save();

 context.fillStyle = 'red';
 context.scale(2, 2);
 context.fillRect(0, 0, 10, 10);

 context.restore();

 context.fillRect(0, 0, 10, 10);

以上代碼繪制了2個(gè)正方形:


canvas_rects.png

第一個(gè)正方形是紅色的且使用2倍刻度繪制蚁孔,第二個(gè)正方形使用默認(rèn)畫布設(shè)置(顏色黑色和1倍刻度)。這發(fā)生是因?yàn)樵趯?duì)比例和顏色進(jìn)行任何改變之前惋嚎,畫布狀態(tài)被保存在堆棧上杠氢,之后再繪制第二個(gè)正方形之前被恢復(fù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘸彤,一起剝皮案震驚了整個(gè)濱河市修然,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌质况,老刑警劉巖愕宋,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異结榄,居然都是意外死亡中贝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門臼朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻寿,“玉大人蝎土,你說我怎么就攤上這事⌒宸瘢” “怎么了誊涯?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒜撮。 經(jīng)常有香客問我暴构,道長(zhǎng),這世上最難降的妖魔是什么段磨? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任取逾,我火速辦了婚禮,結(jié)果婚禮上苹支,老公的妹妹穿的比我還像新娘砾隅。我一直安慰自己,他們只是感情好债蜜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布晴埂。 她就那樣靜靜地躺著,像睡著了一般寻定。 火紅的嫁衣襯著肌膚如雪邑时。 梳的紋絲不亂的頭發(fā)上特姐,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天晶丘,我揣著相機(jī)與錄音,去河邊找鬼唐含。 笑死浅浮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捷枯。 我是一名探鬼主播滚秩,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼淮捆!你這毒婦竟也來了郁油?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤攀痊,失蹤者是張志新(化名)和其女友劉穎桐腌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苟径,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡案站,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棘街。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆盐。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡承边,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出石挂,到底是詐尸還是另有隱情博助,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布痹愚,位于F島的核電站翔始,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏里伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一渤闷、第九天 我趴在偏房一處隱蔽的房頂上張望疾瓮。 院中可真熱鬧,春花似錦飒箭、人聲如沸狼电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肩碟。三九已至,卻和暖如春凸椿,著一層夾襖步出監(jiān)牢的瞬間削祈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工脑漫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓抑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓优幸,卻偏偏與公主長(zhǎng)得像吨拍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子网杆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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