/* * * (c) 2010-2019 Torstein Honsi * * License: www.highcharts.com/license */ /** * @private * @typedef Highcharts.RadianAngles * * @property {number} start * * @property {number} end */ 'use strict'; import H from '../parts/Globals.js'; import '../parts/Utilities.js'; var deg2rad = H.deg2rad, isNumber = H.isNumber, pick = H.pick, relativeLength = H.relativeLength; /** * @private * @mixin Highcharts.CenteredSeriesMixin */ H.CenteredSeriesMixin = { /** * Get the center of the pie based on the size and center options relative * to the plot area. Borrowed by the polar and gauge series types. * * @private * @function Highcharts.CenteredSeriesMixin.getCenter * * @return {Array} */ getCenter: function () { var options = this.options, chart = this.chart, slicingRoom = 2 * (options.slicedOffset || 0), handleSlicingRoom, plotWidth = chart.plotWidth - 2 * slicingRoom, plotHeight = chart.plotHeight - 2 * slicingRoom, centerOption = options.center, positions = [ pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0 ], smallestSize = Math.min(plotWidth, plotHeight), i, value; for (i = 0; i < 4; ++i) { value = positions[i]; handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value)); // i == 0: centerX, relative to width // i == 1: centerY, relative to height // i == 2: size, relative to smallestSize // i == 3: innerSize, relative to size positions[i] = relativeLength( value, [plotWidth, plotHeight, smallestSize, positions[2]][i] ) + (handleSlicingRoom ? slicingRoom : 0); } // innerSize cannot be larger than size (#3632) if (positions[3] > positions[2]) { positions[3] = positions[2]; } return positions; }, /** * getStartAndEndRadians - Calculates start and end angles in radians. * Used in series types such as pie and sunburst. * * @private * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians * * @param {number} start * Start angle in degrees. * * @param {number} end * Start angle in degrees. * * @return {Highcharts.RadianAngles} * Returns an object containing start and end angles as radians. */ getStartAndEndRadians: function getStartAndEndRadians(start, end) { var startAngle = isNumber(start) ? start : 0, // must be a number endAngle = ( ( isNumber(end) && // must be a number end > startAngle && // must be larger than the start angle // difference must be less than 360 degrees (end - startAngle) < 360 ) ? end : startAngle + 360 ), correction = -90; return { start: deg2rad * (startAngle + correction), end: deg2rad * (endAngle + correction) }; } };