CenteredSeries.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* *
  2. *
  3. * (c) 2010-2020 Torstein Honsi
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * */
  10. 'use strict';
  11. import H from '../Core/Globals.js';
  12. /**
  13. * @private
  14. * @interface Highcharts.RadianAngles
  15. */ /**
  16. * @name Highcharts.RadianAngles#end
  17. * @type {number}
  18. */ /**
  19. * @name Highcharts.RadianAngles#start
  20. * @type {number}
  21. */
  22. import U from '../Core/Utilities.js';
  23. var isNumber = U.isNumber, pick = U.pick, relativeLength = U.relativeLength;
  24. var deg2rad = H.deg2rad;
  25. /* eslint-disable valid-jsdoc */
  26. /**
  27. * @private
  28. * @mixin Highcharts.CenteredSeriesMixin
  29. */
  30. var centeredSeriesMixin = H.CenteredSeriesMixin = {
  31. /**
  32. * Get the center of the pie based on the size and center options relative
  33. * to the plot area. Borrowed by the polar and gauge series types.
  34. *
  35. * @private
  36. * @function Highcharts.CenteredSeriesMixin.getCenter
  37. *
  38. * @return {Array<number>}
  39. */
  40. getCenter: function () {
  41. 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, smallestSize = Math.min(plotWidth, plotHeight), size = options.size, innerSize = options.innerSize || 0, positions, i, value;
  42. if (typeof size === 'string') {
  43. size = parseFloat(size);
  44. }
  45. if (typeof innerSize === 'string') {
  46. innerSize = parseFloat(innerSize);
  47. }
  48. positions = [
  49. pick(centerOption[0], '50%'),
  50. pick(centerOption[1], '50%'),
  51. // Prevent from negative values
  52. pick(size && size < 0 ? void 0 : options.size, '100%'),
  53. pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')
  54. ];
  55. // No need for inner size in angular (gauges) series but still required
  56. // for pie series
  57. if (chart.angular && !(this instanceof H.Series)) {
  58. positions[3] = 0;
  59. }
  60. for (i = 0; i < 4; ++i) {
  61. value = positions[i];
  62. handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));
  63. // i == 0: centerX, relative to width
  64. // i == 1: centerY, relative to height
  65. // i == 2: size, relative to smallestSize
  66. // i == 3: innerSize, relative to size
  67. positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);
  68. }
  69. // innerSize cannot be larger than size (#3632)
  70. if (positions[3] > positions[2]) {
  71. positions[3] = positions[2];
  72. }
  73. return positions;
  74. },
  75. /**
  76. * getStartAndEndRadians - Calculates start and end angles in radians.
  77. * Used in series types such as pie and sunburst.
  78. *
  79. * @private
  80. * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians
  81. *
  82. * @param {number} [start]
  83. * Start angle in degrees.
  84. *
  85. * @param {number} [end]
  86. * Start angle in degrees.
  87. *
  88. * @return {Highcharts.RadianAngles}
  89. * Returns an object containing start and end angles as radians.
  90. */
  91. getStartAndEndRadians: function (start, end) {
  92. var startAngle = isNumber(start) ? start : 0, // must be a number
  93. endAngle = ((isNumber(end) && // must be a number
  94. end > startAngle && // must be larger than the start angle
  95. // difference must be less than 360 degrees
  96. (end - startAngle) < 360) ?
  97. end :
  98. startAngle + 360), correction = -90;
  99. return {
  100. start: deg2rad * (startAngle + correction),
  101. end: deg2rad * (endAngle + correction)
  102. };
  103. }
  104. };
  105. export default centeredSeriesMixin;