- /**
- * Provides functionality for drawing lines in a series.
- *
- * @module charts
- * @submodule series-line-util
- */
- /**
- * Utility class used for drawing lines.
- *
- * @class Lines
- * @constructor
- * @submodule series-line-util
- */
- var Y_Lang = Y.Lang;
- function Lines(){}
-
- Lines.prototype = {
- /**
- * @property _lineDefaults
- * @type Object
- * @private
- */
- _lineDefaults: null,
-
- /**
- * Creates a graphic in which to draw a series.
- *
- * @method _getGraphic
- * @return Graphic
- * @private
- */
- _getGraphic: function()
- {
- var graphic = this.get("graphic") || this.get("graph").get("graphic");
- if(!this._lineGraphic)
- {
- this._lineGraphic = graphic.addShape({type: "path"});
- }
- this._lineGraphic.clear();
- return this._lineGraphic;
- },
-
- /**
- * Toggles visibility
- *
- * @method _toggleVisible
- * @param {Boolean} visible indicates visibilitye
- * @private
- */
- _toggleVisible: function(visible)
- {
- if(this._lineGraphic)
- {
- this._lineGraphic.set("visible", visible);
- }
- },
-
- /**
- * Draws lines for the series.
- *
- * @method drawLines
- * @protected
- */
- drawLines: function()
- {
- if(this.get("xcoords").length < 1)
- {
- return;
- }
- var isNumber = Y_Lang.isNumber,
- xcoords,
- ycoords,
- direction = this.get("direction"),
- len,
- lastPointValid,
- pointValid,
- noPointsRendered = true,
- lastValidX,
- lastValidY,
- nextX,
- nextY,
- i,
- styles = this.get("styles").line,
- lineType = styles.lineType,
- lc = styles.color || this._getDefaultColor(this.get("graphOrder"), "line"),
- lineAlpha = styles.alpha,
- dashLength = styles.dashLength,
- gapSpace = styles.gapSpace,
- connectDiscontinuousPoints = styles.connectDiscontinuousPoints,
- discontinuousType = styles.discontinuousType,
- discontinuousDashLength = styles.discontinuousDashLength,
- discontinuousGapSpace = styles.discontinuousGapSpace,
- path = this._getGraphic();
- if(this._stacked)
- {
- xcoords = this.get("stackedXCoords");
- ycoords = this.get("stackedYCoords");
- }
- else
- {
- xcoords = this.get("xcoords");
- ycoords = this.get("ycoords");
- }
- len = direction === "vertical" ? ycoords.length : xcoords.length;
- path.set("stroke", {
- weight: styles.weight,
- color: lc,
- opacity: lineAlpha
- });
- for(i = 0; i < len; i = ++i)
- {
- nextX = xcoords[i];
- nextY = ycoords[i];
- pointValid = isNumber(nextX) && isNumber(nextY);
- if(!pointValid)
- {
- lastPointValid = pointValid;
- continue;
- }
- if(noPointsRendered)
- {
- noPointsRendered = false;
- path.moveTo(nextX, nextY);
- }
- else if(lastPointValid)
- {
- if(lineType !== "dashed")
- {
- path.lineTo(nextX, nextY);
- }
- else
- {
- this.drawDashedLine(path, lastValidX, lastValidY, nextX, nextY,
- dashLength,
- gapSpace);
- }
- }
- else if(!connectDiscontinuousPoints)
- {
- path.moveTo(nextX, nextY);
- }
- else
- {
- if(discontinuousType !== "solid")
- {
- this.drawDashedLine(path, lastValidX, lastValidY, nextX, nextY,
- discontinuousDashLength,
- discontinuousGapSpace);
- }
- else
- {
- path.lineTo(nextX, nextY);
- }
- }
- lastValidX = nextX;
- lastValidY = nextY;
- lastPointValid = true;
- }
- path.end();
- },
-
- /**
- * Connects data points with a consistent curve for a series.
- *
- * @method drawSpline
- * @protected
- */
- drawSpline: function()
- {
- if(this.get("xcoords").length < 1)
- {
- return;
- }
- var xcoords = this.get("xcoords"),
- ycoords = this.get("ycoords"),
- curvecoords = this.getCurveControlPoints(xcoords, ycoords),
- len = curvecoords.length,
- cx1,
- cx2,
- cy1,
- cy2,
- x,
- y,
- i = 0,
- styles = this.get("styles").line,
- path = this._getGraphic(),
- lineAlpha = styles.alpha,
- color = styles.color || this._getDefaultColor(this.get("graphOrder"), "line");
- path.set("stroke", {
- weight: styles.weight,
- color: color,
- opacity: lineAlpha
- });
- path.moveTo(xcoords[0], ycoords[0]);
- for(; i < len; i = ++i)
- {
- x = curvecoords[i].endx;
- y = curvecoords[i].endy;
- cx1 = curvecoords[i].ctrlx1;
- cx2 = curvecoords[i].ctrlx2;
- cy1 = curvecoords[i].ctrly1;
- cy2 = curvecoords[i].ctrly2;
- path.curveTo(cx1, cy1, cx2, cy2, x, y);
- }
- path.end();
- },
-
- /**
- * Draws a dashed line between two points.
- *
- * @method drawDashedLine
- * @param {Number} xStart The x position of the start of the line
- * @param {Number} yStart The y position of the start of the line
- * @param {Number} xEnd The x position of the end of the line
- * @param {Number} yEnd The y position of the end of the line
- * @param {Number} dashSize the size of dashes, in pixels
- * @param {Number} gapSize the size of gaps between dashes, in pixels
- * @private
- */
- drawDashedLine: function(path, xStart, yStart, xEnd, yEnd, dashSize, gapSize)
- {
- dashSize = dashSize || 10;
- gapSize = gapSize || 10;
- var segmentLength = dashSize + gapSize,
- xDelta = xEnd - xStart,
- yDelta = yEnd - yStart,
- delta = Math.sqrt(Math.pow(xDelta, 2) + Math.pow(yDelta, 2)),
- segmentCount = Math.floor(Math.abs(delta / segmentLength)),
- radians = Math.atan2(yDelta, xDelta),
- xCurrent = xStart,
- yCurrent = yStart,
- i;
- xDelta = Math.cos(radians) * segmentLength;
- yDelta = Math.sin(radians) * segmentLength;
-
- for(i = 0; i < segmentCount; ++i)
- {
- path.moveTo(xCurrent, yCurrent);
- path.lineTo(xCurrent + Math.cos(radians) * dashSize, yCurrent + Math.sin(radians) * dashSize);
- xCurrent += xDelta;
- yCurrent += yDelta;
- }
-
- path.moveTo(xCurrent, yCurrent);
- delta = Math.sqrt((xEnd - xCurrent) * (xEnd - xCurrent) + (yEnd - yCurrent) * (yEnd - yCurrent));
-
- if(delta > dashSize)
- {
- path.lineTo(xCurrent + Math.cos(radians) * dashSize, yCurrent + Math.sin(radians) * dashSize);
- }
- else if(delta > 0)
- {
- path.lineTo(xCurrent + Math.cos(radians) * delta, yCurrent + Math.sin(radians) * delta);
- }
-
- path.moveTo(xEnd, yEnd);
- },
-
- /**
- * Default values for `styles` attribute.
- *
- * @method _getLineDefaults
- * @return Object
- * @protected
- */
- _getLineDefaults: function()
- {
- return {
- alpha: 1,
- weight: 6,
- lineType:"solid",
- dashLength:10,
- gapSpace:10,
- connectDiscontinuousPoints:true,
- discontinuousType:"solid",
- discontinuousDashLength:10,
- discontinuousGapSpace:10
- };
- }
- };
- Y.augment(Lines, Y.Attribute);
- Y.Lines = Lines;
-
-