精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Canvas實現一個大氣球送給你

開發 前端
近期在做一個氣球掛件的特效需求,值此契機,來跟大家分享一下如何利用canvas以及對應的數學知識構造一個栩栩如生的氣球。

[[423338]]

一、背景

近期在做一個氣球掛件的特效需求,值此契機,來跟大家分享一下如何利用canvas以及對應的數學知識構造一個栩栩如生的氣球。

二、實現

在實現這個看似是圓鼓鼓的氣球之前,先了解一下其實現思路,主要分為以下幾個部分:

  1. 實現球體部分;
  2. 實現氣球口子部分;
  3. 實現氣球的線部分;
  4. 進行顏色填充;
  5. 實現動畫;

氣球.PNG

2.1 球體部分實現

對于這樣的氣球的球體部分,大家都有什么好的實現思路的?相信大家肯定會有多種多樣的實現方案,我也是在看到某位大佬的效果后,感受到了利用四個三次貝塞爾曲線實現這個效果的妙處。為了看懂后續代碼,先了解一下三次貝塞爾曲線的原理。(注:引用了CSDN上某位大佬的文章,寫的很好,下圖引用于此)

三次貝塞爾曲線.gif

在上圖中P0為起始點、P3為終止點,P1和P2為控制點,其最終的曲線公式如下所示:

  1. B(t)=(1?t)^3 * P0+3t(1?t)^2 * P1+3t ^ 2(1?t) * P2+t ^ 3P3, t∈[0,1] 

上述已經列出了三次貝塞爾曲線的效果圖和公式,但是通過這個怎么跟我們的氣球掛上鉤呢?下面通過幾張圖就理解了:

