| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | /* * * (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<number>}     */    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)        };    }};
 |