From: Anthony Robledo Date: Tue, 19 Jul 2011 21:00:01 +0000 (-0400) Subject: Only add 1 point per pixel for graphs without error bars to speed up rendering. X-Git-Tag: v1.0.0~449 X-Git-Url: https://adrianiainlam.tk/git/?a=commitdiff_plain;h=4ab8db0c00008f89d9b9eb3247d7e933965ce9d5;p=dygraphs.git Only add 1 point per pixel for graphs without error bars to speed up rendering. --- diff --git a/dygraph-layout.js b/dygraph-layout.js index 99ae50c..266e3d0 100644 --- a/dygraph-layout.js +++ b/dygraph-layout.js @@ -135,25 +135,52 @@ DygraphLayout.prototype._evaluateLineCharts = function() { var dataset = this.datasets[setName]; var axis = this.dygraph_.axisPropertiesForSeries(setName); + var graphWidth = this.dygraph_.width_; + var graphHeight = this.dygraph_.height_; + var prevXPx = NaN; + var prevYPx = NaN; + var currXPx = NaN; + var currYPx = NaN; + + var errorBars = this.attr_("errorBars") || this.attr_("customBars"); + for (var j = 0; j < dataset.length; j++) { var item = dataset[j]; - - var yval; + var xValue = parseFloat(dataset[j][0]); + var yValue = parseFloat(dataset[j][1]); + + // Range from 0-1 where 0 represents top and 1 represents bottom + var xNormal = (xValue - this.minxval) * this.xscale; + // Range from 0-1 where 0 represents left and 1 represents right. + var yNormal; if (axis.logscale) { - yval = 1.0 - ((Dygraph.log10(parseFloat(item[1])) - Dygraph.log10(axis.minyval)) * axis.ylogscale); // really should just be yscale. + yNormal = 1.0 - ((Dygraph.log10(yValue) - Dygraph.log10(axis.minyval)) * axis.ylogscale); } else { - yval = 1.0 - ((parseFloat(item[1]) - axis.minyval) * axis.yscale); + yNormal = 1.0 - ((yValue - axis.minyval) * axis.yscale); } - var point = { - // TODO(danvk): here - x: ((parseFloat(item[0]) - this.minxval) * this.xscale), - y: yval, - xval: parseFloat(item[0]), - yval: parseFloat(item[1]), - name: setName - }; + + // Current pixel coordinates that the data point would fill. + currXPx = Math.round(xNormal * graphWidth); + currYPx = Math.round(yNormal * graphHeight); - this.points.push(point); + // Skip over pushing points that lie on the same pixel. + // Ignore this optimization if there are error bars. + // TODO(antrob): optimize this for graphs with error bars. + if (prevXPx != currXPx || prevYPx != currYPx || errorBars) { + // TODO(antrob): skip over points that lie on a line that is already going to be drawn. + // There is no need to have more than 2 consecutive points that are collinear. + var point = { + // TODO(danvk): here + x: xNormal, + y: yNormal, + xval: xValue, + yval: yValue, + name: setName + }; + this.points.push(point); + } + prevXPx = currXPx; + prevYPx = currYPx; } } };