亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

基于canvas使用貝塞爾曲線平滑擬合折線段的方法

2024-08-26 00:20:18
字體:
來源:轉載
供稿:網(wǎng)友

寫在最前

本次分享一下在canvas中將繪制出來的折線段的棱角“磨平”,也就是通過貝塞爾曲線穿過各個描點來代替原有的折線圖。

為什么要平滑擬合折線段

先來看下Echarts下折線圖的渲染效果:

canvas,貝塞爾曲線,平滑擬合折線段

一開始我沒注意到其實這個折線段是曲線穿過去的,只認為是單純的描點繪圖,所以起初我實現(xiàn)的“簡(丑)易(陋)”版本是這樣的:

canvas,貝塞爾曲線,平滑擬合折線段

不要關注樣式,重點就是實現(xiàn)之后才發(fā)現(xiàn)看起來人家Echarts的實現(xiàn)描點非常的圓滑,也由此引發(fā)了之后的探討。怎么有規(guī)律的畫平滑曲線?

效果圖

先來看下最終模仿的實現(xiàn):

因為我也不知道Echarts內(nèi)部怎么實現(xiàn)的(逃

canvas,貝塞爾曲線,平滑擬合折線段

canvas,貝塞爾曲線,平滑擬合折線段

看起來已經(jīng)非常圓潤了,和我們最初的設想十分接近了。再看下曲線是否穿過了描點:

canvas,貝塞爾曲線,平滑擬合折線段

好的!結果很明顯現(xiàn)在來重新看下我們的實現(xiàn)方式。

實現(xiàn)過程

  1. 繪制折線圖
  2. 貝塞爾曲線平滑擬合

模擬數(shù)據(jù)

var data = [Math.random() * 300];        for (var i = 1; i < 50; i++) { //按照echarts            data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));        }        option = {            canvas:{                id: 'canvas'            },            series: {                name: '模擬數(shù)據(jù)',                itemStyle: {                    color: 'rgb(255, 70, 131)'                },                areaStyle: {                    color: 'rgb(255, 158, 68)'                },                data: data            }        };

繪制折線圖

首先初始化一個構造函數(shù)來放置需要用到的數(shù)據(jù):

function LinearGradient(option) {    this.canvas = document.getElementById(option.canvas.id)    this.ctx = this.canvas.getContext('2d')    this.width = this.canvas.width    this.height = this.canvas.height    this.tooltip = option.tooltip    this.title = option.text    this.series = option.series //存放模擬數(shù)據(jù)}

繪制折線圖:

LinearGradient.prototype.draw1 = function() { //折線參考線    ...     //要考慮到canvas中的原點是左上角,    //所以下面要做一些換算,    //diff為x,y軸被數(shù)據(jù)最大值和最小值的取值范圍所平分的等份。    this.series.data.forEach(function(item, index) {        var x = diffX * index,            y = Math.floor(self.height - diffY * (item - dataMin))        self.ctx.lineTo(x, y) //繪制各個數(shù)據(jù)點    })    ...}

貝塞爾曲線平滑擬合

貝塞爾曲線的關鍵點在于控制點的選擇,這個網(wǎng)站可以動態(tài)的展現(xiàn)控制點不同而繪制的不同的曲線。而對于控制點的計算。。作者還是選擇了百度一下畢竟數(shù)學不好:)。具體算法有興趣的同學可以深入了解下,現(xiàn)在直接說下計算控制點的結論。

canvas,貝塞爾曲線,平滑擬合折線段

上面的公式涉及到四個坐標點,當前點,前一個點以及后兩個點,而當坐標值為下圖展示的時候繪制出來的曲線如下所示:

canvas,貝塞爾曲線,平滑擬合折線段

不過會有一個問題就是起始點和最后一個點不能用這個公式,不過那篇文章也給出了邊界值的處理辦法:

canvas,貝塞爾曲線,平滑擬合折線段

所以在將折線換成平滑曲線的時候,將邊界值以及其他控制點計算好之后代入到貝塞爾函數(shù)中就完成了:

//核心實現(xiàn)this.series.data.forEach(function(item, index) { //找到前一個點到下一個點中間的控制點    var scale = 0.1 //分別對于ab控制點的一個正數(shù),可以分別自行調(diào)整    var last1X = diffX * (index - 1),        last1Y = Math.floor(self.height - diffY * (self.series.data[index - 1] - dataMin)),        //前一個點坐標        last2X = diffX * (index - 2),        last2Y = Math.floor(self.height - diffY * (self.series.data[index - 2] - dataMin)),        //前兩個點坐標        nowX = diffX * (index),        nowY = Math.floor(self.height - diffY * (self.series.data[index] - dataMin)),        //當期點坐標        nextX = diffX * (index + 1),        nextY = Math.floor(self.height - diffY * (self.series.data[index + 1] - dataMin)),        //下一個點坐標        cAx = last1X + (nowX - last2X) * scale,        cAy = last1Y + (nowY - last2Y) * scale,        cBx = nowX - (nextX - last1X) * scale,        cBy = nowY - (nextY - last1Y) * scale     if(index === 0) {        self.ctx.lineTo(nowX, nowY)        return    } else if(index ===1) {        cAx = last1X + (nowX - 0) * scale        cAy = last1Y + (nowY - self.height) * scale     } else if(index === self.series.data.length - 1) {        cBx = nowX - (nowX - last1X) * scale        cBy = nowY - (nowY - last1Y) * scale    }         self.ctx.bezierCurveTo(cAx, cAy, cBx, cBy, nowX, nowY);        //繪制出上一個點到當前點的貝塞爾曲線    })

由于我每次遍歷的點都是當前點,但是文章中給出的公式是計算會知道下一個點的控制點算法,故在代碼實現(xiàn)中我將所有點的計算挪前了一位。當index = 0時也就是初始點是不需要曲線繪制的,因為我們繪制的是從前一個點到當前點的曲線,沒有到0的曲線需要繪制。從index = 1開始我們就可以正常開始繪制,從0到1的曲線,由于index = 1時是沒有在他前面第二個點的故其屬于邊界值點,也就是需要特殊進行計算,以及最后一個點。其余均按照正常公式算出AB的xy坐標代入貝塞爾函數(shù)即可。

最后

源代碼見這里

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
97精品一区二区三区| 日本卡一卡2卡3卡4精品卡网站| 日韩一区二区三区在线免费观看| 91久久久久| 成人午夜电影网站| 99欧美视频| 色视频www在线播放国产人成| 波多野结衣综合网| 可以在线看的av| 色综合视频一区二区三区日韩| 亚洲人成电影在在线观看网色| 欧美午夜激情影院| 亚洲线精品一区二区三区| 蜜臀久久99精品久久久无需会员| 成人乱码一区二区三区av| 亚洲影视一区二区三区| 国产91九色视频| 女同一区二区三区| 亚洲综合色视频在线观看| 久久久久久久久免费视频| 热久久久久久久久| 久久色中文字幕| 亚洲欧洲日本在线| 天堂一区二区三区| 8848成人影院| 亚洲精品网站在线播放gif| 热re66久久精品国产99热| 欧美激情在线一区| 在线观看亚洲区| 日本www视频在线观看| 在线能看的av| 日本资源在线| 亚洲欧美自拍偷拍色图| 国产三级按摩推拿按摩| 精品乱码一区内射人妻无码| 黑料不打烊so导航| 亚洲综合在线免费观看| 久草在线成人| 久久91亚洲人成电影网站| 人妻内射一区二区在线视频| 国产精品无码专区在线观看| 欧美一区二区免费观在线| 性欧美xxx极品另类| 国产精品一区牛牛影视| 国产精品国产三级国产aⅴ中文| 成人午夜视频免费看| 奇米影视在线99精品| 97精品人妻一区二区三区蜜桃| 色视频欧美一区二区三区| av大大超碰在线| 做a视频在线观看| 不卡一区二区中文字幕| 波多野结衣欲乱| 激情综合电影网| 国产高清不卡av| 日韩伦理精品| 日韩欧美不卡在线| 天堂av在线免费观看| 日韩亚洲欧美中文在线| 亚洲男人天堂2023| 国产精品无码无卡无需播放器| 日产精品久久久久久久| 国产黄色免费电影| 97不卡在线视频| 国产在线精品免费| 天堂在线中文| 中文字幕国产专区| 最新国产精品视频| 91一区二区三区在线观看| 日韩欧美在线观看一区二区三区| 国产精品正在播放| 久久美女免费视频| 欧美激情啊啊啊| 99久精品国产| 影音先锋男人资源站| 国产精品久久久久久av| 黄色的毛片免费| 国产一区二区久久| 久久久久久免费网| 欧美乱强性伦xxxxx| 精品伊人久久久久7777人| 亚洲视频精选| av片中文字幕| 日本一区二区视频在线观看| 亚洲女同在线| 久久久不卡网国产精品一区| 欧美高清视频一二三区| 亚洲大香人伊一本线| xxxxx日韩| 国产精品videossex国产高清| 中文字幕av一区二区三区佐山爱| 色一情一乱一伦一区二区三区日本| 少妇精品久久久久久久久久| 91精品啪在线观看国产| 九色porn蝌蚪| av2020不卡| 一区二区三区四区视频精品免费| 精品国产成人亚洲午夜福利| 久久在精品线影院精品国产| 久久99精品国产91久久来源| 成人h动漫精品一区二区器材| 伊人久久大香线蕉av不卡| 视频一区视频二区国产精品| 亚洲第一综合天堂另类专| gogogo高清在线观看免费完整版| 欧美另类在线播放| 久久久资源网| 人妻少妇精品无码专区| 日日干夜夜骑| 国产伦一区二区| 一区二区三区四区日韩| 久久久精品2019中文字幕之3| 国内自拍欧美激情| 图片区小说区国产精品视频| 日韩国产精品亚洲а∨天堂免| 交换国产精品视频一区| 在线播放毛片| 成人黄色影片在线| 欧美喷潮久久久xxxxx| 波多野结衣中文字幕在线| 亚洲美女视频在线观看| 国产91aaa| 国产精品一区二区婷婷| 国产精品无码电影| 亚洲精品www久久久| 亚洲香蕉视频| 亚洲va男人天堂| 无码小电影在线观看网站免费| 国产无精乱码一区二区三区| 中文字幕欧美专区| 亚洲一区二区三区精品动漫| 国产综合在线看| 在线电影一区二区| 午夜激情福利网| 亚洲人成小说网站色在线| 亚洲午夜在线视频| av在线日韩| 欧美成人免费在线| 欧亚成年男女午夜| 国产久一一精品| 国产综合久久久久久鬼色| 日韩精品亚洲专区在线观看| 国产a级黄色大片| 精品粉嫩超白一线天av| 操她视频在线观看| 国产freexxxx性播放麻豆| 日本中文在线播放| 激情图区综合网| 三级在线视频观看| 欧美三日本三级少妇99| 日韩三级电影免费观看| 免费成人黄色| 亚洲精品电影网站| jizzjizzjizz欧美| 91在线在线观看| 99精品久久久久久中文字幕| 欧美日韩色一区| 91在线视频观看| 岛国视频免费在线观看| 蜜臀av午夜精品| 少妇精品久久久久久久久久| 久久精品导航| 做爰高潮hd色即是空| 日韩电影在线播放| www.四虎精品| 国产馆在线观看| 国产老熟女伦老熟妇露脸| 国产一二三四| 蜜桃福利午夜精品一区| 日韩精品在线免费观看| 国产精品一区二区在线播放| 波多野结衣视频网址| 日韩风俗一区 二区| 亚洲女人小视频在线观看| 77777影视视频在线观看| 国产精品亚洲第一区| 精品日本一区二区三区在线观看| 丰满圆润老女人hd| 亚洲AV无码成人精品一区| 国产剧情一区二区三区| 国产黄视频网站| 欧美性猛交xxxxx少妇| 在线观看精品一区二区三区| 欧美一级爆毛片| 在线观看国产精品一区| 国产精品天堂蜜av在线播放| 欧美色欧美亚洲高清在线视频| 成人福利视频网| 国内精品久久久久久99蜜桃| 99久久综合狠狠综合久久aⅴ| 成人国产精品一区| 色欲欲www成人网站| 99国产超薄丝袜足j在线观看| 喷白浆一区二区| 五月综合激情婷婷六月色窝| 91福利在线看| 亚洲老头老太hd| 精品无码人妻少妇久久久久久| www.色就是色| 国产在线视频91| 日韩一区二区高清| 色屁屁草草影院ccyycom| 水蜜桃一区二区三区| 99国产精品免费网站| 成人高清伦理免费影院在线观看| 亚洲 美腿 欧美 偷拍| 久久九九全国免费精品观看| 亚洲精品99999| 成人精品aaaa网站| 探花国产精品一区二区| 国产精品va无码一区二区三区| 欧美精品偷拍| 美美女免费毛片| аⅴ资源新版在线天堂| 日韩伦理在线观看| 中文官网资源新版中文第二页在线观看| 欧美一区二区三区四区五区六区| 黄色录像特级片| 成人激情综合| 国产男小鲜肉同志免费| 交videos老少配com| 亚洲高清成人影院| 午夜在线a亚洲v天堂网2018| 黄色香蕉视频在线观看| 国产日产精品_国产精品毛片| 国产日韩精品在线看| 久久久一本二本三本| 国产91色蝌蚪视频| 国产精品久久久亚洲第一牛牛| 精品国产二区三区| 美女国产一区二区| 一区二区三区四区五区视频| 欧美老女人xx| 性欧美一区二区三区| 99免费观看视频| 一区精品在线| 欧美色视频在线| 国产伦视频一区二区三区| 欧美日韩国产高清视频| 亚洲最大的成人网| 一区二区免费在线视频| 国产女人免费看a级丨片| 91精品人妻一区二区三区蜜桃2| 美女精品在线观看| 99国产精品久久久久久久成人| 国产无遮挡在线视频免费观看| 在线观看日本中文字幕| 成人免费一区二区三区在线观看| 久久久久久日本一区99| 91在线视频官网| 68精品国产免费久久久久久婷婷| 国产美女极度色诱视频www| 日韩va亚洲va欧洲va国产| 色香阁99久久精品久久久| 国产一区二区日韩精品| 午夜视频在线观看一区二区三区| 国产精品久久久久久超碰| 青青草国产免费一区二区下载| 暖暖影院日本高清...免费| 免费91在线观看| 日本黄色a视频| 91av视频在线观看| 美女100%无挡| 亚洲性日韩精品一区二区| 老湿机69福利| 亚洲精品一区二区三区不| 蜜桃av在线| 美女91在线| 欧美网站免费观看| 日韩免费在线| 免费精品一区二区三区在线观看| 精品国产综合区久久久久久| 可以在线看的av网站| 五月激情六月综合| 欧美一区网站| 蜜臀国产一区二区三区在线播放| 99国产麻豆精品| 中文字幕乱码av| 日韩中文字幕网站| 国产尤物久久久| 怡红院精品视频在线观看极品| 在线观看av每日更新免费| 久久久久久久久国产一区| 一级片免费在线播放| 成人h动漫精品一区二| 精品国产一区二区国模嫣然| 亚洲精品第一页| 中文字幕在线成人| 欧美日本在线观看| 国产成人无码a区在线观看视频| 国产精品一国产精品k频道56| 中文字幕av一区二区三区免费看| 香蕉视频禁止18| 草草在线视频| 欧美国产97人人爽人人喊| 四虎电影网址| 亚洲激情二区| 亚洲一区二区在线免费观看| 欧美久久视频| 国产精品中文久久久久久| 中文字幕在线视频免费观看| 亚洲欧美国产日韩综合| 精品成人国产在线观看男人呻吟| 国产3级在线观看| 麻豆91av| wwwxxx国产| 国产乱国产乱300精品| www.久久热| 日韩在线中文字幕| 国产精品黄页免费高清在线观看| 同性恋视频一区| 国内精品免费一区二区三区| 波多野结衣毛片| 国产欧美一区二区白浆黑人| 国产少妇在线观看| 国产情侣在线播放| 欧美电影精品一区二区| 香蕉视频网站在线播放| 亚洲免费观看高清完整版在线观| 91福利免费观看| 成人国产精品一区二区网站| 成人噜噜噜噜| 欧美三级午夜理伦三级中视频| 在线观看二区| 国产一区二区三区av电影| 天堂成人在线| 亚洲少妇30p| 免费黄色片在线观看|