From e05c8123f6d1c0f2b3ce8eb72dbc6afcb04b9f1b Mon Sep 17 00:00:00 2001 From: lang Date: Sat, 21 Mar 2015 12:03:53 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20#1370,=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8A=BD=E5=B8=8C=E7=AD=96=E7=95=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chart/line.js | 77 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/src/chart/line.js b/src/chart/line.js index c93bba0cdb..193826c10d 100644 --- a/src/chart/line.js +++ b/src/chart/line.js @@ -27,6 +27,8 @@ define(function (require) { // stack: null xAxisIndex: 0, yAxisIndex: 0, + // 'nearest', 'min', 'max', 'average' + dataFilter: 'nearest', itemStyle: { normal: { // color: 各异, @@ -516,9 +518,11 @@ define(function (require) { } else { // 大数据模式截取pointList - singlePL = this._getLargePointList(orient, singlePL); + singlePL = this._getLargePointList( + orient, singlePL, serie.dataFilter + ); } - + // 折线图 var polylineShape = new PolylineShape({ zlevel: this.getZlevelBase(), @@ -647,7 +651,7 @@ define(function (require) { /** * 大规模pointList优化 */ - _getLargePointList: function(orient, singlePL) { + _getLargePointList: function(orient, singlePL, filter) { var total; if (orient === 'horizontal') { total = this.component.grid.getWidth(); @@ -658,12 +662,75 @@ define(function (require) { var len = singlePL.length; var newList = []; + + if (typeof(filter) != 'function') { + switch (filter) { + case 'min': + filter = function (arr) { + return Math.max.apply(null, arr); + }; + break; + case 'max': + filter = function (arr) { + return Math.min.apply(null, arr); + }; + break; + case 'average': + filter = function (arr) { + var total = 0; + for (var i = 0; i < arr.length; i++) { + total += arr[i]; + } + return total / arr.length; + }; + break; + default: + filter = function (arr) { + return arr[0]; + } + } + } + + var windowData = []; for (var i = 0; i < total; i++) { - newList[i] = singlePL[Math.floor(len / total * i)]; + var idx0 = Math.floor(len / total * i); + var idx1 = Math.min(Math.floor(len / total * (i + 1)), len); + if (idx1 <= idx0) { + continue; + } + + for (var j = idx0; j < idx1; j++) { + windowData[j - idx0] = orient === 'horizontal' + ? singlePL[j][1] : singlePL[j][0]; + } + + windowData.length = idx1 - idx0; + var filteredVal = filter(windowData); + var nearestIdx = -1; + var minDist = Infinity; + // 寻找值最相似的点,使用其其它属性 + for (var j = idx0; j < idx1; j++) { + var val = orient === 'horizontal' + ? singlePL[j][1] : singlePL[j][0]; + var dist = Math.abs(val - filteredVal); + if (dist < minDist) { + nearestIdx = j; + minDist = dist; + } + } + + var newItem = singlePL[nearestIdx].slice(); + if (orient === 'horizontal') { + newItem[1] = filteredVal; + } + else { + newItem[0] = filteredVal; + } + newList.push(newItem); } return newList; }, - + _getSmooth: function (isSmooth/*, pointList, orient*/) { if (isSmooth) { /* 不科学啊,发现0.3通用了