highcharts 9.2.1 → 9.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -6
- package/bower.json +1 -1
- package/css/annotations/popup.css +48 -8
- package/css/annotations/popup.scss +70 -22
- package/css/highcharts.css +46 -1
- package/css/highcharts.scss +40 -0
- package/css/stocktools/gui.css +1 -1
- package/css/themes/dark-unica.css +46 -1
- package/css/themes/grid-light.css +46 -1
- package/css/themes/sand-signika.css +46 -1
- package/es-modules/Accessibility/A11yI18n.js +269 -224
- package/es-modules/Accessibility/Accessibility.js +244 -129
- package/es-modules/Accessibility/AccessibilityComponent.js +78 -313
- package/es-modules/Accessibility/Components/AnnotationsA11y.js +19 -5
- package/es-modules/Accessibility/Components/ContainerComponent.js +53 -28
- package/es-modules/Accessibility/Components/InfoRegionsComponent.js +178 -120
- package/es-modules/Accessibility/Components/LegendComponent.js +251 -129
- package/es-modules/Accessibility/Components/MenuComponent.js +239 -154
- package/es-modules/Accessibility/Components/RangeSelectorComponent.js +172 -93
- package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +161 -115
- package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +138 -69
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +67 -28
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +48 -56
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +387 -343
- package/es-modules/Accessibility/Components/ZoomComponent.js +156 -70
- package/es-modules/Accessibility/FocusBorder.js +192 -152
- package/es-modules/Accessibility/HighContrastMode.js +79 -66
- package/es-modules/Accessibility/HighContrastTheme.js +10 -0
- package/es-modules/Accessibility/KeyboardNavigation.js +151 -75
- package/es-modules/Accessibility/KeyboardNavigationHandler.js +71 -44
- package/es-modules/Accessibility/Options/DeprecatedOptions.js +21 -4
- package/es-modules/Accessibility/Options/LangOptions.js +4 -5
- package/es-modules/Accessibility/Options/Options.js +32 -17
- package/es-modules/Accessibility/ProxyElement.js +218 -0
- package/es-modules/Accessibility/ProxyProvider.js +302 -0
- package/es-modules/Accessibility/Utils/Announcer.js +17 -10
- package/es-modules/Accessibility/Utils/ChartUtilities.js +55 -45
- package/es-modules/Accessibility/Utils/DOMElementProvider.js +27 -15
- package/es-modules/Accessibility/Utils/EventProvider.js +27 -17
- package/es-modules/Accessibility/Utils/HTMLUtilities.js +125 -42
- package/es-modules/Core/Animation/Fx.js +5 -14
- package/es-modules/Core/Axis/Axis.js +77 -96
- package/es-modules/Core/Axis/Axis3D.js +10 -4
- package/es-modules/Core/Axis/AxisDefaults.js +35 -24
- package/es-modules/Core/Axis/BrokenAxis.js +17 -11
- package/es-modules/Core/Axis/Color/ColorAxis.js +7 -4
- package/es-modules/Core/Axis/Color/ColorAxisComposition.js +55 -5
- package/es-modules/Core/Axis/Color/ColorAxisDefaults.js +5 -5
- package/es-modules/Core/Axis/DateTimeAxis.js +3 -14
- package/es-modules/Core/Axis/GridAxis.js +26 -16
- package/es-modules/Core/Axis/NavigatorAxis.js +0 -5
- package/es-modules/Core/Axis/OrdinalAxis.js +88 -92
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +4 -5
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js +0 -5
- package/es-modules/Core/Axis/RadialAxis.js +7 -28
- package/es-modules/Core/Axis/ScrollbarAxis.js +27 -12
- package/es-modules/Core/Axis/StackingAxis.js +2 -1
- package/es-modules/Core/Axis/Tick.js +2 -4
- package/es-modules/Core/Axis/TreeGridAxis.js +28 -19
- package/es-modules/Core/Axis/TreeGridTick.js +5 -3
- package/es-modules/Core/Axis/WaterfallAxis.js +1 -1
- package/es-modules/Core/Axis/ZAxis.js +1 -1
- package/es-modules/Core/Chart/Chart.js +44 -47
- package/es-modules/Core/Chart/Chart3D.js +23 -10
- package/es-modules/Core/Chart/ChartDefaults.js +3 -4
- package/es-modules/Core/Chart/ChartNavigationComposition.js +92 -0
- package/es-modules/Core/Chart/GanttChart.js +4 -4
- package/es-modules/Core/Chart/MapChart.js +13 -25
- package/es-modules/Core/Chart/StockChart.js +13 -316
- package/es-modules/Core/Color/Palettes.js +22 -0
- package/es-modules/Core/DefaultOptions.js +22 -19
- package/es-modules/Core/Foundation.js +39 -31
- package/es-modules/Core/Geometry/CircleUtilities.js +2 -1
- package/es-modules/Core/Globals.js +1 -1
- package/es-modules/Core/HttpUtilities.js +8 -7
- package/es-modules/Core/Legend/Legend.js +19 -16
- package/es-modules/Core/Navigator.js +41 -30
- package/es-modules/Core/Pointer.js +52 -45
- package/es-modules/Core/Renderer/HTML/AST.js +29 -14
- package/es-modules/Core/Renderer/HTML/HTMLElement.js +27 -20
- package/es-modules/Core/Renderer/HTML/HTMLRenderer.js +8 -6
- package/es-modules/Core/Renderer/RendererUtilities.js +2 -2
- package/es-modules/Core/Renderer/SVG/SVGElement.js +11 -20
- package/es-modules/Core/Renderer/SVG/SVGLabel.js +17 -8
- package/es-modules/Core/Renderer/SVG/SVGRenderer.js +25 -29
- package/es-modules/Core/Renderer/SVG/SVGRenderer3D.js +12 -5
- package/es-modules/Core/Renderer/SVG/TextBuilder.js +18 -12
- package/es-modules/Core/Responsive.js +2 -3
- package/es-modules/Core/Scrollbar.js +14 -12
- package/es-modules/Core/ScrollbarDefaults.js +10 -9
- package/es-modules/Core/Series/DataLabel.js +19 -15
- package/es-modules/Core/Series/Point.js +22 -19
- package/es-modules/Core/Series/Series.js +200 -235
- package/es-modules/Core/Series/SeriesDefaults.js +8 -8
- package/es-modules/Core/Series/SeriesRegistry.js +1 -2
- package/es-modules/Core/Time.js +14 -11
- package/es-modules/Core/Tooltip.js +63 -53
- package/es-modules/Core/Utilities.js +20 -24
- package/es-modules/Data/DataConverter.js +483 -0
- package/es-modules/Data/DataPromise.js +252 -0
- package/es-modules/Data/DataSeriesConverter.js +207 -0
- package/es-modules/Data/DataTable.js +1205 -0
- package/es-modules/Data/Modifiers/ChainModifier.js +299 -0
- package/es-modules/Data/Modifiers/DataModifier.js +303 -0
- package/es-modules/Data/Modifiers/GroupModifier.js +144 -0
- package/es-modules/Data/Modifiers/InvertModifier.js +254 -0
- package/es-modules/Data/Modifiers/RangeModifier.js +143 -0
- package/es-modules/Data/Modifiers/SeriesPointsModifier.js +110 -0
- package/es-modules/Data/Modifiers/SortModifier.js +249 -0
- package/es-modules/Data/Parsers/CSVParser.js +400 -0
- package/es-modules/Data/Parsers/DataParser.js +101 -0
- package/es-modules/Data/Parsers/GoogleSheetsParser.js +223 -0
- package/es-modules/Data/Parsers/HTMLTableParser.js +213 -0
- package/es-modules/Data/Stores/CSVStore.js +317 -0
- package/es-modules/Data/Stores/DataStore.js +276 -0
- package/es-modules/Data/Stores/GoogleSheetsStore.js +169 -0
- package/es-modules/Data/Stores/HTMLTableStore.js +353 -0
- package/es-modules/Extensions/Annotations/Annotations.js +69 -18
- package/es-modules/Extensions/Annotations/ControlPoint.js +1 -3
- package/es-modules/Extensions/Annotations/Controllables/ControllableCircle.js +1 -1
- package/es-modules/Extensions/Annotations/Controllables/ControllableEllipse.js +199 -0
- package/es-modules/Extensions/Annotations/Controllables/ControllableImage.js +1 -1
- package/es-modules/Extensions/Annotations/Controllables/ControllableLabel.js +3 -6
- package/es-modules/Extensions/Annotations/Controllables/ControllablePath.js +3 -2
- package/es-modules/Extensions/Annotations/Controllables/ControllableRect.js +1 -1
- package/es-modules/Extensions/Annotations/Mixins/ControllableMixin.js +13 -4
- package/es-modules/Extensions/Annotations/Mixins/EventEmitterMixin.js +0 -1
- package/es-modules/Extensions/Annotations/Mixins/MarkerMixin.js +5 -4
- package/es-modules/Extensions/Annotations/NavigationBindings.js +120 -53
- package/es-modules/Extensions/Annotations/Popup.js +494 -148
- package/es-modules/Extensions/Annotations/Types/BasicAnnotation.js +51 -2
- package/es-modules/Extensions/Annotations/Types/CrookedLine.js +5 -3
- package/es-modules/Extensions/Annotations/Types/ElliottWave.js +1 -1
- package/es-modules/Extensions/Annotations/Types/Fibonacci.js +2 -3
- package/es-modules/Extensions/Annotations/Types/FibonacciTimeZones.js +219 -0
- package/es-modules/Extensions/Annotations/Types/InfinityLine.js +1 -1
- package/es-modules/Extensions/Annotations/Types/Measure.js +29 -19
- package/es-modules/Extensions/Annotations/Types/Pitchfork.js +7 -6
- package/es-modules/Extensions/Annotations/Types/TimeCycles.js +211 -0
- package/es-modules/Extensions/Annotations/Types/Tunnel.js +13 -10
- package/es-modules/Extensions/Annotations/Types/VerticalLine.js +1 -1
- package/es-modules/Extensions/Boost/BoostOptions.js +2 -2
- package/es-modules/Extensions/Boost/BoostOverrides.js +6 -10
- package/es-modules/Extensions/Boost/BoostUtils.js +0 -6
- package/es-modules/Extensions/Boost/WGLRenderer.js +16 -12
- package/es-modules/Extensions/Boost/WGLShader.js +13 -11
- package/es-modules/Extensions/Boost/WGLVBuffer.js +4 -7
- package/es-modules/Extensions/BoostCanvas.js +1 -2
- package/es-modules/Extensions/CurrentDateIndication.js +2 -3
- package/es-modules/Extensions/Data.js +77 -115
- package/es-modules/Extensions/DataGrouping.js +54 -32
- package/es-modules/Extensions/Debugger/ErrorMessages.js +2 -2
- package/es-modules/Extensions/DownloadURL.js +2 -2
- package/es-modules/Extensions/DragPanes.js +1 -2
- package/es-modules/Extensions/DraggablePoints.js +7 -8
- package/es-modules/Extensions/Drilldown.js +11 -7
- package/es-modules/Extensions/ExportData.js +6 -5
- package/es-modules/Extensions/Exporting/Exporting.js +35 -48
- package/es-modules/Extensions/Exporting/ExportingDefaults.js +8 -15
- package/es-modules/Extensions/FullScreen.js +4 -3
- package/es-modules/Extensions/GeoJSON.js +42 -66
- package/es-modules/Extensions/MarkerClusters.js +118 -98
- package/es-modules/Extensions/Math3D.js +4 -4
- package/es-modules/Extensions/NoDataToDisplay.js +1 -2
- package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +33 -33
- package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +1 -1
- package/es-modules/Extensions/Oldie/Oldie.js +14 -79
- package/es-modules/Extensions/Oldie/VMLAxis3D.js +5 -1
- package/es-modules/Extensions/OverlappingDataLabels.js +10 -6
- package/es-modules/Extensions/Pane.js +11 -12
- package/es-modules/Extensions/ParallelCoordinates.js +5 -3
- package/es-modules/Extensions/PatternFill.js +17 -11
- package/es-modules/Extensions/Polar.js +7 -4
- package/es-modules/Extensions/PriceIndication.js +2 -1
- package/es-modules/Extensions/RangeSelector.js +22 -59
- package/es-modules/Extensions/ScrollablePlotArea.js +2 -2
- package/es-modules/Extensions/SeriesLabel.js +1 -1
- package/es-modules/Extensions/Sonification/ChartSonify.js +279 -663
- package/es-modules/Extensions/Sonification/Earcon.js +136 -102
- package/es-modules/Extensions/Sonification/Instrument.js +493 -426
- package/es-modules/Extensions/Sonification/MusicalFrequencies.js +10 -0
- package/es-modules/Extensions/Sonification/Options.js +10 -0
- package/es-modules/Extensions/Sonification/PointSonify.js +207 -152
- package/es-modules/Extensions/Sonification/SeriesSonify.js +474 -0
- package/es-modules/Extensions/Sonification/SignalHandler.js +122 -0
- package/es-modules/Extensions/Sonification/Sonification.js +27 -53
- package/es-modules/Extensions/Sonification/{Utilities.js → SonificationUtilities.js} +70 -88
- package/es-modules/Extensions/Sonification/Timeline.js +250 -567
- package/es-modules/Extensions/Sonification/TimelineEvent.js +157 -0
- package/es-modules/Extensions/Sonification/TimelinePath.js +311 -0
- package/es-modules/Extensions/Stacking.js +5 -23
- package/es-modules/Extensions/Themes/BrandDark.js +293 -0
- package/es-modules/Extensions/Themes/BrandLight.js +259 -0
- package/es-modules/Extensions/Themes/DarkUnica.js +4 -2
- package/es-modules/Extensions/Themes/Grid.js +4 -2
- package/es-modules/Extensions/Themes/GridLight.js +4 -2
- package/es-modules/Gantt/Connection.js +2 -2
- package/es-modules/Gantt/Pathfinder.js +6 -5
- package/es-modules/Gantt/PathfinderAlgorithms.js +12 -12
- package/es-modules/Maps/MapNavigation.js +30 -68
- package/es-modules/Maps/MapNavigationOptionsDefault.js +3 -0
- package/es-modules/Maps/MapPointer.js +8 -5
- package/es-modules/Maps/MapSymbols.js +23 -3
- package/es-modules/Maps/MapView.js +450 -0
- package/es-modules/Maps/MapViewOptionsDefault.js +97 -0
- package/es-modules/Maps/Projection.js +436 -0
- package/es-modules/Maps/ProjectionDefinition.js +9 -0
- package/es-modules/Maps/Projections/EqualEarth.js +42 -0
- package/es-modules/Maps/Projections/LambertConformalConic.js +52 -0
- package/es-modules/Maps/Projections/Miller.js +16 -0
- package/es-modules/Maps/Projections/Orthographic.js +26 -0
- package/es-modules/Maps/Projections/ProjectionRegistry.js +19 -0
- package/es-modules/Maps/Projections/WebMercator.js +24 -0
- package/es-modules/Series/Area/AreaSeries.js +13 -13
- package/es-modules/Series/Area3DSeries.js +4 -2
- package/es-modules/Series/AreaRange/AreaRangeSeries.js +28 -17
- package/es-modules/Series/Bellcurve/BellcurveSeries.js +4 -9
- package/es-modules/Series/BoxPlot/BoxPlotSeries.js +1 -2
- package/es-modules/Series/Bubble/BubbleLegendDefaults.js +1 -2
- package/es-modules/Series/Bubble/BubbleLegendItem.js +5 -15
- package/es-modules/Series/Bubble/BubblePoint.js +5 -0
- package/es-modules/Series/Bubble/BubbleSeries.js +90 -50
- package/es-modules/Series/Candlestick/CandlestickSeries.js +10 -19
- package/es-modules/{Mixins/CenteredSeries.js → Series/CenteredUtilities.js} +45 -23
- package/es-modules/{Mixins/ColorMapSeries.js → Series/ColorMapMixin.js} +10 -8
- package/es-modules/Series/Column/ColumnDataLabel.js +5 -5
- package/es-modules/Series/Column/ColumnSeries.js +19 -18
- package/es-modules/Series/Column3D/Column3DComposition.js +1 -2
- package/es-modules/Series/ColumnPyramid/ColumnPyramidSeries.js +11 -8
- package/es-modules/Series/ColumnRange/ColumnRangeSeries.js +2 -1
- package/es-modules/Series/Cylinder/CylinderComposition.js +36 -4
- package/es-modules/Series/DataModifyComposition.js +539 -0
- package/es-modules/Series/DependencyWheel/DependencyWheelPoint.js +2 -6
- package/es-modules/Series/DependencyWheel/DependencyWheelSeries.js +1 -1
- package/es-modules/Series/DerivedComposition.js +137 -0
- package/es-modules/Series/DrawPointComposition.js +111 -0
- package/es-modules/Series/Dumbbell/DumbbellPoint.js +0 -1
- package/es-modules/Series/Dumbbell/DumbbellSeries.js +2 -6
- package/es-modules/Series/ErrorBar/ErrorBarSeries.js +1 -2
- package/es-modules/Series/Flags/FlagsSeries.js +18 -25
- package/es-modules/Series/Flags/FlagsSymbols.js +2 -2
- package/es-modules/Series/Funnel/FunnelSeries.js +6 -5
- package/es-modules/Series/Funnel3D/Funnel3DComposition.js +14 -8
- package/es-modules/Series/Funnel3D/Funnel3DSeries.js +2 -1
- package/es-modules/Series/Gantt/GanttPoint.js +1 -1
- package/es-modules/Series/Gantt/GanttSeries.js +3 -3
- package/es-modules/Series/Gauge/GaugePoint.js +1 -1
- package/es-modules/Series/Gauge/GaugeSeries.js +7 -7
- package/es-modules/Series/HLC/HLCPoint.js +55 -0
- package/es-modules/Series/HLC/HLCSeries.js +378 -0
- package/es-modules/Series/Heatmap/HeatmapPoint.js +13 -14
- package/es-modules/Series/Heatmap/HeatmapSeries.js +24 -12
- package/es-modules/Series/HeikinAshi/HeikinAshiSeries.js +10 -9
- package/es-modules/Series/Histogram/HistogramSeries.js +7 -11
- package/es-modules/Series/HollowCandlestick/HollowCandlestickPoint.js +1 -4
- package/es-modules/Series/HollowCandlestick/HollowCandlestickSeries.js +28 -30
- package/es-modules/Series/Item/ItemSeries.js +4 -5
- package/es-modules/Series/Line/LineSeries.js +1 -2
- package/es-modules/Series/Map/MapPoint.js +27 -14
- package/es-modules/Series/Map/MapSeries.js +283 -322
- package/es-modules/Series/MapBubble/MapBubblePoint.js +0 -3
- package/es-modules/Series/MapBubble/MapBubbleSeries.js +10 -1
- package/es-modules/Series/MapLine/MapLineSeries.js +2 -4
- package/es-modules/Series/MapPoint/MapPointPoint.js +5 -1
- package/es-modules/Series/MapPoint/MapPointSeries.js +99 -14
- package/es-modules/Series/Networkgraph/DraggableNodes.js +0 -4
- package/es-modules/Series/Networkgraph/Integrations.js +8 -22
- package/es-modules/Series/Networkgraph/Networkgraph.js +6 -10
- package/es-modules/Series/Networkgraph/QuadTree.js +1 -3
- package/es-modules/{Mixins/Nodes.js → Series/NodesComposition.js} +78 -30
- package/es-modules/Series/OHLC/OHLCPoint.js +2 -7
- package/es-modules/Series/OHLC/OHLCSeries.js +55 -183
- package/es-modules/{Mixins/OnSeries.js → Series/OnSeriesComposition.js} +53 -21
- package/es-modules/Series/Organization/OrganizationSeries.js +6 -5
- package/es-modules/Series/PackedBubble/PackedBubbleComposition.js +1 -0
- package/es-modules/Series/PackedBubble/PackedBubblePoint.js +1 -1
- package/es-modules/Series/PackedBubble/PackedBubbleSeries.js +48 -10
- package/es-modules/Series/ParetoSeries/ParetoSeries.js +3 -7
- package/es-modules/Series/Pie/PieDataLabel.js +1 -2
- package/es-modules/Series/Pie/PiePoint.js +2 -2
- package/es-modules/Series/Pie/PieSeries.js +7 -8
- package/es-modules/Series/Pie3D/Pie3DComposition.js +2 -1
- package/es-modules/Series/Pie3D/Pie3DPoint.js +2 -1
- package/es-modules/Series/Pie3D/Pie3DSeries.js +1 -1
- package/es-modules/Series/Pyramid3D/Pyramid3DSeries.js +2 -1
- package/es-modules/Series/Sankey/SankeyPoint.js +0 -4
- package/es-modules/Series/Sankey/SankeySeries.js +92 -22
- package/es-modules/Series/SolidGauge/SolidGaugeComposition.js +3 -1
- package/es-modules/Series/Spline/SplineSeries.js +0 -8
- package/es-modules/Series/Sunburst/SunburstPoint.js +2 -3
- package/es-modules/Series/Sunburst/SunburstSeries.js +6 -6
- package/es-modules/Series/Sunburst/SunburstUtilities.js +3 -2
- package/es-modules/Series/Tilemap/TilemapPoint.js +2 -5
- package/es-modules/Series/Tilemap/TilemapShapes.js +0 -7
- package/es-modules/Series/Timeline/TimelineSeries.js +3 -4
- package/es-modules/{Mixins/TreeSeries.js → Series/TreeUtilities.js} +88 -78
- package/es-modules/Series/Treemap/TreemapPoint.js +2 -2
- package/es-modules/Series/Treemap/TreemapSeries.js +22 -25
- package/es-modules/Series/Variwide/VariwideSeries.js +5 -1
- package/es-modules/Series/Venn/VennPoint.js +16 -7
- package/es-modules/Series/Venn/VennSeries.js +11 -17
- package/es-modules/Series/Venn/VennUtils.js +551 -439
- package/es-modules/Series/Waterfall/WaterfallSeries.js +8 -6
- package/es-modules/Series/Windbarb/WindbarbSeries.js +23 -24
- package/es-modules/Series/Wordcloud/WordcloudPoint.js +8 -6
- package/es-modules/Series/Wordcloud/WordcloudSeries.js +26 -22
- package/es-modules/Series/Wordcloud/WordcloudUtils.js +669 -484
- package/es-modules/Series/XRange/XRangePoint.js +7 -12
- package/es-modules/Series/XRange/XRangeSeries.js +4 -20
- package/es-modules/Stock/Indicators/ABands/ABandsIndicator.js +15 -6
- package/es-modules/Stock/Indicators/AO/AOIndicator.js +2 -3
- package/es-modules/Stock/Indicators/APO/APOIndicator.js +14 -20
- package/es-modules/Stock/Indicators/Aroon/AroonIndicator.js +4 -6
- package/es-modules/Stock/Indicators/AroonOscillator/AroonOscillatorIndicator.js +11 -13
- package/es-modules/Stock/Indicators/ArrayUtilities.js +47 -0
- package/es-modules/Stock/Indicators/BB/BBIndicator.js +39 -11
- package/es-modules/Stock/Indicators/CMF/CMFIndicator.js +35 -15
- package/es-modules/Stock/Indicators/Chaikin/ChaikinIndicator.js +6 -12
- package/es-modules/Stock/Indicators/DEMA/DEMAIndicator.js +1 -11
- package/es-modules/Stock/Indicators/DMI/DMIIndicator.js +28 -16
- package/es-modules/Stock/Indicators/DisparityIndex/DisparityIndexIndicator.js +18 -11
- package/es-modules/Stock/Indicators/EMA/EMAIndicator.js +1 -3
- package/es-modules/Stock/Indicators/IKH/IKHIndicator.js +6 -6
- package/es-modules/Stock/Indicators/KeltnerChannels/KeltnerChannelsIndicator.js +23 -9
- package/es-modules/Stock/Indicators/Klinger/KlingerIndicator.js +16 -19
- package/es-modules/Stock/Indicators/LinearRegression/LinearRegression.js +32 -14
- package/es-modules/Stock/Indicators/LinearRegressionAngle/LinearRegressionAngle.js +2 -2
- package/es-modules/Stock/Indicators/LinearRegressionIntercept/LinearRegressionIntercept.js +2 -2
- package/es-modules/Stock/Indicators/LinearRegressionSlopes/LinearRegressionSlopes.js +2 -2
- package/es-modules/Stock/Indicators/MACD/MACDIndicator.js +2 -3
- package/es-modules/Stock/Indicators/MultipleLinesComposition.js +294 -0
- package/es-modules/Stock/Indicators/NATR/NATRIndicator.js +1 -3
- package/es-modules/Stock/Indicators/PC/PCIndicator.js +25 -13
- package/es-modules/Stock/Indicators/PPO/PPOIndicator.js +1 -11
- package/es-modules/Stock/Indicators/PivotPoints/PivotPointsIndicator.js +2 -1
- package/es-modules/Stock/Indicators/RSI/RSIIndicator.js +2 -1
- package/es-modules/Stock/Indicators/SMA/SMAComposition.js +0 -26
- package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +32 -50
- package/es-modules/Stock/Indicators/SlowStochastic/SlowStochasticIndicator.js +0 -8
- package/es-modules/Stock/Indicators/Stochastic/StochasticIndicator.js +18 -9
- package/es-modules/Stock/Indicators/Supertrend/SupertrendIndicator.js +4 -6
- package/es-modules/Stock/Indicators/TEMA/TEMAIndicator.js +26 -11
- package/es-modules/Stock/Indicators/TRIX/TRIXIndicator.js +6 -12
- package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +26 -10
- package/es-modules/Stock/Indicators/VWAP/VWAPIndicator.js +19 -7
- package/es-modules/Stock/Indicators/WilliamsR/WilliamsRIndicator.js +2 -3
- package/es-modules/Stock/StockToolsBindings.js +156 -47
- package/es-modules/Stock/StockToolsGui.js +442 -37
- package/es-modules/masters/highcharts-3d.src.js +1 -1
- package/es-modules/masters/highcharts-gantt.src.js +1 -1
- package/es-modules/masters/highcharts-more.src.js +1 -1
- package/es-modules/masters/highcharts.src.js +1 -1
- package/es-modules/masters/highmaps.src.js +1 -1
- package/es-modules/masters/highstock.src.js +1 -1
- package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
- package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
- package/es-modules/masters/indicators/ao.src.js +1 -1
- package/es-modules/masters/indicators/apo.src.js +1 -1
- package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
- package/es-modules/masters/indicators/aroon.src.js +1 -1
- package/es-modules/masters/indicators/atr.src.js +1 -1
- package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
- package/es-modules/masters/indicators/cci.src.js +1 -1
- package/es-modules/masters/indicators/chaikin.src.js +1 -1
- package/es-modules/masters/indicators/cmf.src.js +1 -1
- package/es-modules/masters/indicators/cmo.src.js +1 -1
- package/es-modules/masters/indicators/dema.src.js +1 -1
- package/es-modules/masters/indicators/disparity-index.src.js +1 -1
- package/es-modules/masters/indicators/dmi.src.js +1 -1
- package/es-modules/masters/indicators/dpo.src.js +1 -1
- package/es-modules/masters/indicators/ema.src.js +4 -10
- package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/es-modules/masters/indicators/indicators-all.src.js +2 -2
- package/es-modules/masters/indicators/indicators.src.js +2 -1
- package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
- package/es-modules/masters/indicators/klinger.src.js +1 -1
- package/es-modules/masters/indicators/macd.src.js +1 -1
- package/es-modules/masters/indicators/mfi.src.js +1 -1
- package/es-modules/masters/indicators/momentum.src.js +1 -1
- package/es-modules/masters/indicators/natr.src.js +1 -1
- package/es-modules/masters/indicators/obv.src.js +1 -1
- package/es-modules/masters/indicators/pivot-points.src.js +1 -1
- package/es-modules/masters/indicators/ppo.src.js +1 -1
- package/es-modules/masters/indicators/price-channel.src.js +1 -1
- package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
- package/es-modules/masters/indicators/psar.src.js +1 -1
- package/es-modules/masters/indicators/regressions.src.js +1 -1
- package/es-modules/masters/indicators/roc.src.js +1 -1
- package/es-modules/masters/indicators/rsi.src.js +1 -1
- package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
- package/es-modules/masters/indicators/stochastic.src.js +1 -1
- package/es-modules/masters/indicators/supertrend.src.js +1 -1
- package/es-modules/masters/indicators/tema.src.js +1 -1
- package/es-modules/masters/indicators/trendline.src.js +1 -1
- package/es-modules/masters/indicators/trix.src.js +1 -1
- package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
- package/es-modules/masters/indicators/vwap.src.js +1 -1
- package/es-modules/masters/indicators/williams-r.src.js +1 -1
- package/es-modules/masters/indicators/wma.src.js +1 -1
- package/es-modules/masters/indicators/zigzag.src.js +1 -1
- package/es-modules/masters/modules/accessibility.src.js +16 -2
- package/es-modules/masters/modules/annotations-advanced.src.js +3 -1
- package/es-modules/masters/modules/annotations.src.js +1 -1
- package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
- package/es-modules/masters/modules/boost-canvas.src.js +1 -1
- package/es-modules/masters/modules/boost.src.js +1 -1
- package/es-modules/masters/modules/broken-axis.src.js +1 -1
- package/es-modules/masters/modules/bullet.src.js +1 -1
- package/es-modules/masters/modules/coloraxis.src.js +1 -1
- package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
- package/es-modules/masters/modules/cylinder.src.js +1 -1
- package/es-modules/masters/modules/data.src.js +6 -3
- package/es-modules/masters/modules/datagrouping.src.js +1 -1
- package/es-modules/masters/modules/debugger.src.js +1 -1
- package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
- package/es-modules/masters/modules/dotplot.src.js +1 -1
- package/es-modules/masters/modules/drag-panes.src.js +1 -1
- package/es-modules/masters/modules/draggable-points.src.js +1 -1
- package/es-modules/masters/modules/drilldown.src.js +1 -1
- package/es-modules/masters/modules/dumbbell.src.js +1 -1
- package/es-modules/masters/modules/export-data.src.js +1 -1
- package/es-modules/masters/modules/exporting.src.js +1 -1
- package/es-modules/masters/modules/full-screen.src.js +1 -1
- package/es-modules/masters/modules/funnel.src.js +1 -1
- package/es-modules/masters/modules/funnel3d.src.js +1 -1
- package/es-modules/masters/modules/gantt.src.js +1 -1
- package/es-modules/masters/modules/grid-axis.src.js +1 -1
- package/es-modules/masters/modules/heatmap.src.js +1 -2
- package/es-modules/masters/modules/heikinashi.src.js +1 -1
- package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
- package/es-modules/masters/modules/hollowcandlestick.src.js +1 -1
- package/es-modules/masters/modules/item-series.src.js +1 -1
- package/es-modules/masters/modules/lollipop.src.js +1 -1
- package/es-modules/masters/modules/map.src.js +1 -3
- package/es-modules/masters/modules/marker-clusters.src.js +1 -1
- package/es-modules/masters/modules/networkgraph.src.js +1 -1
- package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
- package/es-modules/masters/modules/offline-exporting.src.js +1 -1
- package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
- package/es-modules/masters/modules/oldie.src.js +1 -1
- package/es-modules/masters/modules/organization.src.js +1 -1
- package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
- package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
- package/es-modules/masters/modules/pareto.src.js +1 -1
- package/es-modules/masters/modules/pathfinder.src.js +1 -1
- package/es-modules/masters/modules/pattern-fill.src.js +1 -1
- package/es-modules/masters/modules/price-indicator.src.js +1 -1
- package/es-modules/masters/modules/pyramid3d.src.js +1 -1
- package/es-modules/masters/modules/sankey.src.js +1 -1
- package/es-modules/masters/modules/series-label.src.js +1 -1
- package/es-modules/masters/modules/solid-gauge.src.js +1 -1
- package/es-modules/masters/modules/sonification.src.js +33 -2
- package/es-modules/masters/modules/static-scale.src.js +1 -1
- package/es-modules/masters/modules/stock-tools.src.js +1 -1
- package/es-modules/masters/modules/stock.src.js +4 -1
- package/es-modules/masters/modules/streamgraph.src.js +1 -1
- package/es-modules/masters/modules/sunburst.src.js +1 -1
- package/es-modules/masters/modules/tilemap.src.js +1 -1
- package/es-modules/masters/modules/timeline.src.js +1 -1
- package/es-modules/masters/modules/treegrid.src.js +1 -1
- package/es-modules/masters/modules/treemap.src.js +1 -1
- package/es-modules/masters/modules/variable-pie.src.js +1 -1
- package/es-modules/masters/modules/variwide.src.js +1 -1
- package/es-modules/masters/modules/vector.src.js +1 -1
- package/es-modules/masters/modules/venn.src.js +1 -1
- package/es-modules/masters/modules/windbarb.src.js +1 -1
- package/es-modules/masters/modules/wordcloud.src.js +1 -1
- package/es-modules/masters/modules/xrange.src.js +1 -1
- package/es-modules/masters/themes/avocado.src.js +1 -1
- package/es-modules/masters/themes/brand-dark.src.js +14 -0
- package/es-modules/masters/themes/brand-light.src.js +14 -0
- package/es-modules/masters/themes/dark-blue.src.js +1 -1
- package/es-modules/masters/themes/dark-green.src.js +1 -1
- package/es-modules/masters/themes/dark-unica.src.js +1 -1
- package/es-modules/masters/themes/gray.src.js +1 -1
- package/es-modules/masters/themes/grid-light.src.js +1 -1
- package/es-modules/masters/themes/grid.src.js +1 -1
- package/es-modules/masters/themes/high-contrast-dark.src.js +1 -1
- package/es-modules/masters/themes/high-contrast-light.src.js +1 -1
- package/es-modules/masters/themes/sand-signika.src.js +1 -1
- package/es-modules/masters/themes/skies.src.js +1 -1
- package/es-modules/masters/themes/sunset.src.js +1 -1
- package/highcharts-3d.js +1 -1
- package/highcharts-3d.js.map +1 -1
- package/highcharts-3d.src.js +65 -35
- package/highcharts-gantt.js +800 -803
- package/highcharts-gantt.js.map +1 -1
- package/highcharts-gantt.src.js +1359 -1429
- package/highcharts-more.js +194 -193
- package/highcharts-more.js.map +1 -1
- package/highcharts-more.src.js +280 -222
- package/highcharts.d.ts +10228 -768
- package/highcharts.js +585 -588
- package/highcharts.js.map +1 -1
- package/highcharts.src.d.ts +10228 -768
- package/highcharts.src.js +995 -1066
- package/highmaps.js +727 -707
- package/highmaps.js.map +1 -1
- package/highmaps.src.js +3243 -2135
- package/highstock.js +788 -783
- package/highstock.js.map +1 -1
- package/highstock.src.js +2492 -1981
- package/indicators/acceleration-bands.d.ts +17 -1
- package/indicators/acceleration-bands.js +11 -9
- package/indicators/acceleration-bands.js.map +1 -1
- package/indicators/acceleration-bands.src.d.ts +17 -1
- package/indicators/acceleration-bands.src.js +238 -112
- package/indicators/accumulation-distribution.js +1 -1
- package/indicators/accumulation-distribution.src.js +1 -1
- package/indicators/ao.js +6 -6
- package/indicators/ao.js.map +1 -1
- package/indicators/ao.src.js +4 -4
- package/indicators/apo.js +5 -6
- package/indicators/apo.js.map +1 -1
- package/indicators/apo.src.js +16 -84
- package/indicators/aroon-oscillator.d.ts +17 -1
- package/indicators/aroon-oscillator.js +10 -9
- package/indicators/aroon-oscillator.js.map +1 -1
- package/indicators/aroon-oscillator.src.d.ts +17 -1
- package/indicators/aroon-oscillator.src.js +230 -177
- package/indicators/aroon.d.ts +17 -1
- package/indicators/aroon.js +11 -9
- package/indicators/aroon.js.map +1 -1
- package/indicators/aroon.src.d.ts +17 -1
- package/indicators/aroon.src.js +227 -112
- package/indicators/atr.js +1 -1
- package/indicators/atr.src.js +1 -1
- package/indicators/bollinger-bands.d.ts +17 -1
- package/indicators/bollinger-bands.js +12 -9
- package/indicators/bollinger-bands.js.map +1 -1
- package/indicators/bollinger-bands.src.d.ts +17 -1
- package/indicators/bollinger-bands.src.js +262 -117
- package/indicators/cci.js +1 -1
- package/indicators/cci.src.js +1 -1
- package/indicators/chaikin.js +8 -9
- package/indicators/chaikin.js.map +1 -1
- package/indicators/chaikin.src.js +8 -76
- package/indicators/cmf.js +1 -1
- package/indicators/cmf.js.map +1 -1
- package/indicators/cmf.src.js +36 -16
- package/indicators/cmo.js +1 -1
- package/indicators/cmo.src.js +1 -1
- package/indicators/dema.js +5 -6
- package/indicators/dema.js.map +1 -1
- package/indicators/dema.src.js +3 -75
- package/indicators/disparity-index.js +6 -7
- package/indicators/disparity-index.js.map +1 -1
- package/indicators/disparity-index.src.js +20 -74
- package/indicators/dmi.js +12 -11
- package/indicators/dmi.js.map +1 -1
- package/indicators/dmi.src.js +252 -121
- package/indicators/dpo.js +1 -1
- package/indicators/dpo.src.js +1 -1
- package/indicators/ema.js +1 -13
- package/indicators/ema.js.map +1 -1
- package/indicators/ema.src.js +7 -188
- package/indicators/ichimoku-kinko-hyo.js +1 -1
- package/indicators/ichimoku-kinko-hyo.js.map +1 -1
- package/indicators/ichimoku-kinko-hyo.src.js +7 -7
- package/indicators/indicators-all.d.ts +17 -1
- package/indicators/indicators-all.js +198 -203
- package/indicators/indicators-all.js.map +1 -1
- package/indicators/indicators-all.src.d.ts +17 -1
- package/indicators/indicators-all.src.js +892 -777
- package/indicators/indicators.js +12 -12
- package/indicators/indicators.js.map +1 -1
- package/indicators/indicators.src.js +213 -144
- package/indicators/keltner-channels.d.ts +17 -1
- package/indicators/keltner-channels.js +11 -10
- package/indicators/keltner-channels.js.map +1 -1
- package/indicators/keltner-channels.src.d.ts +17 -1
- package/indicators/keltner-channels.src.js +246 -118
- package/indicators/klinger.js +14 -13
- package/indicators/klinger.js.map +1 -1
- package/indicators/klinger.src.js +239 -187
- package/indicators/macd.js +2 -2
- package/indicators/macd.js.map +1 -1
- package/indicators/macd.src.js +3 -4
- package/indicators/mfi.js +1 -1
- package/indicators/mfi.src.js +1 -1
- package/indicators/momentum.js +1 -1
- package/indicators/momentum.src.js +1 -1
- package/indicators/natr.js +3 -3
- package/indicators/natr.js.map +1 -1
- package/indicators/natr.src.js +2 -4
- package/indicators/obv.js +1 -1
- package/indicators/obv.src.js +1 -1
- package/indicators/pivot-points.js +1 -1
- package/indicators/pivot-points.js.map +1 -1
- package/indicators/pivot-points.src.js +3 -2
- package/indicators/ppo.js +5 -6
- package/indicators/ppo.js.map +1 -1
- package/indicators/ppo.src.js +3 -75
- package/indicators/price-channel.d.ts +17 -1
- package/indicators/price-channel.js +11 -9
- package/indicators/price-channel.js.map +1 -1
- package/indicators/price-channel.src.d.ts +17 -1
- package/indicators/price-channel.src.js +288 -168
- package/indicators/price-envelopes.js +1 -1
- package/indicators/price-envelopes.src.js +1 -1
- package/indicators/psar.js +1 -1
- package/indicators/psar.src.js +1 -1
- package/indicators/regressions.js +1 -1
- package/indicators/regressions.js.map +1 -1
- package/indicators/regressions.src.js +39 -21
- package/indicators/roc.js +1 -1
- package/indicators/roc.src.js +1 -1
- package/indicators/rsi.js +1 -1
- package/indicators/rsi.js.map +1 -1
- package/indicators/rsi.src.js +3 -2
- package/indicators/slow-stochastic.js +5 -6
- package/indicators/slow-stochastic.js.map +1 -1
- package/indicators/slow-stochastic.src.js +2 -72
- package/indicators/stochastic.d.ts +17 -1
- package/indicators/stochastic.js +12 -10
- package/indicators/stochastic.js.map +1 -1
- package/indicators/stochastic.src.d.ts +17 -1
- package/indicators/stochastic.src.js +282 -165
- package/indicators/supertrend.js +10 -10
- package/indicators/supertrend.js.map +1 -1
- package/indicators/supertrend.src.js +6 -7
- package/indicators/tema.js +6 -7
- package/indicators/tema.js.map +1 -1
- package/indicators/tema.src.js +28 -75
- package/indicators/trendline.js +1 -1
- package/indicators/trendline.src.js +1 -1
- package/indicators/trix.js +4 -5
- package/indicators/trix.js.map +1 -1
- package/indicators/trix.src.js +8 -76
- package/indicators/volume-by-price.js +16 -16
- package/indicators/volume-by-price.js.map +1 -1
- package/indicators/volume-by-price.src.js +27 -10
- package/indicators/vwap.js +1 -1
- package/indicators/vwap.js.map +1 -1
- package/indicators/vwap.src.js +20 -8
- package/indicators/williams-r.js +5 -6
- package/indicators/williams-r.js.map +1 -1
- package/indicators/williams-r.src.js +41 -51
- package/indicators/wma.js +1 -1
- package/indicators/wma.src.js +1 -1
- package/indicators/zigzag.js +1 -1
- package/indicators/zigzag.src.js +1 -1
- package/modules/accessibility.d.ts +0 -30
- package/modules/accessibility.js +240 -216
- package/modules/accessibility.js.map +1 -1
- package/modules/accessibility.src.d.ts +0 -30
- package/modules/accessibility.src.js +7807 -6400
- package/modules/annotations-advanced.d.ts +30 -0
- package/modules/annotations-advanced.js +192 -165
- package/modules/annotations-advanced.js.map +1 -1
- package/modules/annotations-advanced.src.d.ts +30 -0
- package/modules/annotations-advanced.src.js +1716 -416
- package/modules/annotations.js +125 -110
- package/modules/annotations.js.map +1 -1
- package/modules/annotations.src.js +1059 -304
- package/modules/arrow-symbols.js +1 -1
- package/modules/arrow-symbols.src.js +1 -1
- package/modules/boost-canvas.js +15 -15
- package/modules/boost-canvas.js.map +1 -1
- package/modules/boost-canvas.src.js +3 -3
- package/modules/boost.js +79 -79
- package/modules/boost.js.map +1 -1
- package/modules/boost.src.js +42 -51
- package/modules/broken-axis.js +1 -1
- package/modules/broken-axis.js.map +1 -1
- package/modules/broken-axis.src.js +18 -12
- package/modules/bullet.js +1 -1
- package/modules/bullet.src.js +1 -1
- package/modules/coloraxis.js +24 -24
- package/modules/coloraxis.js.map +1 -1
- package/modules/coloraxis.src.js +77 -103
- package/modules/current-date-indicator.js +4 -4
- package/modules/current-date-indicator.js.map +1 -1
- package/modules/current-date-indicator.src.js +4 -4
- package/modules/cylinder.js +1 -1
- package/modules/cylinder.js.map +1 -1
- package/modules/cylinder.src.js +37 -5
- package/modules/data.d.ts +6 -6
- package/modules/data.js +32 -32
- package/modules/data.js.map +1 -1
- package/modules/data.src.d.ts +6 -6
- package/modules/data.src.js +94 -140
- package/modules/datagrouping.js +20 -20
- package/modules/datagrouping.js.map +1 -1
- package/modules/datagrouping.src.js +56 -33
- package/modules/debugger.js +3 -3
- package/modules/debugger.js.map +1 -1
- package/modules/debugger.src.js +3 -3
- package/modules/dependency-wheel.js +11 -11
- package/modules/dependency-wheel.js.map +1 -1
- package/modules/dependency-wheel.src.js +5 -8
- package/modules/dotplot.js +1 -1
- package/modules/dotplot.src.js +1 -1
- package/modules/drag-panes.js +8 -8
- package/modules/drag-panes.js.map +1 -1
- package/modules/drag-panes.src.js +3 -3
- package/modules/draggable-points.js +1 -1
- package/modules/draggable-points.js.map +1 -1
- package/modules/draggable-points.src.js +8 -9
- package/modules/drilldown.js +24 -24
- package/modules/drilldown.js.map +1 -1
- package/modules/drilldown.src.js +13 -8
- package/modules/dumbbell.js +17 -17
- package/modules/dumbbell.js.map +1 -1
- package/modules/dumbbell.src.js +4 -8
- package/modules/export-data.js +19 -19
- package/modules/export-data.js.map +1 -1
- package/modules/export-data.src.js +9 -8
- package/modules/exporting.js +39 -38
- package/modules/exporting.js.map +1 -1
- package/modules/exporting.src.js +134 -116
- package/modules/full-screen.js +1 -1
- package/modules/full-screen.js.map +1 -1
- package/modules/full-screen.src.js +5 -4
- package/modules/funnel.js +12 -12
- package/modules/funnel.js.map +1 -1
- package/modules/funnel.src.js +9 -6
- package/modules/funnel3d.js +1 -1
- package/modules/funnel3d.js.map +1 -1
- package/modules/funnel3d.src.js +17 -10
- package/modules/gantt.js +217 -218
- package/modules/gantt.js.map +1 -1
- package/modules/gantt.src.js +364 -363
- package/modules/grid-axis.js +1 -1
- package/modules/grid-axis.js.map +1 -1
- package/modules/grid-axis.src.js +27 -19
- package/modules/heatmap.js +39 -39
- package/modules/heatmap.js.map +1 -1
- package/modules/heatmap.src.js +132 -141
- package/modules/heikinashi.js +1 -1
- package/modules/heikinashi.js.map +1 -1
- package/modules/heikinashi.src.js +12 -10
- package/modules/histogram-bellcurve.js +13 -13
- package/modules/histogram-bellcurve.js.map +1 -1
- package/modules/histogram-bellcurve.src.js +97 -91
- package/modules/hollowcandlestick.js +9 -9
- package/modules/hollowcandlestick.js.map +1 -1
- package/modules/hollowcandlestick.src.js +31 -35
- package/modules/item-series.js +6 -6
- package/modules/item-series.js.map +1 -1
- package/modules/item-series.src.js +6 -6
- package/modules/lollipop.js +1 -1
- package/modules/lollipop.src.js +1 -1
- package/modules/map.d.ts +138 -14
- package/modules/map.js +144 -122
- package/modules/map.js.map +1 -1
- package/modules/map.src.d.ts +138 -14
- package/modules/map.src.js +2253 -1074
- package/modules/marker-clusters.js +36 -36
- package/modules/marker-clusters.js.map +1 -1
- package/modules/marker-clusters.src.js +176 -143
- package/modules/networkgraph.d.ts +12 -1
- package/modules/networkgraph.js +49 -49
- package/modules/networkgraph.js.map +1 -1
- package/modules/networkgraph.src.d.ts +12 -1
- package/modules/networkgraph.src.js +103 -78
- package/modules/no-data-to-display.js +5 -5
- package/modules/no-data-to-display.js.map +1 -1
- package/modules/no-data-to-display.src.js +3 -3
- package/modules/offline-exporting.js +18 -17
- package/modules/offline-exporting.js.map +1 -1
- package/modules/offline-exporting.src.js +39 -44
- package/modules/oldie-polyfills.js +1 -1
- package/modules/oldie-polyfills.src.js +1 -1
- package/modules/oldie.js +26 -26
- package/modules/oldie.js.map +1 -1
- package/modules/oldie.src.js +21 -81
- package/modules/organization.js +13 -13
- package/modules/organization.js.map +1 -1
- package/modules/organization.src.js +8 -6
- package/modules/overlapping-datalabels.js +1 -1
- package/modules/overlapping-datalabels.src.js +1 -1
- package/modules/parallel-coordinates.js +1 -1
- package/modules/parallel-coordinates.js.map +1 -1
- package/modules/parallel-coordinates.src.js +6 -4
- package/modules/pareto.js +7 -7
- package/modules/pareto.js.map +1 -1
- package/modules/pareto.src.js +89 -78
- package/modules/pathfinder.js +1 -1
- package/modules/pathfinder.js.map +1 -1
- package/modules/pathfinder.src.js +21 -20
- package/modules/pattern-fill.js +1 -1
- package/modules/pattern-fill.js.map +1 -1
- package/modules/pattern-fill.src.js +18 -12
- package/modules/price-indicator.js +1 -1
- package/modules/price-indicator.js.map +1 -1
- package/modules/price-indicator.src.js +3 -2
- package/modules/pyramid3d.js +1 -1
- package/modules/pyramid3d.js.map +1 -1
- package/modules/pyramid3d.src.js +3 -2
- package/modules/sankey.d.ts +12 -1
- package/modules/sankey.js +29 -29
- package/modules/sankey.js.map +1 -1
- package/modules/sankey.src.d.ts +12 -1
- package/modules/sankey.src.js +307 -181
- package/modules/series-label.js +1 -1
- package/modules/series-label.js.map +1 -1
- package/modules/series-label.src.js +2 -2
- package/modules/solid-gauge.js +1 -1
- package/modules/solid-gauge.js.map +1 -1
- package/modules/solid-gauge.src.js +17 -2
- package/modules/sonification.js +59 -55
- package/modules/sonification.js.map +1 -1
- package/modules/sonification.src.js +3093 -2594
- package/modules/static-scale.js +1 -1
- package/modules/static-scale.src.js +1 -1
- package/modules/stock-tools.js +178 -163
- package/modules/stock-tools.js.map +1 -1
- package/modules/stock-tools.src.js +1136 -229
- package/modules/stock.d.ts +39 -6
- package/modules/stock.js +204 -196
- package/modules/stock.js.map +1 -1
- package/modules/stock.src.d.ts +39 -6
- package/modules/stock.src.js +1822 -1240
- package/modules/streamgraph.js +1 -1
- package/modules/streamgraph.src.js +1 -1
- package/modules/sunburst.js +60 -60
- package/modules/sunburst.js.map +1 -1
- package/modules/sunburst.src.js +281 -248
- package/modules/tilemap.js +17 -17
- package/modules/tilemap.js.map +1 -1
- package/modules/tilemap.src.js +3 -13
- package/modules/timeline.js +18 -18
- package/modules/timeline.js.map +1 -1
- package/modules/timeline.src.js +5 -5
- package/modules/treegrid.js +56 -57
- package/modules/treegrid.js.map +1 -1
- package/modules/treegrid.src.js +201 -169
- package/modules/treemap.js +41 -41
- package/modules/treemap.js.map +1 -1
- package/modules/treemap.src.js +266 -232
- package/modules/variable-pie.js +1 -1
- package/modules/variable-pie.src.js +1 -1
- package/modules/variwide.js +1 -1
- package/modules/variwide.js.map +1 -1
- package/modules/variwide.src.js +7 -3
- package/modules/vector.js +1 -1
- package/modules/vector.src.js +1 -1
- package/modules/venn.js +31 -31
- package/modules/venn.js.map +1 -1
- package/modules/venn.src.js +740 -731
- package/modules/windbarb.js +15 -15
- package/modules/windbarb.js.map +1 -1
- package/modules/windbarb.src.js +90 -62
- package/modules/wordcloud.js +23 -24
- package/modules/wordcloud.js.map +1 -1
- package/modules/wordcloud.src.js +898 -954
- package/modules/xrange.js +2 -2
- package/modules/xrange.js.map +1 -1
- package/modules/xrange.src.js +12 -33
- package/package.json +1 -1
- package/themes/avocado.js +1 -1
- package/themes/avocado.src.js +1 -1
- package/themes/brand-dark.js +15 -0
- package/themes/brand-dark.js.map +1 -0
- package/themes/brand-dark.src.js +328 -0
- package/themes/brand-light.js +15 -0
- package/themes/brand-light.js.map +1 -0
- package/themes/brand-light.src.js +294 -0
- package/themes/dark-blue.js +1 -1
- package/themes/dark-blue.src.js +1 -1
- package/themes/dark-green.js +1 -1
- package/themes/dark-green.src.js +1 -1
- package/themes/dark-unica.js +1 -1
- package/themes/dark-unica.js.map +1 -1
- package/themes/dark-unica.src.js +5 -3
- package/themes/gray.js +1 -1
- package/themes/gray.src.js +1 -1
- package/themes/grid-light.js +1 -1
- package/themes/grid-light.js.map +1 -1
- package/themes/grid-light.src.js +5 -3
- package/themes/grid.js +1 -1
- package/themes/grid.js.map +1 -1
- package/themes/grid.src.js +5 -3
- package/themes/high-contrast-dark.js +1 -1
- package/themes/high-contrast-dark.src.js +1 -1
- package/themes/high-contrast-light.js +1 -1
- package/themes/high-contrast-light.src.js +1 -1
- package/themes/sand-signika.js +1 -1
- package/themes/sand-signika.src.js +1 -1
- package/themes/skies.js +1 -1
- package/themes/skies.src.js +1 -1
- package/themes/sunset.js +1 -1
- package/themes/sunset.src.js +1 -1
- package/es-modules/Core/Axis/MapAxis.js +0 -157
- package/es-modules/Core/Color/Palette.js +0 -82
- package/es-modules/Extensions/Sonification/InstrumentDefinitions.js +0 -32
- package/es-modules/Mixins/ColorSeries.js +0 -77
- package/es-modules/Mixins/DerivedSeries.js +0 -118
- package/es-modules/Mixins/DrawPoint.js +0 -81
- package/es-modules/Mixins/IndicatorRequired.js +0 -56
- package/es-modules/Mixins/MultipleLines.js +0 -181
- package/es-modules/Mixins/Navigation.js +0 -54
- package/es-modules/Mixins/NelderMead.js +0 -132
- package/es-modules/Mixins/Polygon.js +0 -259
- package/es-modules/Mixins/ReduceArray.js +0 -54
package/modules/wordcloud.src.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Highcharts JS v9.2
|
|
2
|
+
* @license Highcharts JS v9.3.2 (2021-11-29)
|
|
3
3
|
*
|
|
4
4
|
* (c) 2016-2021 Highsoft AS
|
|
5
5
|
* Authors: Jon Arild Nygard
|
|
@@ -27,417 +27,123 @@
|
|
|
27
27
|
obj[path] = fn.apply(null, args);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
_registerModule(_modules, '
|
|
30
|
+
_registerModule(_modules, 'Series/DrawPointComposition.js', [], function () {
|
|
31
31
|
/* *
|
|
32
32
|
*
|
|
33
33
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
34
34
|
*
|
|
35
35
|
* */
|
|
36
|
-
/**
|
|
37
|
-
* @private
|
|
38
|
-
* @interface Highcharts.PolygonPointObject
|
|
39
|
-
*/ /**
|
|
40
|
-
* @name Highcharts.PolygonPointObject#0
|
|
41
|
-
* @type {number}
|
|
42
|
-
*/ /**
|
|
43
|
-
* @name Highcharts.PolygonPointObject#1
|
|
44
|
-
* @type {number}
|
|
45
|
-
*/
|
|
46
|
-
/**
|
|
47
|
-
* @private
|
|
48
|
-
* @interface Highcharts.PolygonObject
|
|
49
|
-
* @extends Array<Highcharts.PolygonPointObject>
|
|
50
|
-
*/ /**
|
|
51
|
-
* @name Highcharts.PolygonObject#axes
|
|
52
|
-
* @type {Array<PolygonPointObject>}
|
|
53
|
-
*/
|
|
54
|
-
var find = U.find,
|
|
55
|
-
isArray = U.isArray,
|
|
56
|
-
isNumber = U.isNumber;
|
|
57
|
-
var deg2rad = H.deg2rad;
|
|
58
|
-
/* eslint-disable no-invalid-this, valid-jsdoc */
|
|
59
|
-
/**
|
|
60
|
-
* Alternative solution to correctFloat.
|
|
61
|
-
* E.g Highcharts.correctFloat(123, 2) returns 120, when it should be 123.
|
|
62
|
-
*
|
|
63
|
-
* @private
|
|
64
|
-
* @function correctFloat
|
|
65
|
-
* @param {number} number
|
|
66
|
-
* @param {number} [precision]
|
|
67
|
-
* @return {number}
|
|
68
|
-
*/
|
|
69
|
-
var correctFloat = function (number,
|
|
70
|
-
precision) {
|
|
71
|
-
var p = isNumber(precision) ? precision : 14,
|
|
72
|
-
magnitude = Math.pow(10,
|
|
73
|
-
p);
|
|
74
|
-
return Math.round(number * magnitude) / magnitude;
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* Calculates the normals to a line between two points.
|
|
78
|
-
*
|
|
79
|
-
* @private
|
|
80
|
-
* @function getNormals
|
|
81
|
-
* @param {Highcharts.PolygonPointObject} p1
|
|
82
|
-
* Start point for the line. Array of x and y value.
|
|
83
|
-
* @param {Highcharts.PolygonPointObject} p2
|
|
84
|
-
* End point for the line. Array of x and y value.
|
|
85
|
-
* @return {Highcharts.PolygonObject}
|
|
86
|
-
* Returns the two normals in an array.
|
|
87
|
-
*/
|
|
88
|
-
var getNormals = function getNormal(p1,
|
|
89
|
-
p2) {
|
|
90
|
-
var dx = p2[0] - p1[0], // x2 - x1
|
|
91
|
-
dy = p2[1] - p1[1]; // y2 - y1
|
|
92
|
-
return [
|
|
93
|
-
[-dy,
|
|
94
|
-
dx],
|
|
95
|
-
[dy, -dx]
|
|
96
|
-
];
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* Calculates the dot product of two coordinates. The result is a scalar value.
|
|
100
|
-
*
|
|
101
|
-
* @private
|
|
102
|
-
* @function dotProduct
|
|
103
|
-
* @param {Highcharts.PolygonPointObject} a
|
|
104
|
-
* The x and y coordinates of the first point.
|
|
105
|
-
*
|
|
106
|
-
* @param {Highcharts.PolygonPointObject} b
|
|
107
|
-
* The x and y coordinates of the second point.
|
|
108
|
-
*
|
|
109
|
-
* @return {number}
|
|
110
|
-
* Returns the dot product of a and b.
|
|
111
|
-
*/
|
|
112
|
-
var dotProduct = function dotProduct(a,
|
|
113
|
-
b) {
|
|
114
|
-
var ax = a[0],
|
|
115
|
-
ay = a[1],
|
|
116
|
-
bx = b[0],
|
|
117
|
-
by = b[1];
|
|
118
|
-
return ax * bx + ay * by;
|
|
119
|
-
};
|
|
120
|
-
/**
|
|
121
|
-
* Projects a polygon onto a coordinate.
|
|
122
|
-
*
|
|
123
|
-
* @private
|
|
124
|
-
* @function project
|
|
125
|
-
* @param {Highcharts.PolygonObject} polygon
|
|
126
|
-
* Array of points in a polygon.
|
|
127
|
-
* @param {Highcharts.PolygonPointObject} target
|
|
128
|
-
* The coordinate of pr
|
|
129
|
-
* @return {Highcharts.RangeObject}
|
|
130
|
-
*/
|
|
131
|
-
var project = function project(polygon,
|
|
132
|
-
target) {
|
|
133
|
-
var products = polygon.map(function (point) {
|
|
134
|
-
return dotProduct(point,
|
|
135
|
-
target);
|
|
136
|
-
});
|
|
137
|
-
return {
|
|
138
|
-
min: Math.min.apply(this, products),
|
|
139
|
-
max: Math.max.apply(this, products)
|
|
140
|
-
};
|
|
141
|
-
};
|
|
142
|
-
/**
|
|
143
|
-
* Rotates a point clockwise around the origin.
|
|
144
|
-
*
|
|
145
|
-
* @private
|
|
146
|
-
* @function rotate2DToOrigin
|
|
147
|
-
* @param {Highcharts.PolygonPointObject} point
|
|
148
|
-
* The x and y coordinates for the point.
|
|
149
|
-
* @param {number} angle
|
|
150
|
-
* The angle of rotation.
|
|
151
|
-
* @return {Highcharts.PolygonPointObject}
|
|
152
|
-
* The x and y coordinate for the rotated point.
|
|
153
|
-
*/
|
|
154
|
-
var rotate2DToOrigin = function (point,
|
|
155
|
-
angle) {
|
|
156
|
-
var x = point[0],
|
|
157
|
-
y = point[1],
|
|
158
|
-
rad = deg2rad * -angle,
|
|
159
|
-
cosAngle = Math.cos(rad),
|
|
160
|
-
sinAngle = Math.sin(rad);
|
|
161
|
-
return [
|
|
162
|
-
correctFloat(x * cosAngle - y * sinAngle),
|
|
163
|
-
correctFloat(x * sinAngle + y * cosAngle)
|
|
164
|
-
];
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* Rotate a point clockwise around another point.
|
|
168
|
-
*
|
|
169
|
-
* @private
|
|
170
|
-
* @function rotate2DToPoint
|
|
171
|
-
* @param {Highcharts.PolygonPointObject} point
|
|
172
|
-
* The x and y coordinates for the point.
|
|
173
|
-
* @param {Highcharts.PolygonPointObject} origin
|
|
174
|
-
* The point to rotate around.
|
|
175
|
-
* @param {number} angle
|
|
176
|
-
* The angle of rotation.
|
|
177
|
-
* @return {Highcharts.PolygonPointObject}
|
|
178
|
-
* The x and y coordinate for the rotated point.
|
|
179
|
-
*/
|
|
180
|
-
var rotate2DToPoint = function (point,
|
|
181
|
-
origin,
|
|
182
|
-
angle) {
|
|
183
|
-
var x = point[0] - origin[0],
|
|
184
|
-
y = point[1] - origin[1],
|
|
185
|
-
rotated = rotate2DToOrigin([x,
|
|
186
|
-
y],
|
|
187
|
-
angle);
|
|
188
|
-
return [
|
|
189
|
-
rotated[0] + origin[0],
|
|
190
|
-
rotated[1] + origin[1]
|
|
191
|
-
];
|
|
192
|
-
};
|
|
193
|
-
/**
|
|
194
|
-
* @private
|
|
195
|
-
*/
|
|
196
|
-
var isAxesEqual = function (axis1,
|
|
197
|
-
axis2) {
|
|
198
|
-
return (axis1[0] === axis2[0] &&
|
|
199
|
-
axis1[1] === axis2[1]);
|
|
200
|
-
};
|
|
201
|
-
/**
|
|
202
|
-
* @private
|
|
203
|
-
*/
|
|
204
|
-
var getAxesFromPolygon = function (polygon) {
|
|
205
|
-
var points,
|
|
206
|
-
axes = polygon.axes;
|
|
207
|
-
if (!isArray(axes)) {
|
|
208
|
-
axes = [];
|
|
209
|
-
points = points = polygon.concat([polygon[0]]);
|
|
210
|
-
points.reduce(function findAxis(p1, p2) {
|
|
211
|
-
var normals = getNormals(p1,
|
|
212
|
-
p2),
|
|
213
|
-
axis = normals[0]; // Use the left normal as axis.
|
|
214
|
-
// Check that the axis is unique.
|
|
215
|
-
if (!find(axes,
|
|
216
|
-
function (existing) {
|
|
217
|
-
return isAxesEqual(existing,
|
|
218
|
-
axis);
|
|
219
|
-
})) {
|
|
220
|
-
axes.push(axis);
|
|
221
|
-
}
|
|
222
|
-
// Return p2 to be used as p1 in next iteration.
|
|
223
|
-
return p2;
|
|
224
|
-
});
|
|
225
|
-
polygon.axes = axes;
|
|
226
|
-
}
|
|
227
|
-
return axes;
|
|
228
|
-
};
|
|
229
|
-
/**
|
|
230
|
-
* @private
|
|
231
|
-
*/
|
|
232
|
-
var getAxes = function (polygon1,
|
|
233
|
-
polygon2) {
|
|
234
|
-
// Get the axis from both polygons.
|
|
235
|
-
var axes1 = getAxesFromPolygon(polygon1),
|
|
236
|
-
axes2 = getAxesFromPolygon(polygon2);
|
|
237
|
-
return axes1.concat(axes2);
|
|
238
|
-
};
|
|
239
|
-
/**
|
|
240
|
-
* @private
|
|
241
|
-
*/
|
|
242
|
-
var getPolygon = function (x,
|
|
243
|
-
y,
|
|
244
|
-
width,
|
|
245
|
-
height,
|
|
246
|
-
rotation) {
|
|
247
|
-
var origin = [x,
|
|
248
|
-
y],
|
|
249
|
-
left = x - (width / 2),
|
|
250
|
-
right = x + (width / 2),
|
|
251
|
-
top = y - (height / 2),
|
|
252
|
-
bottom = y + (height / 2),
|
|
253
|
-
polygon = [
|
|
254
|
-
[left,
|
|
255
|
-
top],
|
|
256
|
-
[right,
|
|
257
|
-
top],
|
|
258
|
-
[right,
|
|
259
|
-
bottom],
|
|
260
|
-
[left,
|
|
261
|
-
bottom]
|
|
262
|
-
];
|
|
263
|
-
return polygon.map(function (point) {
|
|
264
|
-
return rotate2DToPoint(point, origin, -rotation);
|
|
265
|
-
});
|
|
266
|
-
};
|
|
267
|
-
/**
|
|
268
|
-
* @private
|
|
269
|
-
*/
|
|
270
|
-
var getBoundingBoxFromPolygon = function (points) {
|
|
271
|
-
return points.reduce(function (obj,
|
|
272
|
-
point) {
|
|
273
|
-
var x = point[0],
|
|
274
|
-
y = point[1];
|
|
275
|
-
obj.left = Math.min(x, obj.left);
|
|
276
|
-
obj.right = Math.max(x, obj.right);
|
|
277
|
-
obj.bottom = Math.max(y, obj.bottom);
|
|
278
|
-
obj.top = Math.min(y, obj.top);
|
|
279
|
-
return obj;
|
|
280
|
-
}, {
|
|
281
|
-
left: Number.MAX_VALUE,
|
|
282
|
-
right: -Number.MAX_VALUE,
|
|
283
|
-
bottom: -Number.MAX_VALUE,
|
|
284
|
-
top: Number.MAX_VALUE
|
|
285
|
-
});
|
|
286
|
-
};
|
|
287
|
-
/**
|
|
288
|
-
* @private
|
|
289
|
-
*/
|
|
290
|
-
var isPolygonsOverlappingOnAxis = function (axis,
|
|
291
|
-
polygon1,
|
|
292
|
-
polygon2) {
|
|
293
|
-
var projection1 = project(polygon1,
|
|
294
|
-
axis),
|
|
295
|
-
projection2 = project(polygon2,
|
|
296
|
-
axis),
|
|
297
|
-
isOverlapping = !(projection2.min > projection1.max ||
|
|
298
|
-
projection2.max < projection1.min);
|
|
299
|
-
return !isOverlapping;
|
|
300
|
-
};
|
|
301
|
-
/**
|
|
302
|
-
* Checks wether two convex polygons are colliding by using the Separating Axis
|
|
303
|
-
* Theorem.
|
|
304
|
-
*
|
|
305
|
-
* @private
|
|
306
|
-
* @function isPolygonsColliding
|
|
307
|
-
* @param {Highcharts.PolygonObject} polygon1
|
|
308
|
-
* First polygon.
|
|
309
|
-
*
|
|
310
|
-
* @param {Highcharts.PolygonObject} polygon2
|
|
311
|
-
* Second polygon.
|
|
312
|
-
*
|
|
313
|
-
* @return {boolean}
|
|
314
|
-
* Returns true if they are colliding, otherwise false.
|
|
315
|
-
*/
|
|
316
|
-
var isPolygonsColliding = function isPolygonsColliding(polygon1,
|
|
317
|
-
polygon2) {
|
|
318
|
-
var axes = getAxes(polygon1,
|
|
319
|
-
polygon2),
|
|
320
|
-
overlappingOnAllAxes = !find(axes,
|
|
321
|
-
function (axis) {
|
|
322
|
-
return isPolygonsOverlappingOnAxis(axis,
|
|
323
|
-
polygon1,
|
|
324
|
-
polygon2);
|
|
325
|
-
});
|
|
326
|
-
return overlappingOnAllAxes;
|
|
327
|
-
};
|
|
328
|
-
/**
|
|
329
|
-
* @private
|
|
330
|
-
*/
|
|
331
|
-
var movePolygon = function (deltaX,
|
|
332
|
-
deltaY,
|
|
333
|
-
polygon) {
|
|
334
|
-
return polygon.map(function (point) {
|
|
335
|
-
return [
|
|
336
|
-
point[0] + deltaX,
|
|
337
|
-
point[1] + deltaY
|
|
338
|
-
];
|
|
339
|
-
});
|
|
340
|
-
};
|
|
341
|
-
var collision = {
|
|
342
|
-
getBoundingBoxFromPolygon: getBoundingBoxFromPolygon,
|
|
343
|
-
getPolygon: getPolygon,
|
|
344
|
-
isPolygonsColliding: isPolygonsColliding,
|
|
345
|
-
movePolygon: movePolygon,
|
|
346
|
-
rotate2DToOrigin: rotate2DToOrigin,
|
|
347
|
-
rotate2DToPoint: rotate2DToPoint
|
|
348
|
-
};
|
|
349
|
-
|
|
350
|
-
return collision;
|
|
351
|
-
});
|
|
352
|
-
_registerModule(_modules, 'Mixins/DrawPoint.js', [], function () {
|
|
353
36
|
/* *
|
|
354
37
|
*
|
|
355
|
-
*
|
|
38
|
+
* Composition
|
|
356
39
|
*
|
|
357
40
|
* */
|
|
358
|
-
var
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
(
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
if (this.shouldDraw()) {
|
|
389
|
-
if (!graphic) {
|
|
390
|
-
this.graphic = graphic =
|
|
391
|
-
renderer[params.shapeType](params.shapeArgs)
|
|
392
|
-
.add(params.group);
|
|
41
|
+
var DrawPointComposition;
|
|
42
|
+
(function (DrawPointComposition) {
|
|
43
|
+
/* *
|
|
44
|
+
*
|
|
45
|
+
* Declarations
|
|
46
|
+
*
|
|
47
|
+
* */
|
|
48
|
+
/* *
|
|
49
|
+
*
|
|
50
|
+
* Constants
|
|
51
|
+
*
|
|
52
|
+
* */
|
|
53
|
+
var composedClasses = [];
|
|
54
|
+
/* *
|
|
55
|
+
*
|
|
56
|
+
* Functions
|
|
57
|
+
*
|
|
58
|
+
* */
|
|
59
|
+
/* eslint-disable valid-jsdoc */
|
|
60
|
+
/**
|
|
61
|
+
* @private
|
|
62
|
+
*/
|
|
63
|
+
function compose(PointClass) {
|
|
64
|
+
if (composedClasses.indexOf(PointClass) === -1) {
|
|
65
|
+
composedClasses.push(PointClass);
|
|
66
|
+
var pointProto = PointClass.prototype;
|
|
67
|
+
pointProto.draw = draw;
|
|
68
|
+
if (!pointProto.shouldDraw) {
|
|
69
|
+
pointProto.shouldDraw = shouldDraw;
|
|
70
|
+
}
|
|
393
71
|
}
|
|
394
|
-
|
|
395
|
-
.css(css)
|
|
396
|
-
.attr(params.attribs)
|
|
397
|
-
.animate(animatableAttribs, params.isNew ? false : animation, onComplete);
|
|
72
|
+
return PointClass;
|
|
398
73
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
74
|
+
DrawPointComposition.compose = compose;
|
|
75
|
+
/**
|
|
76
|
+
* Handles the drawing of a component.
|
|
77
|
+
* Can be used for any type of component that reserves the graphic property,
|
|
78
|
+
* and provides a shouldDraw on its context.
|
|
79
|
+
*
|
|
80
|
+
* @private
|
|
81
|
+
*
|
|
82
|
+
* @todo add type checking.
|
|
83
|
+
* @todo export this function to enable usage
|
|
84
|
+
*/
|
|
85
|
+
function draw(params) {
|
|
86
|
+
var _this = this;
|
|
87
|
+
var animatableAttribs = params.animatableAttribs,
|
|
88
|
+
onComplete = params.onComplete,
|
|
89
|
+
css = params.css,
|
|
90
|
+
renderer = params.renderer;
|
|
91
|
+
var animation = (this.series && this.series.chart.hasRendered) ?
|
|
92
|
+
// Chart-level animation on updates
|
|
93
|
+
void 0 :
|
|
94
|
+
// Series-level animation on new points
|
|
95
|
+
(this.series &&
|
|
96
|
+
this.series.options.animation);
|
|
97
|
+
var graphic = this.graphic;
|
|
98
|
+
params.attribs = params.attribs || {};
|
|
99
|
+
// Assigning class in dot notation does go well in IE8
|
|
100
|
+
// eslint-disable-next-line dot-notation
|
|
101
|
+
params.attribs['class'] = this.getClassName();
|
|
102
|
+
if (this.shouldDraw()) {
|
|
103
|
+
if (!graphic) {
|
|
104
|
+
this.graphic = graphic =
|
|
105
|
+
renderer[params.shapeType](params.shapeArgs)
|
|
106
|
+
.add(params.group);
|
|
404
107
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
destroy_1();
|
|
410
|
-
});
|
|
108
|
+
graphic
|
|
109
|
+
.css(css)
|
|
110
|
+
.attr(params.attribs)
|
|
111
|
+
.animate(animatableAttribs, params.isNew ? false : animation, onComplete);
|
|
411
112
|
}
|
|
412
|
-
else {
|
|
413
|
-
destroy_1()
|
|
113
|
+
else if (graphic) {
|
|
114
|
+
var destroy_1 = function () {
|
|
115
|
+
_this.graphic = graphic = (graphic && graphic.destroy());
|
|
116
|
+
if (typeof onComplete === 'function') {
|
|
117
|
+
onComplete();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
// animate only runs complete callback if something was animated.
|
|
121
|
+
if (Object.keys(animatableAttribs).length) {
|
|
122
|
+
graphic.animate(animatableAttribs, void 0, function () {
|
|
123
|
+
destroy_1();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
destroy_1();
|
|
128
|
+
}
|
|
414
129
|
}
|
|
415
130
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
attribs['class'] = point.getClassName();
|
|
429
|
-
// Call draw to render component
|
|
430
|
-
draw.call(point, params);
|
|
431
|
-
};
|
|
432
|
-
var drawPointModule = {
|
|
433
|
-
draw: draw,
|
|
434
|
-
drawPoint: drawPoint,
|
|
435
|
-
isFn: isFn
|
|
436
|
-
};
|
|
131
|
+
/**
|
|
132
|
+
* @private
|
|
133
|
+
*/
|
|
134
|
+
function shouldDraw() {
|
|
135
|
+
return !this.isNull;
|
|
136
|
+
}
|
|
137
|
+
})(DrawPointComposition || (DrawPointComposition = {}));
|
|
138
|
+
/* *
|
|
139
|
+
*
|
|
140
|
+
* Default Export
|
|
141
|
+
*
|
|
142
|
+
* */
|
|
437
143
|
|
|
438
|
-
return
|
|
144
|
+
return DrawPointComposition;
|
|
439
145
|
});
|
|
440
|
-
_registerModule(_modules, 'Series/Wordcloud/WordcloudPoint.js', [_modules['
|
|
146
|
+
_registerModule(_modules, 'Series/Wordcloud/WordcloudPoint.js', [_modules['Series/DrawPointComposition.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (DrawPointComposition, SeriesRegistry, U) {
|
|
441
147
|
/* *
|
|
442
148
|
*
|
|
443
149
|
* Experimental Highcharts module which enables visualization of a word cloud.
|
|
@@ -489,23 +195,24 @@
|
|
|
489
195
|
* Functions
|
|
490
196
|
*
|
|
491
197
|
* */
|
|
492
|
-
WordcloudPoint.prototype.shouldDraw = function () {
|
|
493
|
-
var point = this;
|
|
494
|
-
return !point.isNull;
|
|
495
|
-
};
|
|
496
198
|
WordcloudPoint.prototype.isValid = function () {
|
|
497
199
|
return true;
|
|
498
200
|
};
|
|
499
201
|
return WordcloudPoint;
|
|
500
202
|
}(ColumnSeries.prototype.pointClass));
|
|
501
203
|
extend(WordcloudPoint.prototype, {
|
|
502
|
-
draw: DrawPointMixin.drawPoint,
|
|
503
204
|
weight: 1
|
|
504
205
|
});
|
|
206
|
+
DrawPointComposition.compose(WordcloudPoint);
|
|
207
|
+
/* *
|
|
208
|
+
*
|
|
209
|
+
* Default Export
|
|
210
|
+
*
|
|
211
|
+
* */
|
|
505
212
|
|
|
506
213
|
return WordcloudPoint;
|
|
507
214
|
});
|
|
508
|
-
_registerModule(_modules, 'Series/Wordcloud/WordcloudUtils.js', [_modules['
|
|
215
|
+
_registerModule(_modules, 'Series/Wordcloud/WordcloudUtils.js', [_modules['Core/Globals.js'], _modules['Core/Utilities.js']], function (H, U) {
|
|
509
216
|
/* *
|
|
510
217
|
*
|
|
511
218
|
* Experimental Highcharts module which enables visualization of a word cloud.
|
|
@@ -517,574 +224,796 @@
|
|
|
517
224
|
*
|
|
518
225
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
519
226
|
* */
|
|
520
|
-
var
|
|
521
|
-
movePolygon = PolygonMixin.movePolygon;
|
|
227
|
+
var deg2rad = H.deg2rad;
|
|
522
228
|
var extend = U.extend,
|
|
523
229
|
find = U.find,
|
|
524
230
|
isNumber = U.isNumber,
|
|
525
231
|
isObject = U.isObject,
|
|
526
232
|
merge = U.merge;
|
|
527
233
|
/* *
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
// If they no longer intersects, remove the cache from the point.
|
|
596
|
-
if (!intersects) {
|
|
597
|
-
delete point.lastCollidedWith;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
// If not already found, then check if we can find a point that is
|
|
601
|
-
// intersecting.
|
|
602
|
-
if (!intersects) {
|
|
603
|
-
intersects = !!find(points, function (p) {
|
|
604
|
-
var result = isIntersecting(p);
|
|
605
|
-
if (result) {
|
|
606
|
-
point.lastCollidedWith = p;
|
|
607
|
-
}
|
|
608
|
-
return result;
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
return intersects;
|
|
612
|
-
}
|
|
613
|
-
WordcloudUtils.intersectsAnyWord = intersectsAnyWord;
|
|
614
|
-
/**
|
|
615
|
-
* Gives a set of cordinates for an Archimedian Spiral.
|
|
616
|
-
*
|
|
617
|
-
* @private
|
|
618
|
-
* @function archimedeanSpiral
|
|
619
|
-
*
|
|
620
|
-
* @param {number} attempt
|
|
621
|
-
* How far along the spiral we have traversed.
|
|
622
|
-
*
|
|
623
|
-
* @param {Highcharts.WordcloudSpiralParamsObject} [params]
|
|
624
|
-
* Additional parameters.
|
|
625
|
-
*
|
|
626
|
-
* @return {boolean|Highcharts.PositionObject}
|
|
627
|
-
* Resulting coordinates, x and y. False if the word should be dropped from
|
|
628
|
-
* the visualization.
|
|
629
|
-
*/
|
|
630
|
-
function archimedeanSpiral(attempt, params) {
|
|
631
|
-
var field = params.field,
|
|
632
|
-
result = false,
|
|
633
|
-
maxDelta = (field.width * field.width) + (field.height * field.height),
|
|
634
|
-
t = attempt * 0.8; // 0.2 * 4 = 0.8. Enlarging the spiral.
|
|
635
|
-
// Emergency brake. TODO make spiralling logic more foolproof.
|
|
636
|
-
if (attempt <= 10000) {
|
|
637
|
-
result = {
|
|
638
|
-
x: t * Math.cos(t),
|
|
639
|
-
y: t * Math.sin(t)
|
|
640
|
-
};
|
|
641
|
-
if (!(Math.min(Math.abs(result.x), Math.abs(result.y)) < maxDelta)) {
|
|
642
|
-
result = false;
|
|
234
|
+
*
|
|
235
|
+
* Functions
|
|
236
|
+
*
|
|
237
|
+
* */
|
|
238
|
+
/* eslint-disable valid-jsdoc */
|
|
239
|
+
/**
|
|
240
|
+
* Detects if there is a collision between two rectangles.
|
|
241
|
+
*
|
|
242
|
+
* @private
|
|
243
|
+
* @function isRectanglesIntersecting
|
|
244
|
+
*
|
|
245
|
+
* @param {Highcharts.PolygonBoxObject} r1
|
|
246
|
+
* First rectangle.
|
|
247
|
+
*
|
|
248
|
+
* @param {Highcharts.PolygonBoxObject} r2
|
|
249
|
+
* Second rectangle.
|
|
250
|
+
*
|
|
251
|
+
* @return {boolean}
|
|
252
|
+
* Returns true if the rectangles overlap.
|
|
253
|
+
*/
|
|
254
|
+
function isRectanglesIntersecting(r1, r2) {
|
|
255
|
+
return !(r2.left > r1.right ||
|
|
256
|
+
r2.right < r1.left ||
|
|
257
|
+
r2.top > r1.bottom ||
|
|
258
|
+
r2.bottom < r1.top);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Calculates the normals to a line between two points.
|
|
262
|
+
*
|
|
263
|
+
* @private
|
|
264
|
+
* @function getNormals
|
|
265
|
+
* @param {Highcharts.PolygonPointObject} p1
|
|
266
|
+
* Start point for the line. Array of x and y value.
|
|
267
|
+
* @param {Highcharts.PolygonPointObject} p2
|
|
268
|
+
* End point for the line. Array of x and y value.
|
|
269
|
+
* @return {Highcharts.PolygonObject}
|
|
270
|
+
* Returns the two normals in an array.
|
|
271
|
+
*/
|
|
272
|
+
function getNormals(p1, p2) {
|
|
273
|
+
var dx = p2[0] - p1[0], // x2 - x1
|
|
274
|
+
dy = p2[1] - p1[1]; // y2 - y1
|
|
275
|
+
return [
|
|
276
|
+
[-dy,
|
|
277
|
+
dx],
|
|
278
|
+
[dy, -dx]
|
|
279
|
+
];
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* @private
|
|
283
|
+
*/
|
|
284
|
+
function getAxesFromPolygon(polygon) {
|
|
285
|
+
var points,
|
|
286
|
+
axes = polygon.axes || [];
|
|
287
|
+
if (!axes.length) {
|
|
288
|
+
axes = [];
|
|
289
|
+
points = points = polygon.concat([polygon[0]]);
|
|
290
|
+
points.reduce(function findAxis(p1, p2) {
|
|
291
|
+
var normals = getNormals(p1,
|
|
292
|
+
p2),
|
|
293
|
+
axis = normals[0]; // Use the left normal as axis.
|
|
294
|
+
// Check that the axis is unique.
|
|
295
|
+
if (!find(axes,
|
|
296
|
+
function (existing) {
|
|
297
|
+
return existing[0] === axis[0] &&
|
|
298
|
+
existing[1] === axis[1];
|
|
299
|
+
})) {
|
|
300
|
+
axes.push(axis);
|
|
643
301
|
}
|
|
302
|
+
// Return p2 to be used as p1 in next iteration.
|
|
303
|
+
return p2;
|
|
304
|
+
});
|
|
305
|
+
polygon.axes = axes;
|
|
306
|
+
}
|
|
307
|
+
return axes;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Projects a polygon onto a coordinate.
|
|
311
|
+
*
|
|
312
|
+
* @private
|
|
313
|
+
* @function project
|
|
314
|
+
* @param {Highcharts.PolygonObject} polygon
|
|
315
|
+
* Array of points in a polygon.
|
|
316
|
+
* @param {Highcharts.PolygonPointObject} target
|
|
317
|
+
* The coordinate of pr
|
|
318
|
+
*/
|
|
319
|
+
function project(polygon, target) {
|
|
320
|
+
var products = polygon.map(function (point) {
|
|
321
|
+
var ax = point[0],
|
|
322
|
+
ay = point[1],
|
|
323
|
+
bx = target[0],
|
|
324
|
+
by = target[1];
|
|
325
|
+
return ax * bx + ay * by;
|
|
326
|
+
});
|
|
327
|
+
return {
|
|
328
|
+
min: Math.min.apply(this, products),
|
|
329
|
+
max: Math.max.apply(this, products)
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* @private
|
|
334
|
+
*/
|
|
335
|
+
function isPolygonsOverlappingOnAxis(axis, polygon1, polygon2) {
|
|
336
|
+
var projection1 = project(polygon1,
|
|
337
|
+
axis),
|
|
338
|
+
projection2 = project(polygon2,
|
|
339
|
+
axis),
|
|
340
|
+
isOverlapping = !(projection2.min > projection1.max ||
|
|
341
|
+
projection2.max < projection1.min);
|
|
342
|
+
return !isOverlapping;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Checks wether two convex polygons are colliding by using the Separating
|
|
346
|
+
* Axis Theorem.
|
|
347
|
+
*
|
|
348
|
+
* @private
|
|
349
|
+
* @function isPolygonsColliding
|
|
350
|
+
* @param {Highcharts.PolygonObject} polygon1
|
|
351
|
+
* First polygon.
|
|
352
|
+
*
|
|
353
|
+
* @param {Highcharts.PolygonObject} polygon2
|
|
354
|
+
* Second polygon.
|
|
355
|
+
*
|
|
356
|
+
* @return {boolean}
|
|
357
|
+
* Returns true if they are colliding, otherwise false.
|
|
358
|
+
*/
|
|
359
|
+
function isPolygonsColliding(polygon1, polygon2) {
|
|
360
|
+
// Get the axis from both polygons.
|
|
361
|
+
var axes1 = getAxesFromPolygon(polygon1),
|
|
362
|
+
axes2 = getAxesFromPolygon(polygon2),
|
|
363
|
+
axes = axes1.concat(axes2),
|
|
364
|
+
overlappingOnAllAxes = !find(axes,
|
|
365
|
+
function (axis) { return isPolygonsOverlappingOnAxis(axis,
|
|
366
|
+
polygon1,
|
|
367
|
+
polygon2); });
|
|
368
|
+
return overlappingOnAllAxes;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Detects if a word collides with any previously placed words.
|
|
372
|
+
*
|
|
373
|
+
* @private
|
|
374
|
+
* @function intersectsAnyWord
|
|
375
|
+
*
|
|
376
|
+
* @param {Highcharts.Point} point
|
|
377
|
+
* Point which the word is connected to.
|
|
378
|
+
*
|
|
379
|
+
* @param {Array<Highcharts.Point>} points
|
|
380
|
+
* Previously placed points to check against.
|
|
381
|
+
*
|
|
382
|
+
* @return {boolean}
|
|
383
|
+
* Returns true if there is collision.
|
|
384
|
+
*/
|
|
385
|
+
function intersectsAnyWord(point, points) {
|
|
386
|
+
var intersects = false,
|
|
387
|
+
rect = point.rect,
|
|
388
|
+
polygon = point.polygon,
|
|
389
|
+
lastCollidedWith = point.lastCollidedWith,
|
|
390
|
+
isIntersecting = function (p) {
|
|
391
|
+
var result = isRectanglesIntersecting(rect,
|
|
392
|
+
p.rect);
|
|
393
|
+
if (result &&
|
|
394
|
+
(point.rotation % 90 || p.rotation % 90)) {
|
|
395
|
+
result = isPolygonsColliding(polygon, p.polygon);
|
|
644
396
|
}
|
|
645
397
|
return result;
|
|
398
|
+
};
|
|
399
|
+
// If the point has already intersected a different point, chances are
|
|
400
|
+
// they are still intersecting. So as an enhancement we check this
|
|
401
|
+
// first.
|
|
402
|
+
if (lastCollidedWith) {
|
|
403
|
+
intersects = isIntersecting(lastCollidedWith);
|
|
404
|
+
// If they no longer intersects, remove the cache from the point.
|
|
405
|
+
if (!intersects) {
|
|
406
|
+
delete point.lastCollidedWith;
|
|
407
|
+
}
|
|
646
408
|
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
409
|
+
// If not already found, then check if we can find a point that is
|
|
410
|
+
// intersecting.
|
|
411
|
+
if (!intersects) {
|
|
412
|
+
intersects = !!find(points, function (p) {
|
|
413
|
+
var result = isIntersecting(p);
|
|
414
|
+
if (result) {
|
|
415
|
+
point.lastCollidedWith = p;
|
|
416
|
+
}
|
|
417
|
+
return result;
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return intersects;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Gives a set of cordinates for an Archimedian Spiral.
|
|
424
|
+
*
|
|
425
|
+
* @private
|
|
426
|
+
* @function archimedeanSpiral
|
|
427
|
+
*
|
|
428
|
+
* @param {number} attempt
|
|
429
|
+
* How far along the spiral we have traversed.
|
|
430
|
+
*
|
|
431
|
+
* @param {Highcharts.WordcloudSpiralParamsObject} [params]
|
|
432
|
+
* Additional parameters.
|
|
433
|
+
*
|
|
434
|
+
* @return {boolean|Highcharts.PositionObject}
|
|
435
|
+
* Resulting coordinates, x and y. False if the word should be dropped from
|
|
436
|
+
* the visualization.
|
|
437
|
+
*/
|
|
438
|
+
function archimedeanSpiral(attempt, params) {
|
|
439
|
+
var field = params.field,
|
|
440
|
+
result = false,
|
|
441
|
+
maxDelta = (field.width * field.width) + (field.height * field.height),
|
|
442
|
+
t = attempt * 0.8; // 0.2 * 4 = 0.8. Enlarging the spiral.
|
|
443
|
+
// Emergency brake. TODO make spiralling logic more foolproof.
|
|
673
444
|
if (attempt <= 10000) {
|
|
674
|
-
|
|
445
|
+
result = {
|
|
446
|
+
x: t * Math.cos(t),
|
|
447
|
+
y: t * Math.sin(t)
|
|
448
|
+
};
|
|
449
|
+
if (!(Math.min(Math.abs(result.x), Math.abs(result.y)) < maxDelta)) {
|
|
450
|
+
result = false;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return result;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Gives a set of cordinates for an rectangular spiral.
|
|
457
|
+
*
|
|
458
|
+
* @private
|
|
459
|
+
* @function squareSpiral
|
|
460
|
+
*
|
|
461
|
+
* @param {number} attempt
|
|
462
|
+
* How far along the spiral we have traversed.
|
|
463
|
+
*
|
|
464
|
+
* @param {Highcharts.WordcloudSpiralParamsObject} [params]
|
|
465
|
+
* Additional parameters.
|
|
466
|
+
*
|
|
467
|
+
* @return {boolean|Highcharts.PositionObject}
|
|
468
|
+
* Resulting coordinates, x and y. False if the word should be dropped from
|
|
469
|
+
* the visualization.
|
|
470
|
+
*/
|
|
471
|
+
function squareSpiral(attempt, params) {
|
|
472
|
+
var a = attempt * 4,
|
|
473
|
+
k = Math.ceil((Math.sqrt(a) - 1) / 2),
|
|
474
|
+
t = 2 * k + 1,
|
|
475
|
+
m = Math.pow(t, 2),
|
|
476
|
+
isBoolean = function (x) {
|
|
477
|
+
return typeof x === 'boolean';
|
|
478
|
+
}, result = false;
|
|
479
|
+
t -= 1;
|
|
480
|
+
if (attempt <= 10000) {
|
|
481
|
+
if (isBoolean(result) && a >= m - t) {
|
|
482
|
+
result = {
|
|
483
|
+
x: k - (m - a),
|
|
484
|
+
y: -k
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
m -= t;
|
|
488
|
+
if (isBoolean(result) && a >= m - t) {
|
|
489
|
+
result = {
|
|
490
|
+
x: -k,
|
|
491
|
+
y: -k + (m - a)
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
m -= t;
|
|
495
|
+
if (isBoolean(result)) {
|
|
496
|
+
if (a >= m - t) {
|
|
675
497
|
result = {
|
|
676
|
-
x: k
|
|
677
|
-
y:
|
|
498
|
+
x: -k + (m - a),
|
|
499
|
+
y: k
|
|
678
500
|
};
|
|
679
501
|
}
|
|
680
|
-
|
|
681
|
-
if (isBoolean(result) && a >= m - t) {
|
|
502
|
+
else {
|
|
682
503
|
result = {
|
|
683
|
-
x:
|
|
684
|
-
y:
|
|
504
|
+
x: k,
|
|
505
|
+
y: k - (m - a - t)
|
|
685
506
|
};
|
|
686
507
|
}
|
|
687
|
-
m -= t;
|
|
688
|
-
if (isBoolean(result)) {
|
|
689
|
-
if (a >= m - t) {
|
|
690
|
-
result = {
|
|
691
|
-
x: -k + (m - a),
|
|
692
|
-
y: k
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
else {
|
|
696
|
-
result = {
|
|
697
|
-
x: k,
|
|
698
|
-
y: k - (m - a - t)
|
|
699
|
-
};
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
result.x *= 5;
|
|
703
|
-
result.y *= 5;
|
|
704
508
|
}
|
|
705
|
-
|
|
509
|
+
result.x *= 5;
|
|
510
|
+
result.y *= 5;
|
|
706
511
|
}
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
return result;
|
|
512
|
+
return result;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Gives a set of cordinates for an rectangular spiral.
|
|
516
|
+
*
|
|
517
|
+
* @private
|
|
518
|
+
* @function rectangularSpiral
|
|
519
|
+
*
|
|
520
|
+
* @param {number} attempt
|
|
521
|
+
* How far along the spiral we have traversed.
|
|
522
|
+
*
|
|
523
|
+
* @param {Highcharts.WordcloudSpiralParamsObject} [params]
|
|
524
|
+
* Additional parameters.
|
|
525
|
+
*
|
|
526
|
+
* @return {boolean|Higcharts.PositionObject}
|
|
527
|
+
* Resulting coordinates, x and y. False if the word should be dropped from
|
|
528
|
+
* the visualization.
|
|
529
|
+
*/
|
|
530
|
+
function rectangularSpiral(attempt, params) {
|
|
531
|
+
var result = squareSpiral(attempt,
|
|
532
|
+
params),
|
|
533
|
+
field = params.field;
|
|
534
|
+
if (result) {
|
|
535
|
+
result.x *= field.ratioX;
|
|
536
|
+
result.y *= field.ratioY;
|
|
733
537
|
}
|
|
734
|
-
|
|
538
|
+
return result;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* @private
|
|
542
|
+
* @function getRandomPosition
|
|
543
|
+
*
|
|
544
|
+
* @param {number} size
|
|
545
|
+
* Random factor.
|
|
546
|
+
*
|
|
547
|
+
* @return {number}
|
|
548
|
+
* Random position.
|
|
549
|
+
*/
|
|
550
|
+
function getRandomPosition(size) {
|
|
551
|
+
return Math.round((size * (Math.random() + 0.5)) / 2);
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Calculates the proper scale to fit the cloud inside the plotting area.
|
|
555
|
+
*
|
|
556
|
+
* @private
|
|
557
|
+
* @function getScale
|
|
558
|
+
*
|
|
559
|
+
* @param {number} targetWidth
|
|
560
|
+
* Width of target area.
|
|
561
|
+
*
|
|
562
|
+
* @param {number} targetHeight
|
|
563
|
+
* Height of target area.
|
|
564
|
+
*
|
|
565
|
+
* @param {Object} field
|
|
566
|
+
* The playing field.
|
|
567
|
+
*
|
|
568
|
+
* @param {Highcharts.Series} series
|
|
569
|
+
* Series object.
|
|
570
|
+
*
|
|
571
|
+
* @return {number}
|
|
572
|
+
* Returns the value to scale the playing field up to the size of the target
|
|
573
|
+
* area.
|
|
574
|
+
*/
|
|
575
|
+
function getScale(targetWidth, targetHeight, field) {
|
|
576
|
+
var height = Math.max(Math.abs(field.top),
|
|
577
|
+
Math.abs(field.bottom)) * 2,
|
|
578
|
+
width = Math.max(Math.abs(field.left),
|
|
579
|
+
Math.abs(field.right)) * 2,
|
|
580
|
+
scaleX = width > 0 ? 1 / width * targetWidth : 1,
|
|
581
|
+
scaleY = height > 0 ? 1 / height * targetHeight : 1;
|
|
582
|
+
return Math.min(scaleX, scaleY);
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Calculates what is called the playing field. The field is the area which
|
|
586
|
+
* all the words are allowed to be positioned within. The area is
|
|
587
|
+
* proportioned to match the target aspect ratio.
|
|
588
|
+
*
|
|
589
|
+
* @private
|
|
590
|
+
* @function getPlayingField
|
|
591
|
+
*
|
|
592
|
+
* @param {number} targetWidth
|
|
593
|
+
* Width of the target area.
|
|
594
|
+
*
|
|
595
|
+
* @param {number} targetHeight
|
|
596
|
+
* Height of the target area.
|
|
597
|
+
*
|
|
598
|
+
* @param {Array<Highcharts.Point>} data
|
|
599
|
+
* Array of points.
|
|
600
|
+
*
|
|
601
|
+
* @param {Object} data.dimensions
|
|
602
|
+
* The height and width of the word.
|
|
603
|
+
*
|
|
604
|
+
* @return {Object}
|
|
605
|
+
* The width and height of the playing field.
|
|
606
|
+
*/
|
|
607
|
+
function getPlayingField(targetWidth, targetHeight, data) {
|
|
608
|
+
var info = data.reduce(function (obj,
|
|
609
|
+
point) {
|
|
610
|
+
var dimensions = point.dimensions,
|
|
611
|
+
x = Math.max(dimensions.width,
|
|
612
|
+
dimensions.height);
|
|
613
|
+
// Find largest height.
|
|
614
|
+
obj.maxHeight = Math.max(obj.maxHeight, dimensions.height);
|
|
615
|
+
// Find largest width.
|
|
616
|
+
obj.maxWidth = Math.max(obj.maxWidth, dimensions.width);
|
|
617
|
+
// Sum up the total maximum area of all the words.
|
|
618
|
+
obj.area += x * x;
|
|
619
|
+
return obj;
|
|
620
|
+
}, {
|
|
621
|
+
maxHeight: 0,
|
|
622
|
+
maxWidth: 0,
|
|
623
|
+
area: 0
|
|
624
|
+
}),
|
|
735
625
|
/**
|
|
736
|
-
*
|
|
737
|
-
*
|
|
738
|
-
*
|
|
739
|
-
* @param {number} size
|
|
740
|
-
* Random factor.
|
|
741
|
-
*
|
|
742
|
-
* @return {number}
|
|
743
|
-
* Random position.
|
|
626
|
+
* Use largest width, largest height, or root of total area to give
|
|
627
|
+
* size to the playing field.
|
|
744
628
|
*/
|
|
745
|
-
|
|
746
|
-
|
|
629
|
+
x = Math.max(info.maxHeight, // Have enough space for the tallest word
|
|
630
|
+
info.maxWidth, // Have enough space for the broadest word
|
|
631
|
+
// Adjust 15% to account for close packing of words
|
|
632
|
+
Math.sqrt(info.area) * 0.85), ratioX = targetWidth > targetHeight ? targetWidth / targetHeight : 1, ratioY = targetHeight > targetWidth ? targetHeight / targetWidth : 1;
|
|
633
|
+
return {
|
|
634
|
+
width: x * ratioX,
|
|
635
|
+
height: x * ratioY,
|
|
636
|
+
ratioX: ratioX,
|
|
637
|
+
ratioY: ratioY
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Calculates a number of degrees to rotate, based upon a number of
|
|
642
|
+
* orientations within a range from-to.
|
|
643
|
+
*
|
|
644
|
+
* @private
|
|
645
|
+
* @function getRotation
|
|
646
|
+
*
|
|
647
|
+
* @param {number} [orientations]
|
|
648
|
+
* Number of orientations.
|
|
649
|
+
*
|
|
650
|
+
* @param {number} [index]
|
|
651
|
+
* Index of point, used to decide orientation.
|
|
652
|
+
*
|
|
653
|
+
* @param {number} [from]
|
|
654
|
+
* The smallest degree of rotation.
|
|
655
|
+
*
|
|
656
|
+
* @param {number} [to]
|
|
657
|
+
* The largest degree of rotation.
|
|
658
|
+
*
|
|
659
|
+
* @return {boolean|number}
|
|
660
|
+
* Returns the resulting rotation for the word. Returns false if invalid
|
|
661
|
+
* input parameters.
|
|
662
|
+
*/
|
|
663
|
+
function getRotation(orientations, index, from, to) {
|
|
664
|
+
var result = false, // Default to false
|
|
665
|
+
range,
|
|
666
|
+
intervals,
|
|
667
|
+
orientation;
|
|
668
|
+
// Check if we have valid input parameters.
|
|
669
|
+
if (isNumber(orientations) &&
|
|
670
|
+
isNumber(index) &&
|
|
671
|
+
isNumber(from) &&
|
|
672
|
+
isNumber(to) &&
|
|
673
|
+
orientations > 0 &&
|
|
674
|
+
index > -1 &&
|
|
675
|
+
to > from) {
|
|
676
|
+
range = to - from;
|
|
677
|
+
intervals = range / (orientations - 1 || 1);
|
|
678
|
+
orientation = index % orientations;
|
|
679
|
+
result = from + (orientation * intervals);
|
|
747
680
|
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
var height = Math.max(Math.abs(field.top),
|
|
773
|
-
Math.abs(field.bottom)) * 2,
|
|
774
|
-
width = Math.max(Math.abs(field.left),
|
|
775
|
-
Math.abs(field.right)) * 2,
|
|
776
|
-
scaleX = width > 0 ? 1 / width * targetWidth : 1,
|
|
777
|
-
scaleY = height > 0 ? 1 / height * targetHeight : 1;
|
|
778
|
-
return Math.min(scaleX, scaleY);
|
|
681
|
+
return result;
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Calculates the spiral positions and store them in scope for quick access.
|
|
685
|
+
*
|
|
686
|
+
* @private
|
|
687
|
+
* @function getSpiral
|
|
688
|
+
*
|
|
689
|
+
* @param {Function} fn
|
|
690
|
+
* The spiral function.
|
|
691
|
+
*
|
|
692
|
+
* @param {Object} params
|
|
693
|
+
* Additional parameters for the spiral.
|
|
694
|
+
*
|
|
695
|
+
* @return {Function}
|
|
696
|
+
* Function with access to spiral positions.
|
|
697
|
+
*/
|
|
698
|
+
function getSpiral(fn, params) {
|
|
699
|
+
var length = 10000,
|
|
700
|
+
i,
|
|
701
|
+
arr = [];
|
|
702
|
+
for (i = 1; i < length; i++) {
|
|
703
|
+
// @todo unnecessary amount of precaclulation
|
|
704
|
+
arr.push(fn(i, params));
|
|
779
705
|
}
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
var info = data.reduce(function (obj,
|
|
806
|
-
point) {
|
|
807
|
-
var dimensions = point.dimensions,
|
|
808
|
-
x = Math.max(dimensions.width,
|
|
809
|
-
dimensions.height);
|
|
810
|
-
// Find largest height.
|
|
811
|
-
obj.maxHeight = Math.max(obj.maxHeight, dimensions.height);
|
|
812
|
-
// Find largest width.
|
|
813
|
-
obj.maxWidth = Math.max(obj.maxWidth, dimensions.width);
|
|
814
|
-
// Sum up the total maximum area of all the words.
|
|
815
|
-
obj.area += x * x;
|
|
816
|
-
return obj;
|
|
817
|
-
}, {
|
|
818
|
-
maxHeight: 0,
|
|
819
|
-
maxWidth: 0,
|
|
820
|
-
area: 0
|
|
821
|
-
}),
|
|
822
|
-
/**
|
|
823
|
-
* Use largest width, largest height, or root of total area to give
|
|
824
|
-
* size to the playing field.
|
|
825
|
-
*/
|
|
826
|
-
x = Math.max(info.maxHeight, // Have enough space for the tallest word
|
|
827
|
-
info.maxWidth, // Have enough space for the broadest word
|
|
828
|
-
// Adjust 15% to account for close packing of words
|
|
829
|
-
Math.sqrt(info.area) * 0.85), ratioX = targetWidth > targetHeight ? targetWidth / targetHeight : 1, ratioY = targetHeight > targetWidth ? targetHeight / targetWidth : 1;
|
|
830
|
-
return {
|
|
831
|
-
width: x * ratioX,
|
|
832
|
-
height: x * ratioY,
|
|
833
|
-
ratioX: ratioX,
|
|
834
|
-
ratioY: ratioY
|
|
706
|
+
return function (attempt) {
|
|
707
|
+
return attempt <= length ? arr[attempt - 1] : false;
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Detects if a word is placed outside the playing field.
|
|
712
|
+
*
|
|
713
|
+
* @private
|
|
714
|
+
* @function outsidePlayingField
|
|
715
|
+
*
|
|
716
|
+
* @param {Highcharts.PolygonBoxObject} rect
|
|
717
|
+
* The word box.
|
|
718
|
+
*
|
|
719
|
+
* @param {Highcharts.WordcloudFieldObject} field
|
|
720
|
+
* The width and height of the playing field.
|
|
721
|
+
*
|
|
722
|
+
* @return {boolean}
|
|
723
|
+
* Returns true if the word is placed outside the field.
|
|
724
|
+
*/
|
|
725
|
+
function outsidePlayingField(rect, field) {
|
|
726
|
+
var playingField = {
|
|
727
|
+
left: -(field.width / 2),
|
|
728
|
+
right: field.width / 2,
|
|
729
|
+
top: -(field.height / 2),
|
|
730
|
+
bottom: field.height / 2
|
|
835
731
|
};
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
732
|
+
return !(playingField.left < rect.left &&
|
|
733
|
+
playingField.right > rect.right &&
|
|
734
|
+
playingField.top < rect.top &&
|
|
735
|
+
playingField.bottom > rect.bottom);
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* @private
|
|
739
|
+
*/
|
|
740
|
+
function movePolygon(deltaX, deltaY, polygon) {
|
|
741
|
+
return polygon.map(function (point) {
|
|
742
|
+
return [
|
|
743
|
+
point[0] + deltaX,
|
|
744
|
+
point[1] + deltaY
|
|
745
|
+
];
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Check if a point intersects with previously placed words, or if it goes
|
|
750
|
+
* outside the field boundaries. If a collision, then try to adjusts the
|
|
751
|
+
* position.
|
|
752
|
+
*
|
|
753
|
+
* @private
|
|
754
|
+
* @function intersectionTesting
|
|
755
|
+
*
|
|
756
|
+
* @param {Highcharts.Point} point
|
|
757
|
+
* Point to test for intersections.
|
|
758
|
+
*
|
|
759
|
+
* @param {Highcharts.WordcloudTestOptionsObject} options
|
|
760
|
+
* Options object.
|
|
761
|
+
*
|
|
762
|
+
* @return {boolean|Highcharts.PositionObject}
|
|
763
|
+
* Returns an object with how much to correct the positions. Returns false
|
|
764
|
+
* if the word should not be placed at all.
|
|
765
|
+
*/
|
|
766
|
+
function intersectionTesting(point, options) {
|
|
767
|
+
var placed = options.placed,
|
|
768
|
+
field = options.field,
|
|
769
|
+
rectangle = options.rectangle,
|
|
770
|
+
polygon = options.polygon,
|
|
771
|
+
spiral = options.spiral,
|
|
772
|
+
attempt = 1,
|
|
773
|
+
delta = {
|
|
774
|
+
x: 0,
|
|
775
|
+
y: 0
|
|
776
|
+
},
|
|
777
|
+
// Make a copy to update values during intersection testing.
|
|
778
|
+
rect = point.rect = extend({},
|
|
779
|
+
rectangle);
|
|
780
|
+
point.polygon = polygon;
|
|
781
|
+
point.rotation = options.rotation;
|
|
782
|
+
/* while w intersects any previously placed words:
|
|
783
|
+
do {
|
|
784
|
+
move w a little bit along a spiral path
|
|
785
|
+
} while any part of w is outside the playing field and
|
|
786
|
+
the spiral radius is still smallish */
|
|
787
|
+
while (delta !== false &&
|
|
788
|
+
(intersectsAnyWord(point, placed) ||
|
|
789
|
+
outsidePlayingField(rect, field))) {
|
|
790
|
+
delta = spiral(attempt);
|
|
791
|
+
if (isObject(delta)) {
|
|
792
|
+
// Update the DOMRect with new positions.
|
|
793
|
+
rect.left = rectangle.left + delta.x;
|
|
794
|
+
rect.right = rectangle.right + delta.x;
|
|
795
|
+
rect.top = rectangle.top + delta.y;
|
|
796
|
+
rect.bottom = rectangle.bottom + delta.y;
|
|
797
|
+
point.polygon = movePolygon(delta.x, delta.y, polygon);
|
|
878
798
|
}
|
|
879
|
-
|
|
799
|
+
attempt++;
|
|
880
800
|
}
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
801
|
+
return delta;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Extends the playing field to have enough space to fit a given word.
|
|
805
|
+
*
|
|
806
|
+
* @private
|
|
807
|
+
* @function extendPlayingField
|
|
808
|
+
*
|
|
809
|
+
* @param {Highcharts.WordcloudFieldObject} field
|
|
810
|
+
* The width, height and ratios of a playing field.
|
|
811
|
+
*
|
|
812
|
+
* @param {Highcharts.PolygonBoxObject} rectangle
|
|
813
|
+
* The bounding box of the word to add space for.
|
|
814
|
+
*
|
|
815
|
+
* @return {Highcharts.WordcloudFieldObject}
|
|
816
|
+
* Returns the extended playing field with updated height and width.
|
|
817
|
+
*/
|
|
818
|
+
function extendPlayingField(field, rectangle) {
|
|
819
|
+
var height,
|
|
820
|
+
width,
|
|
821
|
+
ratioX,
|
|
822
|
+
ratioY,
|
|
823
|
+
x,
|
|
824
|
+
extendWidth,
|
|
825
|
+
extendHeight,
|
|
826
|
+
result;
|
|
827
|
+
if (isObject(field) && isObject(rectangle)) {
|
|
828
|
+
height = (rectangle.bottom - rectangle.top);
|
|
829
|
+
width = (rectangle.right - rectangle.left);
|
|
830
|
+
ratioX = field.ratioX;
|
|
831
|
+
ratioY = field.ratioY;
|
|
832
|
+
// Use the same variable to extend both the height and width.
|
|
833
|
+
x = ((width * ratioX) > (height * ratioY)) ? width : height;
|
|
834
|
+
// Multiply variable with ratios to preserve aspect ratio.
|
|
835
|
+
extendWidth = x * ratioX;
|
|
836
|
+
extendHeight = x * ratioY;
|
|
837
|
+
// Calculate the size of the new field after adding
|
|
838
|
+
// space for the word.
|
|
839
|
+
result = merge(field, {
|
|
840
|
+
// Add space on the left and right.
|
|
841
|
+
width: field.width + (extendWidth * 2),
|
|
842
|
+
// Add space on the top and bottom.
|
|
843
|
+
height: field.height + (extendHeight * 2)
|
|
844
|
+
});
|
|
908
845
|
}
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
* Detects if a word is placed outside the playing field.
|
|
912
|
-
*
|
|
913
|
-
* @private
|
|
914
|
-
* @function outsidePlayingField
|
|
915
|
-
*
|
|
916
|
-
* @param {Highcharts.PolygonBoxObject} rect
|
|
917
|
-
* The word box.
|
|
918
|
-
*
|
|
919
|
-
* @param {Highcharts.WordcloudFieldObject} field
|
|
920
|
-
* The width and height of the playing field.
|
|
921
|
-
*
|
|
922
|
-
* @return {boolean}
|
|
923
|
-
* Returns true if the word is placed outside the field.
|
|
924
|
-
*/
|
|
925
|
-
function outsidePlayingField(rect, field) {
|
|
926
|
-
var playingField = {
|
|
927
|
-
left: -(field.width / 2),
|
|
928
|
-
right: field.width / 2,
|
|
929
|
-
top: -(field.height / 2),
|
|
930
|
-
bottom: field.height / 2
|
|
931
|
-
};
|
|
932
|
-
return !(playingField.left < rect.left &&
|
|
933
|
-
playingField.right > rect.right &&
|
|
934
|
-
playingField.top < rect.top &&
|
|
935
|
-
playingField.bottom > rect.bottom);
|
|
846
|
+
else {
|
|
847
|
+
result = field;
|
|
936
848
|
}
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
spiral = options.spiral,
|
|
962
|
-
attempt = 1,
|
|
963
|
-
delta = {
|
|
964
|
-
x: 0,
|
|
965
|
-
y: 0
|
|
966
|
-
},
|
|
967
|
-
// Make a copy to update values during intersection testing.
|
|
968
|
-
rect = point.rect = extend({},
|
|
969
|
-
rectangle);
|
|
970
|
-
point.polygon = polygon;
|
|
971
|
-
point.rotation = options.rotation;
|
|
972
|
-
/* while w intersects any previously placed words:
|
|
973
|
-
do {
|
|
974
|
-
move w a little bit along a spiral path
|
|
975
|
-
} while any part of w is outside the playing field and
|
|
976
|
-
the spiral radius is still smallish */
|
|
977
|
-
while (delta !== false &&
|
|
978
|
-
(intersectsAnyWord(point, placed) ||
|
|
979
|
-
outsidePlayingField(rect, field))) {
|
|
980
|
-
delta = spiral(attempt);
|
|
981
|
-
if (isObject(delta)) {
|
|
982
|
-
// Update the DOMRect with new positions.
|
|
983
|
-
rect.left = rectangle.left + delta.x;
|
|
984
|
-
rect.right = rectangle.right + delta.x;
|
|
985
|
-
rect.top = rectangle.top + delta.y;
|
|
986
|
-
rect.bottom = rectangle.bottom + delta.y;
|
|
987
|
-
point.polygon = movePolygon(delta.x, delta.y, polygon);
|
|
988
|
-
}
|
|
989
|
-
attempt++;
|
|
990
|
-
}
|
|
991
|
-
return delta;
|
|
849
|
+
// Return the new extended field.
|
|
850
|
+
return result;
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* If a rectangle is outside a give field, then the boundaries of the field
|
|
854
|
+
* is adjusted accordingly. Modifies the field object which is passed as the
|
|
855
|
+
* first parameter.
|
|
856
|
+
*
|
|
857
|
+
* @private
|
|
858
|
+
* @function updateFieldBoundaries
|
|
859
|
+
*
|
|
860
|
+
* @param {Highcharts.WordcloudFieldObject} field
|
|
861
|
+
* The bounding box of a playing field.
|
|
862
|
+
*
|
|
863
|
+
* @param {Highcharts.PolygonBoxObject} rectangle
|
|
864
|
+
* The bounding box for a placed point.
|
|
865
|
+
*
|
|
866
|
+
* @return {Highcharts.WordcloudFieldObject}
|
|
867
|
+
* Returns a modified field object.
|
|
868
|
+
*/
|
|
869
|
+
function updateFieldBoundaries(field, rectangle) {
|
|
870
|
+
// @todo improve type checking.
|
|
871
|
+
if (!isNumber(field.left) || field.left > rectangle.left) {
|
|
872
|
+
field.left = rectangle.left;
|
|
992
873
|
}
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
* Extends the playing field to have enough space to fit a given word.
|
|
996
|
-
*
|
|
997
|
-
* @private
|
|
998
|
-
* @function extendPlayingField
|
|
999
|
-
*
|
|
1000
|
-
* @param {Highcharts.WordcloudFieldObject} field
|
|
1001
|
-
* The width, height and ratios of a playing field.
|
|
1002
|
-
*
|
|
1003
|
-
* @param {Highcharts.PolygonBoxObject} rectangle
|
|
1004
|
-
* The bounding box of the word to add space for.
|
|
1005
|
-
*
|
|
1006
|
-
* @return {Highcharts.WordcloudFieldObject}
|
|
1007
|
-
* Returns the extended playing field with updated height and width.
|
|
1008
|
-
*/
|
|
1009
|
-
function extendPlayingField(field, rectangle) {
|
|
1010
|
-
var height,
|
|
1011
|
-
width,
|
|
1012
|
-
ratioX,
|
|
1013
|
-
ratioY,
|
|
1014
|
-
x,
|
|
1015
|
-
extendWidth,
|
|
1016
|
-
extendHeight,
|
|
1017
|
-
result;
|
|
1018
|
-
if (isObject(field) && isObject(rectangle)) {
|
|
1019
|
-
height = (rectangle.bottom - rectangle.top);
|
|
1020
|
-
width = (rectangle.right - rectangle.left);
|
|
1021
|
-
ratioX = field.ratioX;
|
|
1022
|
-
ratioY = field.ratioY;
|
|
1023
|
-
// Use the same variable to extend both the height and width.
|
|
1024
|
-
x = ((width * ratioX) > (height * ratioY)) ? width : height;
|
|
1025
|
-
// Multiply variable with ratios to preserve aspect ratio.
|
|
1026
|
-
extendWidth = x * ratioX;
|
|
1027
|
-
extendHeight = x * ratioY;
|
|
1028
|
-
// Calculate the size of the new field after adding
|
|
1029
|
-
// space for the word.
|
|
1030
|
-
result = merge(field, {
|
|
1031
|
-
// Add space on the left and right.
|
|
1032
|
-
width: field.width + (extendWidth * 2),
|
|
1033
|
-
// Add space on the top and bottom.
|
|
1034
|
-
height: field.height + (extendHeight * 2)
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
else {
|
|
1038
|
-
result = field;
|
|
1039
|
-
}
|
|
1040
|
-
// Return the new extended field.
|
|
1041
|
-
return result;
|
|
874
|
+
if (!isNumber(field.right) || field.right < rectangle.right) {
|
|
875
|
+
field.right = rectangle.right;
|
|
1042
876
|
}
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
*
|
|
1049
|
-
* @private
|
|
1050
|
-
* @function updateFieldBoundaries
|
|
1051
|
-
*
|
|
1052
|
-
* @param {Highcharts.WordcloudFieldObject} field
|
|
1053
|
-
* The bounding box of a playing field.
|
|
1054
|
-
*
|
|
1055
|
-
* @param {Highcharts.PolygonBoxObject} rectangle
|
|
1056
|
-
* The bounding box for a placed point.
|
|
1057
|
-
*
|
|
1058
|
-
* @return {Highcharts.WordcloudFieldObject}
|
|
1059
|
-
* Returns a modified field object.
|
|
1060
|
-
*/
|
|
1061
|
-
function updateFieldBoundaries(field, rectangle) {
|
|
1062
|
-
// @todo improve type checking.
|
|
1063
|
-
if (!isNumber(field.left) || field.left > rectangle.left) {
|
|
1064
|
-
field.left = rectangle.left;
|
|
1065
|
-
}
|
|
1066
|
-
if (!isNumber(field.right) || field.right < rectangle.right) {
|
|
1067
|
-
field.right = rectangle.right;
|
|
1068
|
-
}
|
|
1069
|
-
if (!isNumber(field.top) || field.top > rectangle.top) {
|
|
1070
|
-
field.top = rectangle.top;
|
|
1071
|
-
}
|
|
1072
|
-
if (!isNumber(field.bottom) || field.bottom < rectangle.bottom) {
|
|
1073
|
-
field.bottom = rectangle.bottom;
|
|
1074
|
-
}
|
|
1075
|
-
return field;
|
|
877
|
+
if (!isNumber(field.top) || field.top > rectangle.top) {
|
|
878
|
+
field.top = rectangle.top;
|
|
879
|
+
}
|
|
880
|
+
if (!isNumber(field.bottom) || field.bottom < rectangle.bottom) {
|
|
881
|
+
field.bottom = rectangle.bottom;
|
|
1076
882
|
}
|
|
1077
|
-
|
|
1078
|
-
}
|
|
883
|
+
return field;
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Alternative solution to correctFloat.
|
|
887
|
+
* E.g Highcharts.correctFloat(123, 2) returns 120, when it should be 123.
|
|
888
|
+
*
|
|
889
|
+
* @private
|
|
890
|
+
* @function correctFloat
|
|
891
|
+
*/
|
|
892
|
+
function correctFloat(number, precision) {
|
|
893
|
+
var p = isNumber(precision) ? precision : 14,
|
|
894
|
+
magnitude = Math.pow(10,
|
|
895
|
+
p);
|
|
896
|
+
return Math.round(number * magnitude) / magnitude;
|
|
897
|
+
}
|
|
898
|
+
/**
|
|
899
|
+
* @private
|
|
900
|
+
*/
|
|
901
|
+
function getBoundingBoxFromPolygon(points) {
|
|
902
|
+
return points.reduce(function (obj, point) {
|
|
903
|
+
var x = point[0],
|
|
904
|
+
y = point[1];
|
|
905
|
+
obj.left = Math.min(x, obj.left);
|
|
906
|
+
obj.right = Math.max(x, obj.right);
|
|
907
|
+
obj.bottom = Math.max(y, obj.bottom);
|
|
908
|
+
obj.top = Math.min(y, obj.top);
|
|
909
|
+
return obj;
|
|
910
|
+
}, {
|
|
911
|
+
left: Number.MAX_VALUE,
|
|
912
|
+
right: -Number.MAX_VALUE,
|
|
913
|
+
bottom: -Number.MAX_VALUE,
|
|
914
|
+
top: Number.MAX_VALUE
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* @private
|
|
919
|
+
*/
|
|
920
|
+
function getPolygon(x, y, width, height, rotation) {
|
|
921
|
+
var origin = [x,
|
|
922
|
+
y],
|
|
923
|
+
left = x - (width / 2),
|
|
924
|
+
right = x + (width / 2),
|
|
925
|
+
top = y - (height / 2),
|
|
926
|
+
bottom = y + (height / 2),
|
|
927
|
+
polygon = [
|
|
928
|
+
[left,
|
|
929
|
+
top],
|
|
930
|
+
[right,
|
|
931
|
+
top],
|
|
932
|
+
[right,
|
|
933
|
+
bottom],
|
|
934
|
+
[left,
|
|
935
|
+
bottom]
|
|
936
|
+
];
|
|
937
|
+
return polygon.map(function (point) {
|
|
938
|
+
return rotate2DToPoint(point, origin, -rotation);
|
|
939
|
+
});
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* Rotates a point clockwise around the origin.
|
|
943
|
+
*
|
|
944
|
+
* @private
|
|
945
|
+
* @function rotate2DToOrigin
|
|
946
|
+
* @param {Highcharts.PolygonPointObject} point
|
|
947
|
+
* The x and y coordinates for the point.
|
|
948
|
+
* @param {number} angle
|
|
949
|
+
* The angle of rotation.
|
|
950
|
+
* @return {Highcharts.PolygonPointObject}
|
|
951
|
+
* The x and y coordinate for the rotated point.
|
|
952
|
+
*/
|
|
953
|
+
function rotate2DToOrigin(point, angle) {
|
|
954
|
+
var x = point[0],
|
|
955
|
+
y = point[1],
|
|
956
|
+
rad = deg2rad * -angle,
|
|
957
|
+
cosAngle = Math.cos(rad),
|
|
958
|
+
sinAngle = Math.sin(rad);
|
|
959
|
+
return [
|
|
960
|
+
correctFloat(x * cosAngle - y * sinAngle),
|
|
961
|
+
correctFloat(x * sinAngle + y * cosAngle)
|
|
962
|
+
];
|
|
963
|
+
}
|
|
964
|
+
/**
|
|
965
|
+
* Rotate a point clockwise around another point.
|
|
966
|
+
*
|
|
967
|
+
* @private
|
|
968
|
+
* @function rotate2DToPoint
|
|
969
|
+
* @param {Highcharts.PolygonPointObject} point
|
|
970
|
+
* The x and y coordinates for the point.
|
|
971
|
+
* @param {Highcharts.PolygonPointObject} origin
|
|
972
|
+
* The point to rotate around.
|
|
973
|
+
* @param {number} angle
|
|
974
|
+
* The angle of rotation.
|
|
975
|
+
* @return {Highcharts.PolygonPointObject}
|
|
976
|
+
* The x and y coordinate for the rotated point.
|
|
977
|
+
*/
|
|
978
|
+
function rotate2DToPoint(point, origin, angle) {
|
|
979
|
+
var x = point[0] - origin[0],
|
|
980
|
+
y = point[1] - origin[1],
|
|
981
|
+
rotated = rotate2DToOrigin([x,
|
|
982
|
+
y],
|
|
983
|
+
angle);
|
|
984
|
+
return [
|
|
985
|
+
rotated[0] + origin[0],
|
|
986
|
+
rotated[1] + origin[1]
|
|
987
|
+
];
|
|
988
|
+
}
|
|
1079
989
|
/* *
|
|
1080
990
|
*
|
|
1081
991
|
* Default export
|
|
1082
992
|
*
|
|
1083
993
|
* */
|
|
994
|
+
var WordcloudUtils = {
|
|
995
|
+
archimedeanSpiral: archimedeanSpiral,
|
|
996
|
+
extendPlayingField: extendPlayingField,
|
|
997
|
+
getBoundingBoxFromPolygon: getBoundingBoxFromPolygon,
|
|
998
|
+
getPlayingField: getPlayingField,
|
|
999
|
+
getPolygon: getPolygon,
|
|
1000
|
+
getRandomPosition: getRandomPosition,
|
|
1001
|
+
getRotation: getRotation,
|
|
1002
|
+
getScale: getScale,
|
|
1003
|
+
getSpiral: getSpiral,
|
|
1004
|
+
intersectionTesting: intersectionTesting,
|
|
1005
|
+
isPolygonsColliding: isPolygonsColliding,
|
|
1006
|
+
isRectanglesIntersecting: isRectanglesIntersecting,
|
|
1007
|
+
rectangularSpiral: rectangularSpiral,
|
|
1008
|
+
rotate2DToOrigin: rotate2DToOrigin,
|
|
1009
|
+
rotate2DToPoint: rotate2DToPoint,
|
|
1010
|
+
squareSpiral: squareSpiral,
|
|
1011
|
+
updateFieldBoundaries: updateFieldBoundaries
|
|
1012
|
+
};
|
|
1084
1013
|
|
|
1085
1014
|
return WordcloudUtils;
|
|
1086
1015
|
});
|
|
1087
|
-
_registerModule(_modules, 'Series/Wordcloud/WordcloudSeries.js', [_modules['Core/Globals.js'], _modules['
|
|
1016
|
+
_registerModule(_modules, 'Series/Wordcloud/WordcloudSeries.js', [_modules['Core/Globals.js'], _modules['Core/Series/Series.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js'], _modules['Series/Wordcloud/WordcloudPoint.js'], _modules['Series/Wordcloud/WordcloudUtils.js']], function (H, Series, SeriesRegistry, U, WordcloudPoint, WordcloudUtils) {
|
|
1088
1017
|
/* *
|
|
1089
1018
|
*
|
|
1090
1019
|
* Experimental Highcharts module which enables visualization of a word cloud.
|
|
@@ -1113,18 +1042,33 @@
|
|
|
1113
1042
|
};
|
|
1114
1043
|
})();
|
|
1115
1044
|
var noop = H.noop;
|
|
1116
|
-
var getBoundingBoxFromPolygon = PolygonMixin.getBoundingBoxFromPolygon,
|
|
1117
|
-
getPolygon = PolygonMixin.getPolygon,
|
|
1118
|
-
isPolygonsColliding = PolygonMixin.isPolygonsColliding,
|
|
1119
|
-
rotate2DToOrigin = PolygonMixin.rotate2DToOrigin,
|
|
1120
|
-
rotate2DToPoint = PolygonMixin.rotate2DToPoint;
|
|
1121
1045
|
var ColumnSeries = SeriesRegistry.seriesTypes.column;
|
|
1122
1046
|
var extend = U.extend,
|
|
1123
|
-
find = U.find,
|
|
1124
1047
|
isArray = U.isArray,
|
|
1125
1048
|
isNumber = U.isNumber,
|
|
1126
1049
|
isObject = U.isObject,
|
|
1127
1050
|
merge = U.merge;
|
|
1051
|
+
var archimedeanSpiral = WordcloudUtils.archimedeanSpiral,
|
|
1052
|
+
extendPlayingField = WordcloudUtils.extendPlayingField,
|
|
1053
|
+
getBoundingBoxFromPolygon = WordcloudUtils.getBoundingBoxFromPolygon,
|
|
1054
|
+
getPlayingField = WordcloudUtils.getPlayingField,
|
|
1055
|
+
getPolygon = WordcloudUtils.getPolygon,
|
|
1056
|
+
getRandomPosition = WordcloudUtils.getRandomPosition,
|
|
1057
|
+
getRotation = WordcloudUtils.getRotation,
|
|
1058
|
+
getScale = WordcloudUtils.getScale,
|
|
1059
|
+
getSpiral = WordcloudUtils.getSpiral,
|
|
1060
|
+
intersectionTesting = WordcloudUtils.intersectionTesting,
|
|
1061
|
+
isPolygonsColliding = WordcloudUtils.isPolygonsColliding,
|
|
1062
|
+
rectangularSpiral = WordcloudUtils.rectangularSpiral,
|
|
1063
|
+
rotate2DToOrigin = WordcloudUtils.rotate2DToOrigin,
|
|
1064
|
+
rotate2DToPoint = WordcloudUtils.rotate2DToPoint,
|
|
1065
|
+
squareSpiral = WordcloudUtils.squareSpiral,
|
|
1066
|
+
updateFieldBoundaries = WordcloudUtils.updateFieldBoundaries;
|
|
1067
|
+
/* *
|
|
1068
|
+
*
|
|
1069
|
+
* Class
|
|
1070
|
+
*
|
|
1071
|
+
* */
|
|
1128
1072
|
/**
|
|
1129
1073
|
* @private
|
|
1130
1074
|
* @class
|
|
@@ -1262,8 +1206,8 @@
|
|
|
1262
1206
|
};
|
|
1263
1207
|
});
|
|
1264
1208
|
// Calculate the playing field.
|
|
1265
|
-
field =
|
|
1266
|
-
spiral =
|
|
1209
|
+
field = getPlayingField(xAxis.len, yAxis.len, data);
|
|
1210
|
+
spiral = getSpiral(series.spirals[options.spiral], {
|
|
1267
1211
|
field: field
|
|
1268
1212
|
});
|
|
1269
1213
|
// Draw all the points.
|
|
@@ -1299,7 +1243,7 @@
|
|
|
1299
1243
|
point.dimensions.height,
|
|
1300
1244
|
placement.rotation),
|
|
1301
1245
|
rectangle = getBoundingBoxFromPolygon(polygon),
|
|
1302
|
-
delta =
|
|
1246
|
+
delta = intersectionTesting(point, {
|
|
1303
1247
|
rectangle: rectangle,
|
|
1304
1248
|
polygon: polygon,
|
|
1305
1249
|
field: field,
|
|
@@ -1311,9 +1255,9 @@
|
|
|
1311
1255
|
// If there is no space for the word, extend the playing field.
|
|
1312
1256
|
if (!delta && allowExtendPlayingField) {
|
|
1313
1257
|
// Extend the playing field to fit the word.
|
|
1314
|
-
field =
|
|
1258
|
+
field = extendPlayingField(field, rectangle);
|
|
1315
1259
|
// Run intersection testing one more time to place the word.
|
|
1316
|
-
delta =
|
|
1260
|
+
delta = intersectionTesting(point, {
|
|
1317
1261
|
rectangle: rectangle,
|
|
1318
1262
|
polygon: polygon,
|
|
1319
1263
|
field: field,
|
|
@@ -1331,7 +1275,7 @@
|
|
|
1331
1275
|
rectangle.right += delta.x;
|
|
1332
1276
|
rectangle.top += delta.y;
|
|
1333
1277
|
rectangle.bottom += delta.y;
|
|
1334
|
-
field =
|
|
1278
|
+
field = updateFieldBoundaries(field, rectangle);
|
|
1335
1279
|
placed.push(point);
|
|
1336
1280
|
point.isNull = false;
|
|
1337
1281
|
point.isInside = true; // #15447
|
|
@@ -1369,7 +1313,7 @@
|
|
|
1369
1313
|
// Destroy the element after use.
|
|
1370
1314
|
testElement = testElement.destroy();
|
|
1371
1315
|
// Scale the series group to fit within the plotArea.
|
|
1372
|
-
scale =
|
|
1316
|
+
scale = getScale(xAxis.len, yAxis.len, field);
|
|
1373
1317
|
series.group.attr({
|
|
1374
1318
|
scaleX: scale,
|
|
1375
1319
|
scaleY: scale
|
|
@@ -1455,7 +1399,7 @@
|
|
|
1455
1399
|
* cloud. Read more about it in our
|
|
1456
1400
|
* [documentation](https://www.highcharts.com/docs/chart-and-series-types/word-cloud-series#custom-placement-strategies)
|
|
1457
1401
|
*
|
|
1458
|
-
* @validvalue
|
|
1402
|
+
* @validvalue ["center", "random"]
|
|
1459
1403
|
*/
|
|
1460
1404
|
placementStrategy: 'center',
|
|
1461
1405
|
/**
|
|
@@ -1488,7 +1432,7 @@
|
|
|
1488
1432
|
* algorithms for use in word cloud. Read more about it in our
|
|
1489
1433
|
* [documentation](https://www.highcharts.com/docs/chart-and-series-types/word-cloud-series#custom-spiralling-algorithm)
|
|
1490
1434
|
*
|
|
1491
|
-
* @validvalue
|
|
1435
|
+
* @validvalue ["archimedean", "rectangular", "square"]
|
|
1492
1436
|
*/
|
|
1493
1437
|
spiral: 'rectangular',
|
|
1494
1438
|
/**
|
|
@@ -1513,7 +1457,7 @@
|
|
|
1513
1457
|
return WordcloudSeries;
|
|
1514
1458
|
}(ColumnSeries));
|
|
1515
1459
|
extend(WordcloudSeries.prototype, {
|
|
1516
|
-
animate:
|
|
1460
|
+
animate: noop,
|
|
1517
1461
|
animateDrilldown: noop,
|
|
1518
1462
|
animateDrillupFrom: noop,
|
|
1519
1463
|
pointClass: WordcloudPoint,
|
|
@@ -1526,9 +1470,9 @@
|
|
|
1526
1470
|
var field = options.field,
|
|
1527
1471
|
r = options.rotation;
|
|
1528
1472
|
return {
|
|
1529
|
-
x:
|
|
1530
|
-
y:
|
|
1531
|
-
rotation:
|
|
1473
|
+
x: getRandomPosition(field.width) - (field.width / 2),
|
|
1474
|
+
y: getRandomPosition(field.height) - (field.height / 2),
|
|
1475
|
+
rotation: getRotation(r.orientations, point.index, r.from, r.to)
|
|
1532
1476
|
};
|
|
1533
1477
|
},
|
|
1534
1478
|
center: function (point, options) {
|
|
@@ -1536,7 +1480,7 @@
|
|
|
1536
1480
|
return {
|
|
1537
1481
|
x: 0,
|
|
1538
1482
|
y: 0,
|
|
1539
|
-
rotation:
|
|
1483
|
+
rotation: getRotation(r.orientations, point.index, r.from, r.to)
|
|
1540
1484
|
};
|
|
1541
1485
|
}
|
|
1542
1486
|
},
|
|
@@ -1545,13 +1489,13 @@
|
|
|
1545
1489
|
// collision with either another word or the borders. To implement a custom
|
|
1546
1490
|
// spiral, look at the function archimedeanSpiral for example.
|
|
1547
1491
|
spirals: {
|
|
1548
|
-
'archimedean':
|
|
1549
|
-
'rectangular':
|
|
1550
|
-
'square':
|
|
1492
|
+
'archimedean': archimedeanSpiral,
|
|
1493
|
+
'rectangular': rectangularSpiral,
|
|
1494
|
+
'square': squareSpiral
|
|
1551
1495
|
},
|
|
1552
1496
|
utils: {
|
|
1553
|
-
extendPlayingField:
|
|
1554
|
-
getRotation:
|
|
1497
|
+
extendPlayingField: extendPlayingField,
|
|
1498
|
+
getRotation: getRotation,
|
|
1555
1499
|
isPolygonsColliding: isPolygonsColliding,
|
|
1556
1500
|
rotate2DToOrigin: rotate2DToOrigin,
|
|
1557
1501
|
rotate2DToPoint: rotate2DToPoint
|