AutorÃa | Ultima modificación | Ver Log |
YUI.add('series-curve-util', function (Y, NAME) {/*** Provides functionality for drawing curves in a series.** @module charts* @submodule series-curve-util*//*** Utility class used for calculating curve points.** @class CurveUtil* @constructor* @submodule series-curve-util*/function CurveUtil(){}CurveUtil.prototype = {/*** Creates an array of start, end and control points for splines.** @method getCurveControlPoints* @param {Array} xcoords Collection of x-coordinates used for calculate the curves* @param {Array} ycoords Collection of y-coordinates used for calculate the curves* @return Object* @protected*/getCurveControlPoints: function(xcoords, ycoords){var outpoints = [],i = 1,l = xcoords.length - 1,xvals = [],yvals = [];// Too few points, need at least twoif (l < 1){return null;}outpoints[0] = {startx: xcoords[0],starty: ycoords[0],endx: xcoords[1],endy: ycoords[1]};// Special case, the Bezier should be a straight lineif (l === 1){outpoints[0].ctrlx1 = (2.0*xcoords[0] + xcoords[1])/3.0;outpoints[0].ctrly2 = (2.0*ycoords[0] + ycoords[1])/3.0;outpoints[0].ctrlx2 = 2.0*outpoints[0].ctrlx1 - xcoords[0];outpoints[0].ctrly2 = 2.0*outpoints[0].ctrly1 - ycoords[0];return outpoints;}for (; i < l; ++i){outpoints.push({startx: Math.round(xcoords[i]),starty: Math.round(ycoords[i]),endx: Math.round(xcoords[i+1]),endy: Math.round(ycoords[i+1])});xvals[i] = 4.0 * xcoords[i] + 2*xcoords[i+1];yvals[i] = 4.0*ycoords[i] + 2*ycoords[i+1];}xvals[0] = xcoords[0] + (2.0 * xcoords[1]);xvals[l-1] = (8.0 * xcoords[l-1] + xcoords[l]) / 2.0;xvals = this.getControlPoints(xvals.concat());yvals[0] = ycoords[0] + (2.0 * ycoords[1]);yvals[l-1] = (8.0 * ycoords[l-1] + ycoords[l]) / 2.0;yvals = this.getControlPoints(yvals.concat());for (i = 0; i < l; ++i){outpoints[i].ctrlx1 = Math.round(xvals[i]);outpoints[i].ctrly1 = Math.round(yvals[i]);if (i < l-1){outpoints[i].ctrlx2 = Math.round(2*xcoords[i+1] - xvals[i+1]);outpoints[i].ctrly2 = Math.round(2*ycoords[i+1] - yvals[i+1]);}else{outpoints[i].ctrlx2 = Math.round((xcoords[l] + xvals[l-1])/2);outpoints[i].ctrly2 = Math.round((ycoords[l] + yvals[l-1])/2);}}return outpoints;},/*** Gets the control points for the curve.** @method getControlPoints* @param {Array} vals Collection of values coords used to generate control points.* @return Array* @private*/getControlPoints: function(vals){var l = vals.length,x = [],tmp = [],b = 2.0,i = 1;x[0] = vals[0] / b;for (; i < l; ++i){tmp[i] = 1/b;b = (i < l-1 ? 4.0 : 3.5) - tmp[i];x[i] = (vals[i] - x[i-1]) / b;}for (i = 1; i < l; ++i){x[l-i-1] -= tmp[l-i] * x[l-i];}return x;}};Y.CurveUtil = CurveUtil;}, '3.18.1');