如上圖所示,就是實現整個氣球球體的思路,具體解釋如下所示:

  1. A圖中起始點為p1,終止點為p2,控制點為c1、c2,讓兩個控制點重合,繪制出的效果并不是很像氣球的一部分,此時就要通過改變控制點來改變其外觀;
  2. 改變控制點c1、c2,c1中y值不變,減小x值;c2中x值不變,增大y值(注意canvas中坐標方向即可),改變后就得到了圖B的效果,此時就跟氣球外觀很像了;
  3. 緊接著按照這個方法就可以實現整個的氣球球體部分的外觀。
  1. function draw() { 
  2.     const canvas = document.getElementById('canvas'); 
  3.     const ctx = canvas.getContext('2d'); 
  4.  
  5.     ctx.translate(250, 250); 
  6.     drawCoordiante(ctx); 
  7.     ctx.save(); 
  8.     ctx.beginPath(); 
  9.     ctx.moveTo(0, -80); 
  10.     ctx.bezierCurveTo(45, -80, 80, -45, 80, 0); 
  11.     ctx.bezierCurveTo(80, 85, 45, 120, 0, 120); 
  12.     ctx.bezierCurveTo(-45, 120, -80, 85, -80, 0); 
  13.     ctx.bezierCurveTo(-80, -45, -45, -80, 0, -80); 
  14.     ctx.stroke(); 
  15.     ctx.restore(); 
  16.  
  17. function drawCoordiante(ctx) { 
  18.     ctx.beginPath(); 
  19.     ctx.moveTo(-120, 0); 
  20.     ctx.lineTo(120, 0); 
  21.     ctx.moveTo(0, -120); 
  22.     ctx.lineTo(0, 120); 
  23.     ctx.closePath(); 
  24.     ctx.stroke(); 

2.2 口子部分實現

口子部分可以簡化為一個三角形,效果如下所示:

  1. function draw() { 
  2.     const canvas = document.getElementById('canvas'); 
  3.     const ctx = canvas.getContext('2d'); 
  4.  
  5.     …… 
  6.  
  7.     ctx.save(); 
  8.     ctx.beginPath(); 
  9.     ctx.moveTo(0, 120); 
  10.     ctx.lineTo(-5, 130); 
  11.     ctx.lineTo(5, 130); 
  12.     ctx.closePath(); 
  13.     ctx.stroke(); 
  14.     ctx.restore(); 

2.3 線部分實現

線實現的比較簡單,就用了一段直線實現

  1. function draw() { 
  2.     const canvas = document.getElementById('canvas'); 
  3.     const ctx = canvas.getContext('2d'); 
  4.  
  5.     …… 
  6.  
  7.     ctx.save(); 
  8.     ctx.beginPath(); 
  9.     ctx.moveTo(0, 120); 
  10.     ctx.lineTo(0, 300); 
  11.     ctx.stroke(); 
  12.     ctx.restore(); 

2.4 進行填充

氣球部分的填充用了圓形漸變效果,相比于純色來說更加漂亮一些。

  1. function draw() { 
  2.     const canvas = document.getElementById('canvas'); 
  3.     const ctx = canvas.getContext('2d'); 
  4.  
  5.     ctx.fillStyle = getBalloonGradient(ctx, 0, 0, 80, 210); 
  6.     …… 
  7.      
  8.  
  9. function getBalloonGradient(ctx, x, y, r, hue) { 
  10.     const grd = ctx.createRadialGradient(x, y, 0, x, y, r); 
  11.     grd.addColorStop(0, 'hsla(' + hue + ', 100%, 65%, .95)'); 
  12.     grd.addColorStop(0.4, 'hsla(' + hue + ', 100%, 45%, .85)'); 
  13.     grd.addColorStop(1, 'hsla(' + hue + ', 100%, 25%, .80)'); 
  14.     return grd; 

2.5 動畫效果及整體代碼

上述流程已經將一個靜態的氣球部分繪制完畢了,要想實現動畫效果只需要利用requestAnimationFrame函數不斷循環調用即可實現。下面直接拋出整體代碼,方便同學們觀察效果進行調試,整體代碼如下所示:

  1. let posX = 225; 
  2. let posY = 300; 
  3. let points = getPoints(); 
  4. draw(); 
  5.  
  6. function draw() { 
  7.     const canvas = document.getElementById('canvas'); 
  8.     const ctx = canvas.getContext('2d'); 
  9.     ctx.clearRect(0, 0, canvas.width, canvas.height); 
  10.     if (posY < -200) { 
  11.         posY = 300; 
  12.         posX += 300 * (Math.random() - 0.5); 
  13.         points = getPoints(); 
  14.     } 
  15.     else { 
  16.         posY -= 2; 
  17.     } 
  18.     ctx.save(); 
  19.     ctx.translate(posX, posY); 
  20.     drawBalloon(ctx, points); 
  21.     ctx.restore(); 
  22.  
  23.     window.requestAnimationFrame(draw); 
  24.  
  25. function drawBalloon(ctx, points) { 
  26.     ctx.scale(points.scale, points.scale); 
  27.     ctx.save(); 
  28.     ctx.fillStyle = getBalloonGradient(ctx, 0, 0, points.R, points.hue); 
  29.     // 繪制球體部分 
  30.     ctx.moveTo(points.p1.x, points.p1.y); 
  31.     ctx.bezierCurveTo(points.pC1to2A.x, points.pC1to2A.y, points.pC1to2B.x, points.pC1to2B.y, points.p2.x, points.p2.y); 
  32.     ctx.bezierCurveTo(points.pC2to3A.x, points.pC2to3A.y, points.pC2to3B.x, points.pC2to3B.y, points.p3.x, points.p3.y); 
  33.     ctx.bezierCurveTo(points.pC3to4A.x, points.pC3to4A.y, points.pC3to4B.x, points.pC3to4B.y, points.p4.x, points.p4.y); 
  34.     ctx.bezierCurveTo(points.pC4to1A.x, points.pC4to1A.y, points.pC4to1B.x, points.pC4to1B.y, points.p1.x, points.p1.y); 
  35.  
  36.     // 繪制氣球鈕部分 
  37.     ctx.moveTo(points.p3.x, points.p3.y); 
  38.     ctx.lineTo(points.knowA.x, points.knowA.y); 
  39.     ctx.lineTo(points.knowB.x, points.knowB.y); 
  40.     ctx.fill(); 
  41.     ctx.restore(); 
  42.  
  43.     // 繪制線部分 
  44.     ctx.save(); 
  45.     ctx.strokeStyle = '#000000'
  46.     ctx.lineWidth = 1; 
  47.     ctx.beginPath(); 
  48.     ctx.moveTo(points.p3.x, points.p3.y); 
  49.     ctx.lineTo(points.lineEnd.x, points.lineEnd.y); 
  50.     ctx.stroke(); 
  51.     ctx.restore(); 
  52.  
  53. function getPoints() { 
  54.     const offset = 35; 
  55.     return { 
  56.         scale: 0.3 + Math.random() / 2, 
  57.         hue: Math.random() * 255, 
  58.         R: 80, 
  59.         p1: { 
  60.             x: 0, 
  61.             y: -80 
  62.         }, 
  63.         pC1to2A: { 
  64.             x: 80 - offset, 
  65.             y: -80 
  66.         }, 
  67.         pC1to2B: { 
  68.             x: 80, 
  69.             y: -80 + offset 
  70.         }, 
  71.         p2: { 
  72.             x: 80, 
  73.             y: 0 
  74.         }, 
  75.         pC2to3A: { 
  76.             x: 80, 
  77.             y: 120 - offset 
  78.         }, 
  79.         pC2to3B: { 
  80.             x: 80 - offset, 
  81.             y: 120 
  82.         }, 
  83.         p3: { 
  84.             x: 0, 
  85.             y: 120 
  86.         }, 
  87.         pC3to4A: { 
  88.             x: -80 + offset, 
  89.             y: 120 
  90.         }, 
  91.         pC3to4B: { 
  92.             x: -80, 
  93.             y: 120 - offset 
  94.         }, 
  95.         p4: { 
  96.             x: -80, 
  97.             y: 0 
  98.         }, 
  99.         pC4to1A: { 
  100.             x: -80, 
  101.             y: -80 + offset 
  102.         }, 
  103.         pC4to1B: { 
  104.             x: -80 + offset, 
  105.             y: -80 
  106.         }, 
  107.         knowA: { 
  108.             x: -5, 
  109.             y: 130 
  110.         }, 
  111.         knowB: { 
  112.             x: 5, 
  113.             y: 130 
  114.         }, 
  115.         lineEnd: { 
  116.             x: 0, 
  117.             y: 250 
  118.         } 
  119.     }; 
  120.  
  121. function getBalloonGradient(ctx, x, y, r, hue) { 
  122.     const grd = ctx.createRadialGradient(x, y, 0, x, y, r); 
  123.     grd.addColorStop(0, 'hsla(' + hue + ', 100%, 65%, .95)'); 
  124.     grd.addColorStop(0.4, 'hsla(' + hue + ', 100%, 45%, .85)'); 
  125.     grd.addColorStop(1, 'hsla(' + hue + ', 100%, 25%, .80)'); 
  126.     return grd; 

 

責任編輯:武曉燕 來源: 前端點線面
相關推薦

2022-12-22 08:22:17

Python圖像圖像處理

2017-08-29 15:34:10

CanvasWASM算法

2017-11-27 13:39:29

Python大數據搜索引擎

2017-12-27 14:51:12

Kotlin谷歌Java

2018-07-03 15:20:36

Promise函數借錢

2020-09-06 22:59:35

Linux文件命令

2021-04-15 11:37:47

NumpyPython代碼

2018-05-04 09:14:09

Git技巧shell命令

2021-05-07 07:59:52

WebFluxSpring5系統

2025-05-12 08:55:00

2012-05-30 09:40:55

Linux鍋爐

2018-06-16 08:35:57

UnixLinux命令

2020-12-20 10:07:57

Canvas圖形驗證碼javascript

2014-04-14 15:54:00

print()Web服務器

2023-01-30 16:21:24

Linux外觀

2017-06-05 12:06:00

2019-02-11 11:16:13

2021-02-14 19:24:45

SpringRegistrar對象

2021-06-25 10:38:05

JavaScript編譯器前端開發

2022-02-28 00:14:30

人工智能數據機器學習
點贊
收藏

51CTO技術棧公眾號

国产精品嫩草影院在线看| a视频在线免费看| 久久国产直播| www.亚洲人.com| 国产成人精品一区二区在线小狼| 国产黄大片在线观看| 国产喂奶挤奶一区二区三区 | 麻豆免费在线| 久久精品日韩一区二区三区| 成人激情视频网| 日韩毛片在线播放| 97精品一区| 日韩成人免费视频| 一级黄色在线播放| 成人午夜视屏| 亚洲综合精品久久| 亚洲日本精品| 亚洲欧美自偷自拍| 国产一区二区精品在线观看| 欧美一区二粉嫩精品国产一线天| xxxx日本少妇| 国产亚洲欧美日韩在线观看一区二区| 日韩欧美一卡二卡| 中文字幕av专区| 亚洲优女在线| 亚洲一二三区视频在线观看| 艳色歌舞团一区二区三区| 婷婷视频在线观看| 国产成人自拍网| 国产自产女人91一区在线观看| 日韩欧美亚洲视频| 欧美在线日韩| 色悠悠久久久久| 国产精品1000部啪视频| 99re91这里只有精品| 在线观看视频一区| 国产三区在线视频| xxx.xxx欧美| 一区二区成人在线观看| 在线观看欧美一区| jizz在线观看| 国产欧美一区二区精品忘忧草 | 久久不见久久见免费视频7| 精品美女在线播放| 日本高清免费在线视频| 日韩欧国产精品一区综合无码| 色偷偷88欧美精品久久久| 日韩欧美一区三区| 草草在线观看| 香蕉成人伊视频在线观看| 国产 欧美 日韩 一区| 国产区在线看| 日韩三区免费| 国产v片在线观看| 欧美男同视频网| 日韩av在线网页| 你懂的在线观看网站| 91精品日本| 欧美va在线播放| 无码人妻aⅴ一区二区三区玉蒲团| 国产精品视频首页| 日韩精品中文字幕在线一区| 色哟哟在线观看视频| 精品一区二区三区中文字幕视频 | 在线视频一区二区三区四区| 国产日韩欧美一区在线| 欧洲s码亚洲m码精品一区| 久久国产黄色片| 日韩高清不卡一区二区三区| 国产精品视频午夜| 伊人网av在线| 国产精品18久久久久久久网站| 2019国产精品视频| 天堂网2014av| 国产人成亚洲第一网站在线播放 | 免费黄色在线网站| 亚洲精品福利视频网站| 欧美一区二区激情| 天天免费亚洲黑人免费| 欧美日韩一区三区四区| 99999精品| 女人抽搐喷水高潮国产精品| 亚洲欧美日韩在线高清直播| jizzjizzjizz国产| 欧美精品18| 日av在线播放中文不卡| 中文字幕一区二区三区四区免费看| 捆绑变态av一区二区三区| 亚洲综合av影视| 偷拍自拍在线| 综合激情成人伊人| 久色视频在线播放| 日韩大陆av| 亚洲国产欧美久久| 欧美a在线播放| 激情欧美国产欧美| 国产精品日韩专区| 天堂成人在线视频| 一区在线观看视频| 欧美在线观看www| 四虎影视成人精品国库在线观看 | 大乳在线免费观看| 亚洲综合免费观看高清完整版| 成年人黄色片视频| 51亚洲精品| 在线观看不卡av| 成人免费看片98| 久久电影网电视剧免费观看| 国产欧美日韩一区| 欧美一级二级三级区| 丰满岳妇乱一区二区三区| 香蕉视频999| 国产一区不卡| 2018国产精品视频| 午夜免费福利视频| 国产精品欧美一级免费| 又粗又黑又大的吊av| 精品一区二区三区四区五区 | 日韩影视一区二区三区| 激情婷婷欧美| 亚洲xxxx在线| 日本中文字幕在线视频| 91国偷自产一区二区三区观看| 中文字幕1区2区| 天天精品视频| 国产精品第一区| 日本免费不卡| 婷婷国产在线综合| 伊人网综合视频| 亚洲一级高清| 亚洲综合在线小说| 免费日本一区二区三区视频| 欧美私人免费视频| 国产jk精品白丝av在线观看| 国产精品久久国产愉拍| 国产精品久久久对白| www.在线视频| 欧美一区二区久久久| www.xx日本| 理论电影国产精品| 亚洲高清不卡一区| 亚洲精品555| 国产一区二区三区在线| 无码任你躁久久久久久久| 91亚洲精华国产精华精华液| 国产一区二区三区小说| 成人激情自拍| 高清欧美电影在线| 天天综合网在线| 无吗不卡中文字幕| 亚洲黄色在线网站| 久久久久免费| 无遮挡亚洲一区| 成人福利一区二区| 色噜噜狠狠狠综合曰曰曰| 在线播放精品视频| 最近中文字幕一区二区三区| 日韩在线一区视频| 欧美fxxxxxx另类| 亚洲综合在线小说| a国产在线视频| 日韩精品极品在线观看播放免费视频 | 成人乱码一区二区三区 | 精品久久ai| 97视频在线观看亚洲| 四虎在线免费看| 国产二区三区在线| 神马久久高清| 99久久久精品| 女人另类性混交zo| sis001亚洲原创区| www精品美女久久久tv| 奇米精品一区二区三区| 欧美极品在线观看| 国产精品羞羞答答| 91中文在线| 精品成人一区二区| 国产嫩bbwbbw高潮| 国产精品无码永久免费888| 九九九九九国产| 国内精品久久久久久久影视麻豆| 国产亚洲第一区| 亚洲高清黄色| 久久国产色av| 天天操天天干天天爱| 色94色欧美sute亚洲13| 97在线观看视频免费| 成人午夜激情影院| 看欧美ab黄色大片视频免费| 亚洲一级毛片| 久久婷婷开心| crdy在线观看欧美| 性欧美长视频免费观看不卡| www.亚洲视频| 亚洲大胆人体视频| 亚洲天堂网在线观看视频| 亚洲一二三四区| 影音先锋制服丝袜| 成人激情视频网站| 国产三级三级看三级| 亚洲高清在线| 亚洲欧美久久234| 青青草这里只有精品| 91免费高清视频| 88xx成人免费观看视频库| 欧美激情三级免费| 免费黄网在线观看| 亚洲视频电影图片偷拍一区| 丰满人妻熟女aⅴ一区| 欧美在线视频不卡| 91在线看视频| 一区二区三区日韩在线观看| 亚洲一级片在线播放| 不卡av在线免费观看| 亚洲自拍第三页| 久久精品成人| 国产素人在线观看| 欧美极品一区二区三区| 中文字幕在线观看一区二区三区| 亚洲最好看的视频| 亚洲综合一区二区| 日本精品视频一区二区| 亚洲精品日韩av| 午夜av在线免费观看 | 97在线日本国产| 91九色对白| 中文字幕精品亚洲| 精品系列免费在线观看| 欧美牲交a欧美牲交| 一本加勒比波多野结衣| 亚洲人成网www| 成人做爰66片免费看网站| 精品女同一区二区三区在线观看| 18久久久久久| 国产乱码精品一区二三赶尸艳谈| 欧美www在线| 欧美成人福利在线观看| 娇妻被老王脔到高潮失禁视频| 91超碰国产精品| 亚洲高清123| 欧美一区电影| 视频一区在线免费观看| 欧美日韩播放| 青青草成人网| 三区四区不卡| 婷婷久久五月天| 91综合在线| 在线一区高清| 91不卡在线观看| 久久久久久久久久伊人| 在线国产一区| 国产乱子伦精品视频| 欧美日韩国产亚洲一区| 免费观看亚洲视频| 欧美色图首页| 免费一级特黄特色毛片久久看| 日韩午夜激情| 日韩欧美xxxx| 久久成人精品无人区| 蜜桃福利午夜精品一区| 国产在线观看一区二区| 色哟哟免费视频| 成人国产精品免费观看| 久久人人妻人人人人妻性色av| 91丨porny丨最新| 国产精品扒开腿做爽爽| 中国av一区二区三区| 国产免费久久久久| 亚洲午夜国产一区99re久久| 日韩精品一卡二卡| 91黄视频在线观看| 91av久久久| 亚洲精品一区在线观看| 瑟瑟在线观看| 精品国产一区二区三区久久久狼 | 欧美韩日一区二区三区四区| 羞羞在线观看视频| 亚洲国产成人精品视频| www.国产com| 在线综合亚洲欧美在线视频| 成人免费观看在线视频| 亚洲视频电影图片偷拍一区| 黄a在线观看| 热99精品里视频精品| www.欧美| 欧美精品久久久| 中文字幕亚洲综合久久五月天色无吗''| 精品国产av无码一区二区三区| 久久久亚洲人| 奇米777在线| 久久久久久久综合狠狠综合| 欧美在线视频第一页| 欧美视频一二三| 国产麻豆免费观看| 亚洲乱码av中文一区二区| 国产精品久久久久久福利| 日韩理论电影院| 先锋影音一区二区三区| 亚洲特级毛片| 午夜两性免费视频| www.亚洲色图.com| 在线免费看av网站| 色欧美88888久久久久久影院| 精品国产av一区二区三区| 亚洲欧美综合图区| 日本高清成人vr专区| 国产精品欧美一区二区三区奶水 | 欧美一区二区视频在线观看2020| 日韩中文字幕免费在线观看| 深夜成人在线观看| 亚洲校园激情春色| 高清视频一区| 国产精品传媒精东影业在线| 国产日产欧美视频| 国产精品一级片在线观看| 日本人亚洲人jjzzjjz| 五月天中文字幕一区二区| 99久久婷婷国产一区二区三区| 亚洲午夜av久久乱码| 特级西西人体4444xxxx| 免费a级毛片在线播放| 亚洲不卡在线观看| 午夜精品久久久久久久久久久久久蜜桃| 欧美三区在线视频| 天天爽夜夜爽夜夜爽| 欧美国产精品日韩| 国产精品久久久久久久久久久久久久久 | 日韩国产一区久久| 亚洲美女91| 久久久无码人妻精品无码| 亚洲欧洲日韩一区二区三区| 无码免费一区二区三区| 亚洲精品综合精品自拍| av在线最新| 激情视频一区二区| 亚洲激情二区| 亚洲一区和二区| 有码一区二区三区| 国产又粗又猛视频免费| 在线观看国产欧美| 欧美日韩精品一区二区三区视频| 乱色588欧美| 美女网站久久| 久久av无码精品人妻系列试探| 精品免费在线视频| 色久视频在线播放| 日韩美女中文字幕| 精品久久综合| 亚洲免费一级视频| 国产精品另类一区| 国产又粗又猛又爽又黄的| 久久综合久久美利坚合众国| 亚洲精品伊人| 久久综合亚洲精品| 成人黄色网址在线观看| 亚洲 欧美 视频| 亚洲欧美中文日韩在线v日本| 欧美日韩美女| 亚洲在线观看一区| 国产一区二区福利视频| 欧美被狂躁喷白浆精品| 亚洲精品一区二区三区四区高清 | 精品久久久久一区二区三区| 国产91免费看片| 日韩午夜电影网| 99精品视频免费版的特色功能| 樱桃国产成人精品视频| 手机在线免费看片| 精品中国亚洲| 日韩国产在线看| 成人免费在线| 国产精品.com| 久久九九国产| 欧美性生交大片| 欧美一区二区三区啪啪| 不卡视频观看| 亚洲成人自拍| 国产寡妇亲子伦一区二区| 日韩三级免费看| 中文字幕国内精品| www.av导航| 激情综合网最新| 国产成人亚洲综合| 伊人久久精品| 青青青青草视频| 久久九九全国免费| 国产毛片久久久久| 欧美性做爰毛片| 四季av一区二区三区免费观看 | 国产真实乱偷精品视频免| 国产中文字幕免费| 在线观看视频99| 久久视频在线观看| 午夜免费看毛片| 天天亚洲美女在线视频| 免费黄色在线网站| 欧美一区视久久| 国产91高潮流白浆在线麻豆| 欧美特级黄色片| 久久青草精品视频免费观看|