整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML5教程關于canvas的線條知識,可以這樣總結方法

          文為兄弟連云課堂《HTML5教程canvas學習:線條知識總結》學習筆記 訂閱走一波

          競,從它進入我們的視野開始,就離不開紅藍黃綠的色彩與光芒。久而久之,背光、幻彩已經成為了電競裝機的標配。如果自己裝機的內存不帶馬甲燈條,CPU風扇不帶RGB幻彩背光,機箱里不裝幾個背光很炫的風扇,都不好意思說自己是一個資深的電競玩家。

          光影交錯的側透感受

          燈光與性能無關,卻帶給人電競的含義。干凈的側透如今已然成為眾多玩家攢機的機箱首選。那么能透射出精美背光的側透機箱也就應運而生了。側透不僅讓玩家心中時時體驗著電競帶來的美感,同時也讓整機效果更顯檔次。

          愛國者月光寶盒破曉機箱

          如今,干凈的側透已經成為潮流,現在的機箱也紛紛朝著這個方向發展。那么下邊,我們就為大家介紹幾款目前市售熱銷的側透機箱產品,讓小伙伴們裝機也能夠上檔次。

          鋁制機箱在DIY玩家心中是高端的代表,因為質感和工藝的問題,鋁制機箱的價格要遠遠高于傳統的機箱,現在愛國者“暮光之城”系列機箱來襲,首發的兩款“新月”“破曉” 兩款機箱均采用了鋁材質+鋼化玻璃的組合,外觀和質感相當不錯。最關鍵的是,現在這款機箱在京東秒殺價249元,將鋁箱的價格拉入主流級的市場,喜歡的玩家不妨抓緊時間來選購一下吧!

          (圖片來自京東商城)

          愛國者破曉機箱(圖片來自京東商城)

          今天筆者就來和大家聊一聊破曉這款機箱,相信聽名字,很多玩家就已經對這款機箱的由來,這款機箱前面板采用鋁材質設置,并且在前面板下部做了斜角切割的設計,玩家可以之間看到面板后面的風扇,在加裝發光風扇之后,視覺效果十分不錯。

          愛國者破曉機箱

          不僅如此,這樣的設計在提升顏值以及個性化的同時,還能讓整機的散熱效能得到進一步的提升。

          機箱正面展示

          破曉機箱的外觀尺寸為:453*212*493MM,屬于中小型身材的機箱,擺在桌面上和腳下都不會占用太大的地方。

          機箱的側部采用鋼化玻璃設計

          同時機箱的左側側板采用全尺寸的鋼化玻璃設計,質感不錯,機箱的頂部采用全尺寸的散熱孔位設計,支持140mm*2的散熱風扇安裝,并且散熱器位上還設計了磁吸式的防塵網,方便玩家的日常維護!

          機箱內部采用分體式架構設計

          在內部架構設計上,破曉機箱采用了分體式架構設計,將電源倉和內部空間獨立開來,在散熱互不干擾的情況下,玩家還能擁有更好的裝機體驗。

          硬盤架設計

          在硬盤位的設計上,破曉為我們設計了2個HDD硬盤位以及3個SSD硬盤位,基本滿足玩家的存儲需求,同時還在HDD硬盤位上下部設計了散熱孔位,保證機械硬盤在工作時熱量能夠及時的散發出去。

          愛國者月光寶盒破曉

          進入購買

          作為機電行業中耕耘多年的航嘉來講,航嘉MVP ARES 戰神機箱的外觀突出一個驚艷,對于很多的游戲玩家來講,這樣的外觀非常適合打造開放式的炫光平臺,現在這款機箱在京東售價1599元,心動的玩家不妨抓緊時間來選購吧。

          (圖片來自京東商城)

          航嘉MVP ARES戰神機箱

          航嘉 MVP ARES 戰神機箱的兩側使用的是4mm的深黑色鋼化玻璃,可以很好的讓玩家打造光污染平臺。

          機箱頂部展示

          機箱的頂部和前部都采取了開放式的設計,這樣的設計可以提升機箱的散熱能力,并且還很好的提升了機箱的顏值。戰神機箱的頂部采用了45°的鰭片設計,方便頂部的空氣流通,為整機的散熱也提供了很好的基礎。

          機箱的I/O區

          機箱的I/O區設計在戰神前臉中間,并且為玩家提供了開機鍵、重啟鍵、2個USB2.0接口以及2個USB3.0接口,同時還有一組音頻接口,充分滿足玩家的日常使用需求。

          航嘉MVP ARES戰神機箱的內部空間采用的ATX架構,最大兼容EATX主板,兼容能力強悍。機箱內部支持最高160mmCPU散熱器和400mm以內的顯卡安裝,玩家再也不用擔心自己的超長顯卡沒辦法安裝進機箱了。

          機箱內部空間展示

          機箱背板展示

          在存儲位擴展上,機箱為我們提供了4個硬盤位,包括2個3.5英寸和2個2.5英寸硬盤位,可以滿足玩家的日常存儲需求。

          機箱硬盤位展示

          在水冷的支持上,得力于戰神ARES為全塔機箱,機箱的前面板,頂部以及底部均可以安裝3個12cm的散熱風扇,并且在機箱的背部還可以安裝一個12cm的風扇,想要裝水冷的玩家,這款機箱是一個非常不錯的選擇。

          編輯總結:航嘉MVP ARES戰神機箱外觀設計霸氣炫酷,全鋁材質,鋼化玻璃側板的設計充分說明這是一款針對高端用戶的機箱,機箱內部空間充足,兼容性強悍,同時機箱采用了開放式的設計,這樣可以更好的展示機箱內部的硬件,這可能也是未來機箱的一個發展方向,對于喜歡大空間水冷箱的高端玩家,航嘉MVP ARES戰神無疑是一個非常不錯的選擇。

          航嘉 MVP ARES戰神

          京東

          說到電競炫酷,說到RGB幻彩,若不上三面側透的機箱怎能淋漓盡致地表達我們的電競情感。而長城魔鏡T600機箱就是這樣一款滿足大家電競激情的產品。這款機箱是目前長城魔鏡系列機箱中的高端形象,有了這款機箱相信你的硬件平臺能夠為你帶來更加優越的游戲體驗。

          戳我進入京東商城

          長城T600機箱繼承了長城魔鏡系列機箱的優秀設計,外觀設計延續了大側透的特點,更加簡約精致的風格讓機箱看上去冷酷而時尚。機箱采用三面全透的鋼化玻璃設計,完全讓機箱成為PC硬件的展示平臺,同時機箱花費高成本打造3mm厚度的全鋁頂蓋,陽極鋁拉絲工藝讓機箱質感更強,符合現在DIY玩家對機箱外觀的審美和需求。

          挑選游戲機箱,內部空間寬裕是游戲玩家挑選機箱的重要標準。長城T600機箱尺寸為487×226×520mm,兼容市面所有E-ATX/ATX/M-ATX/ITX大小規格主板,同時支持高度達到165mm的CPU散熱器以及400mm的顯卡,能夠輕松安裝旗艦級GTX1080Ti獨立顯卡,能夠滿足高端玩家組裝頂級主機的需求。

          為提高主機的散熱性能,機箱在前面板配備了3個RGB風扇,除了為主機帶來更好的散熱性能以外,還能讓玩家玩轉酷炫的RGB燈光效果,預留頂部兩個12cm風扇安裝位以及機箱背部也預留了1個RGB風扇安裝位。無論是散熱性能還是玩RGB光污染燈光,長城T600都能很好地支持使用。

          在細節方面,長城T600為玩家打造了個性的發光信仰LOGO燈,免工具硬盤的安裝讓玩家在安裝以及硬盤的時候得心應手;玻璃側板防震硅膠墊的設計可以更好地保護鋼化玻璃側板;布線硅膠保護圈理線方便美觀,簡簡單單幾個細節展現該機箱為游戲玩家而定制的真誠態度。

          長城T600采用了優質SGCC鍍鋅鋼板+鋼化玻璃+鋁板的材質組合,扎實的用料和精良的做工使得機箱不僅結構牢固,而且標配3個RGB風扇位用戶提供了周到的DIY玩法。玩家的挑選機箱的時候除了關注機箱外在的外觀之外,還要考慮機箱內在的設計以及兼容性,這樣才會省去組裝電腦時帶來不必要的麻煩,同時在安裝硬件的過程中更加得心應手。長城T600無論是外觀用料還是可DIY方面,都是可圈可點的,國慶期間想要組裝游戲主機的玩家不妨多多關注這款優秀的機箱。

          很多時候人都是屬于在矛盾中生存著,很多時候自己的需求往往都是矛盾的存在,對與DIY產品也是如此,很多時候的往往想攢建高端主機,但是高端硬件的尺寸也十分巨大,就導致要更大的機箱作為載體,這樣又導致機箱體型又十分碩大,機箱大了之后又很占地方,這一矛盾心態時常發生。但最近出現了一個系列的機箱產品就很好的解決這個問題,標準寬體又有強大的兼容性能,這便是鑫谷寬系列機箱產品,其中鑫谷寬寂靜音還附有靜音的功能。

          鑫谷寬寂機箱

          鑫谷寬寂靜音機箱為什么有那么好的兼容性能呢?那是因為其機箱采用全新的機箱五金進行設計,在機箱寬度方面直接高達的205MM,這也是只會出現全塔機箱的寬度,這一寬度衍生出更多優勢,比方說,背部走線空間,從普通的10MM左右直接直接升級到20MM,CPU散熱直接支持到了160MM,同時還很好的解決了水冷排與光效內存的兼容性問題。

          內部架構解析

          其機箱內部延續鑫谷ATX2.0機箱結構技術,設計有獨立的電源倉位,讓內部空間最大的同時,支持360MM的水冷排安裝,顯卡支持長度也高達330MM,電源安裝位方面也做了優化,直接可以達到180MM,加上ATX\M-ATX\ITX的主板兼容性能,無不凸顯其內部空間的最大化利用率。之外還讓其硬件與電源形成兩個分離風道互不干擾,更利于其硬件的使用壽命。

          五金結構解析

          其又一特色便是其靜音功能,鑫谷寬寂靜音機箱在箱體的四面均采用了深海高分子樹脂吸音棉,其超大的覆蓋率,然后這款產品輕松達到靜音效果,在是內部硬件滿載使用的時候也只能少量感覺到,如果普通機箱待機時所造成的噪音,甚至更少。

          強悍兼容能力

          鑫谷寬寂靜音機箱,無論是靜音效果還是機箱內部性能都十分的出眾,支持ATX、M-ATX、ITX主板安裝,顯卡支持到330M的長度,加上支持160MM CPU散熱器,同凸顯其兼容性能,所以這款產品對于硬件和環境有所追求的用戶都是一個很不錯的選擇。

          京東自營店:https://item.jd.com/4342689.html

          兆方數碼專營店:https://detail.tmall.com/item.htm?spm=a230r.1.14.223.ebb2eb25uF4Np&id=553271484930&ns=1&abbucket=5&sku_properties=5919063:6536025

          金河田銀狐箱外觀個性,整個機身采用全鋁設計,前面板的個性彎折設計,讓機箱更加靚麗,同時機箱的側板采用鋼化玻璃設計,適合玩家打造光污染平臺,現在這款機箱在京東售價899元,追求個性外觀的玩家不妨抓緊時間來選購這款高端全鋁機箱吧。

          (圖片來自京東商城)

          金河田銀狐機箱采用鋁合金主體搭配鋼化玻璃側板

          銀狐機箱前面板鏤空logo設計

          銀狐機箱采用了時尚的側透設計,雖然側透已經成為機箱的主流,但銀狐還是設計了與眾不同的側板,全側透的鋼化玻璃為不規則的形狀設計,可以更好地展示機箱內部的硬件平臺。

          銀狐機箱的棱角分明設計

          銀狐機箱I/O區布局

          機箱在前部設計了銀狐logo,頂前部則是機箱的I/O區,這里配置了開機鍵,音頻接口,兩個USB 2.0接口和一個USB 3.0接口,有很好的實用性。

          銀狐的PCI拓展位采用了和其他產品不同的設計,7條擴展槽位于機箱頂部,可以滿足玩家對硬件的擴展需要,不過在裝機的時候需要注意硬件安裝方向。

          金河田 銀狐

          [參考價格] 899元

          [經銷商] 京東

          不論從諾基亞的復蘇還是錘子的熱銷,都體現了人們對于具有工匠精神的優秀產品的追求,也從側面反映出當前消費市場上“匠心”缺失的問題。不過好在匠心并沒有離開我們,它仍然被一些優秀的企業所堅持,一直陪在我們身邊。現在先馬工匠5號已經在京東上架僅售169元,心動的玩家抓緊時間來看看吧!

          圖片來自京東商城

          先馬工匠5號機箱

          其實這些匠心之物能夠打動人的原因,除了產品本身精工細作的優秀品質之外,還有一個原因就是用戶能夠通過這些獨具匠心的產品感受到設計者的匠人情懷。特別是在這個略顯浮躁而匠心缺失的時代,能夠發現和遇到打心眼里喜歡的匠心產品無疑是一件令人非常愉快的事情。

          用料扎實

          對于PC玩家來說,是否有這樣令人感受到工匠情懷的匠心之物呢?當然有。國產機箱電源的標志性品牌先馬一直致力于為玩家提供高性價比的優質產品,也將工匠精神貫穿在產品的設計和制造過程當中,即使百元級的平民機箱也有工匠系列這種在同價位表現優秀的產品供消費者選擇,近期推出的工匠5機箱又是一款值得購買的匠心產品。

          前面板一體彎折工藝

          前面板RGB炫酷燈光設計

          或許有人覺得百元機箱談工匠精神言過其實,但在先馬工匠5機箱上,當編輯看到全金屬材質、與機箱頂蓋一體成型的面板、呼吸式/閃爍模式的面板RGB燈光、兩側全包圍防EMI輻射側板和易拉式風扇安裝以及在做工細節上的用心處理之后,仿佛在先馬工匠5機箱上看到了當年諾基亞在產品設計與制造上的工匠精神,在這個貨幣貶值的的時代,百元機箱能做到這種程度,除了信仰和匠心之外真的再找不出其他的理由。

          豐富的內部架構

          盡管工匠5機箱并不豪華,但這并不影響它成為先馬為普通玩家精心設計的一款優質機箱。在保證足夠好的設計與做工用料的同時,工匠5提供了包括ATX/Micro ATX主板、2個2.5英寸SSD、3個3.5英寸HDD、350mm限長顯卡、167mm高CPU散熱器和1個USB3.0、2個USB2.0前置接口,加上對流式散熱風道和背板走線設計,為普通玩家帶來了對主流硬件平臺良好的兼容、散熱與擴展能力。這種針對目標用戶群體的需求設計和兼容、散熱的細節處理,體現出先馬不論產品貴賤都能夠專業專注的工匠精神。

          不論產品定位高低,在設計和制造過程中都認真專注,打造出同等價位提供更加優質體驗的產品,這就是工匠情懷,而這正是先馬所一直堅持并為之努力的方向。

          先馬工匠5號機箱:https://item.jd.com/4515411.html

          至睿黑曜石機箱整體采用黑色的配色,沉穩大氣,同時大側透的設計也讓機箱更具時尚感,機箱的前面板為火山織紋金屬面板,手感和質感都非常不錯。現在這款機箱在京東售價279元,感興趣的玩家抓緊時間來選購吧!

          (圖片來自京東商城)

          至睿黑曜石機箱正面展示

          細節展示

          機箱后部展示

          機箱頂部

          機箱的側部和頂部的I/O區采用新類膚涂層,不僅防老化,還能讓手感更加出眾。同時頂部亮色的邊框,也讓機箱更具時尚感。

          頂部按壓式防塵網

          機箱前部散熱風扇

          頂部按壓式防塵網

          不僅如此,機箱的頂部還采用按壓式彈起的防塵網設計,非常方便玩家日常維護和安裝冷排。

          整機燈效效果圖(需加裝風扇)

          機箱標配了一枚RGB風扇(后置)、一枚黑框藍葉風扇(前置)、和一根軟磁性的RGB燈條,可以通過I/O區的RGB燈控鍵來進行燈光切換。

          I/O區 類膚涂層設計

          在I/O區內,機箱為玩家提供了開機鍵,RGB燈控鍵,2個USB 2.0接口以及1個USB 3.0接口,還有一組音頻接口,基本滿足玩家的日常使用需求。

          愛國者 月光寶盒曜

          anvas 線段兩端的樣式
          ●canvas 中, 是可以設置線段兩端的樣子的
          ●我們先來畫三個平行線


          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()
          
          // 第二個線段
          ctx.moveTo(100, 150)
          ctx.lineTo(200, 150)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()
          
          // 第三個線段
          ctx.moveTo(100, 200)
          ctx.lineTo(200, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()


          ●接下來, 我們開始設置兩端樣式
          語法: 工具箱.lineCap = '值'
          值 :
          => butt 無
          => round 圓
          => square 方


          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 兩端樣式設置為 butt
          ctx.lineCap = 'butt'
          
          ctx.stroke()
          ctx.beginPath()
          
          // 第二個線段
          ctx.moveTo(100, 150)
          ctx.lineTo(200, 150)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 兩端樣式設置為 round
          ctx.lineCap = 'round'
          
          ctx.stroke()
          ctx.beginPath()
          
          // 第三個線段
          ctx.moveTo(100, 200)
          ctx.lineTo(200, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 兩端樣式設置為 'square'
          ctx.lineCap = 'square'
          
          ctx.stroke()
          ctx.beginPath()



          ●square 和 round 會讓線段稍稍變長
          ●線段端點樣式的顏色會和線段顏色保持一致

          canvas 線段拐點的樣式
          ●canvas 在繪制線段拐角的時候, 會自動進行閉合拐角
          ●我們也可以通過設置, 來設置一下拐角的樣子
          ●先來繪制三個帶有拐角的線段

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 150)
          ctx.lineTo(100, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()
          
          // 第二個線段
          ctx.moveTo(200, 100)
          ctx.lineTo(300, 150)
          ctx.lineTo(200, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()
          
          // 第三個線段
          ctx.moveTo(300, 100)
          ctx.lineTo(400, 150)
          ctx.lineTo(300, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          ctx.stroke()
          ctx.beginPath()

          ●canvas 對于線段拐點默認的樣式就是尖角拐點
          ●我們可以進行一些設置來改變
          語法: 工具箱.lineJoin = '值'
          值:
          => miter 默認尖角拐點
          => round 創建圓角拐點
          => bevel 創建斜角拐點

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 150)
          ctx.lineTo(100, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 默認拐點
          ctx.lineJoin = 'miter'
          
          ctx.stroke()
          ctx.beginPath()
          
          // 第二個線段
          ctx.moveTo(200, 100)
          ctx.lineTo(300, 150)
          ctx.lineTo(200, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 圓角拐點
          ctx.lineJoin = 'round'
          
          ctx.stroke()
          ctx.beginPath()
          
          // 第三個線段
          ctx.moveTo(300, 100)
          ctx.lineTo(400, 150)
          ctx.lineTo(300, 200)
          ctx.lineWidth = 10
          ctx.strokeStyle = '#000'
          
          // 斜角拐點
          ctx.lineJoin = 'bevel'
          
          ctx.stroke()
          ctx.beginPath()


          canvas 填充
          ●在 canvas 中, 一旦你畫出封閉圖形以后
          ●我們不光可以描邊, 也可以進行填充, 也就是填滿顏色
          ●先來畫一個矩形吧


          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineTo(200, 200)
          ctx.lineTo(100, 200)
          ctx.lineWidth = 2
          ctx.strokeStyle = '#000'
          ctx.closePath()
          ctx.stroke()


          ●我們這里用的是描邊( 工具箱.stroke() )
          ●是按照痕跡把路線描繪下來
          ●在 canvas 內, 除了描邊, 還有一個叫做填充
          ●咱們再來一個矩形, 這次我們不進行描邊, 而是進行填充

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineTo(200, 200)
          ctx.lineTo(100, 200)
          
          // 3. 填充
          // 語法: 工具箱.fill()
          ctx.fill()


          ●這樣, 就會按照我們繪制的路線, 以填充的形式出現一個封閉圖形
          ●注意 : 填充的時候可以不進行圖形閉合, 會自動閉合圖形以后進行填充
          ●填充的時候也可以設置填充顏色的設置

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineTo(200, 200)
          ctx.lineTo(100, 200)
          
          // 3. 填充
          // 3-1. 填充顏色設置
          // 語法: 工具箱.fillStyle = '值'
          ctx.fillStyle = 'skyblue'
          // 3-2. 填充
          ctx.fill()


          ●填充是可以和描邊一起使用的

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制第一個線段
          // 第一個線段
          ctx.moveTo(100, 100)
          ctx.lineTo(200, 100)
          ctx.lineTo(200, 200)
          ctx.lineTo(100, 200)
          
          // 自動閉合圖形
          ctx.closePath()
          
          // 3. 描邊
          // 3-1. 設置描邊樣式
          ctx.lineWidth = 4
          ctx.strokeStyle = 'orange'
          // 3-2. 描邊
          ctx.stroke()
          
          // 4. 填充
          // 4-1. 填充顏色設置
          ctx.fillStyle = 'skyblue'
          // 4-2. 填充
          ctx.fill()


          canvas 的填充規則
          ●我們發現, 到現在為止, canvas 的繪制, 描邊, 填充都很簡單
          ●但是接下來的內容可能稍微復雜一些了
          ●我們要說一下 canvas 的填充規則
          ●我們管 canvas 的填充規則叫做 非零填充

          例子
          ●一下子可能說不明白, 我們先來看一個例子
          ●繪制一個 "回" 形
          ●注意一個細節 :
          ○我們繪制的過程
          ○里面的小正方形我們會按照 順時針 的方向繪制
          ○外面的大正方形我們也會按照 順時針 的方向繪制

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制里面的小正方形
          ctx.moveTo(200, 100)
          ctx.lineTo(300, 100)
          ctx.lineTo(300, 200)
          ctx.lineTo(200, 200)
          ctx.lineWidth = 2
          ctx.strokeStyle = '#000'
          ctx.stroke()
          
          // 3. 開始繪制外面的大正方形
          ctx.moveTo(150, 50)
          ctx.lineTo(350, 50)
          ctx.lineTo(350, 250)
          ctx.lineTo(150, 250)
          ctx.stroke()


          ●兩個正方形都是這個方向繪制的, 我們接下來把描邊的線去掉
          ●我們來進行一下填充看看

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制里面的小正方形
          ctx.moveTo(200, 100)
          ctx.lineTo(300, 100)
          ctx.lineTo(300, 200)
          ctx.lineTo(200, 200)
          // ctx.lineWidth = 2
          // ctx.strokeStyle = '#000'
          // ctx.stroke()
          
          // 3. 開始繪制外面的大正方形
          ctx.moveTo(150, 50)
          ctx.lineTo(350, 50)
          ctx.lineTo(350, 250)
          ctx.lineTo(150, 250)
          // ctx.stroke()
          
          // 4. 填充
          ctx.fill()


          ●我們發現, 兩個都被填充了
          ●這是因為, 在填充的時候, 就是會一次性把所有的內容都會填充好
          ●注意 :
          ○和是否閉合路徑 ( 工具箱.closePath() ) 沒有關系
          ○和里外正方形的繪制先后順序沒有關系
          ●那是怎么回事呢 ?

          例子
          ●先不管是怎么回事, 我們再來看一個例子
          ●還是繪制一個 "回" 形
          ●注意一個細節 :
          ○我們繪制的過程
          ○里面的小正方形我們會按照 逆時針 的方向繪制
          ○外面的大正方形我們也會按照 順時針 的方向繪制

          // 0. 獲取到頁面上的 canvas 標簽元素節點
          const canvasEle = document.querySelector('#canvas')
          
          // 1. 獲取當前這個畫布的工具箱
          const ctx = canvasEle.getContext('2d')
          
          // 2. 開始繪制里面的小正方形
          ctx.moveTo(200, 100)
          ctx.lineTo(200, 200)
          ctx.lineTo(300, 200)
          ctx.lineTo(300, 100)
          ctx.lineWidth = 2
          ctx.strokeStyle = '#000'
          ctx.stroke()
          
          // 3. 開始繪制外面的大正方形
          ctx.moveTo(150, 50)
          ctx.lineTo(350, 50)
          ctx.lineTo(350, 250)
          ctx.lineTo(150, 250)
          ctx.stroke()


          ●這回兩個矩形繪制的時候, 方向不一樣了
          ●我們再來填充一次試試看

          ●我們會發現, 和剛才填充出來的結果不一樣了
          ●這又是怎么回事呢 ?
          ●難道和順時針逆時針有關系嗎 ?

          非零填充
          ●其實我們的填充和順時針逆時針有關系, 但是不是簡單的順逆時針的問題
          ●概念 :
          ○從任何一個區域向畫布最外層移動
          ○按照經歷最短邊計算
          ○其中經歷的順時針的邊記錄為 +1
          ○經歷逆時針的邊記錄為 -1
          ○只要最終總和不為 零, 那么該區域填充
          ○如果最終總和為 零, 那么該區域不填充
          ●聽起來很麻煩, 咱們來畫布上看一下效果就好了
          ●這次我們繪制一個稍微復雜一些的圖形


          ●這是兩個矩形對接在一起, 一個是順時針繪制, 一個是逆時針繪制
          ●我們來分析一下看看
          ●首先, 最左側封閉圖形

          ○如果走最短的路線出來的話, 會經歷一條順時針的邊
          ○記錄為 +1
          ○最終為 +1
          ○所以該區域填充
          ●然后, 最右側封閉圖形


          ○經歷最短路線出來的話, 會經歷一條逆時針的邊
          ○記錄為 -1
          ○最終為 -1
          ○所以該區域填充
          ●最后, 中間的封閉圖形


          ○經歷最短路線出來的會, 必然會經歷一條順時針的邊和一條逆時針的邊
          ○順時針記錄為 +1
          ○逆時針記錄為 -1
          ○最終為 0
          ○所以該區域不填充
          ●此時我們對當前圖形進行填充后觀察


          ●這就是最后填充好的樣子


          主站蜘蛛池模板: 一区二区三区日本电影| 伊人色综合一区二区三区| 无码少妇一区二区三区芒果| 亚洲日韩精品无码一区二区三区| 国产成人无码AV一区二区在线观看| 亚洲毛片αv无线播放一区| 国产激情з∠视频一区二区| 亚洲福利一区二区| 无码人妻精品一区二区蜜桃| 精品理论片一区二区三区| 女人和拘做受全程看视频日本综合a一区二区视频 | 暖暖免费高清日本一区二区三区| 无码aⅴ精品一区二区三区浪潮| 亚洲欧美日韩国产精品一区| 无码人妻一区二区三区在线视频| 无码中文人妻在线一区二区三区| 自慰无码一区二区三区| 无码国产精品一区二区免费式芒果 | 日韩一区二区三区视频| 免费无码一区二区三区蜜桃| 一区二区在线电影| 日本免费一区二区三区最新| 一区二区三区在线观看免费| 亚洲国产老鸭窝一区二区三区| 国产色精品vr一区区三区| 亚洲成在人天堂一区二区| 久久国产精品无码一区二区三区| 中文字幕一精品亚洲无线一区 | 日本免费一区二区三区| 国产精品一区二区久久国产| 国产亚洲一区二区精品| 老熟女高潮一区二区三区| 无码国产精品一区二区免费16 | 无码人妻一区二区三区在线视频 | 好吊妞视频一区二区| 久久精品成人一区二区三区| 亚洲狠狠久久综合一区77777| 国产激情精品一区二区三区| 亚洲一区二区三区无码影院| 久久综合亚洲色一区二区三区 | 无码一区二区三区在线 |