highcharts-rails 4.0.4.1 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v4.0.4 (2014-09-02)
2
+ * @license Highcharts JS v4.1.0 (2015-02-16)
3
3
  *
4
4
  * Standalone Highcharts Framework
5
5
  *
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v4.0.4 (2014-09-02)
5
+ * @license Highcharts JS v4.1.0 (2015-02-16)
6
6
  *
7
7
  * (c) 2009-2013 Torstein Hønsi
8
8
  *
@@ -23,52 +23,76 @@ var PI = Math.PI,
23
23
  deg2rad = (PI / 180), // degrees to radians
24
24
  sin = Math.sin,
25
25
  cos = Math.cos,
26
-
26
+ pick = Highcharts.pick,
27
27
  round = Math.round;
28
28
 
29
- function perspective(points, angle2, angle1, origin) {
30
- angle1 *= deg2rad;
31
- angle2 *= deg2rad;
32
-
33
- var result = [],
34
- xe,
35
- ye,
36
- ze;
29
+ function perspective(points, chart, insidePlotArea) {
30
+ var options3d = chart.options.chart.options3d,
31
+ inverted = false,
32
+ origin;
37
33
 
38
- angle1 *= -1;
39
-
40
- xe = origin.x;
41
- ye = origin.y;
42
- ze = (origin.z === 0 ? 0.0001 : origin.z) * (origin.vd || 25);
43
-
44
- // some kind of minimum?
45
- ze = Math.max(500, ze);
34
+ if (insidePlotArea) {
35
+ inverted = chart.inverted;
36
+ origin = {
37
+ x: chart.plotWidth / 2,
38
+ y: chart.plotHeight / 2,
39
+ z: options3d.depth / 2,
40
+ vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)
41
+ };
42
+ } else {
43
+ origin = {
44
+ x: chart.plotLeft + (chart.plotWidth / 2),
45
+ y: chart.plotTop + (chart.plotHeight / 2),
46
+ z: options3d.depth / 2,
47
+ vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)
48
+ };
49
+ }
46
50
 
47
- var s1 = sin(angle1),
51
+ var result = [],
52
+ xe = origin.x,
53
+ ye = origin.y,
54
+ ze = origin.z,
55
+ vd = origin.vd,
56
+ angle1 = deg2rad * (inverted ? options3d.beta : -options3d.beta),
57
+ angle2 = deg2rad * (inverted ? -options3d.alpha : options3d.alpha),
58
+ s1 = sin(angle1),
48
59
  c1 = cos(angle1),
49
60
  s2 = sin(angle2),
50
61
  c2 = cos(angle2);
51
62
 
52
- var x, y, z, p;
63
+ var x, y, z, px, py, pz;
53
64
 
54
65
  Highcharts.each(points, function (point) {
55
- x = point.x - xe;
56
- y = point.y - ye;
57
- z = point.z || 0;
58
-
59
- p = {
60
- x: c1 * x - s1 * z,
61
- y: -s1 * s2 * x - c1 * s2 * z + c2 * y,
62
- z: s1 * c2 * x + c1 * c2 * z + s2 * y
63
- };
66
+ x = (inverted ? point.y : point.x) - xe;
67
+ y = (inverted ? point.x : point.y) - ye;
68
+ z = (point.z || 0) - ze;
69
+
70
+ //Apply 3-D rotation
71
+ px = c1 * x - s1 * z;
72
+ py = -s1 * s2 * x - c1 * s2 * z + c2 * y;
73
+ pz = s1 * c2 * x + c1 * c2 * z + s2 * y;
74
+
75
+ //Apply perspective
76
+ if ((vd > 0) && (vd < Number.POSITIVE_INFINITY)) {
77
+ px = px * (vd / (pz + ze + vd));
78
+ py = py * (vd / (pz + ze + vd));
79
+ }
64
80
 
65
- p.x = p.x * ((ze - p.z) / ze) + xe;
66
- p.y = p.y * ((ze - p.z) / ze) + ye;
81
+ //Apply translation
82
+ px = px + xe;
83
+ py = py + ye;
84
+ pz = pz + ze;
67
85
 
68
- result.push({x: round(p.x), y: round(p.y), z: round(p.z)});
86
+ result.push({
87
+ x: (inverted ? py : px),
88
+ y: (inverted ? px : py),
89
+ z: pz
90
+ });
69
91
  });
70
92
  return result;
71
93
  }
94
+ // Make function acessible to plugins
95
+ Highcharts.perspective = perspective;
72
96
  /***
73
97
  EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES
74
98
  ***/
@@ -79,6 +103,26 @@ function defined(obj) {
79
103
  return obj !== undefined && obj !== null;
80
104
  }
81
105
 
106
+ //Shoelace algorithm -- http://en.wikipedia.org/wiki/Shoelace_formula
107
+ function shapeArea(vertexes) {
108
+ var area = 0,
109
+ i,
110
+ j;
111
+ for (i = 0; i < vertexes.length; i++) {
112
+ j = (i + 1) % vertexes.length;
113
+ area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y;
114
+ }
115
+ return area / 2;
116
+ }
117
+
118
+ function averageZ(vertexes) {
119
+ var z = 0,
120
+ i;
121
+ for (i = 0; i < vertexes.length; i++) {
122
+ z += vertexes[i].z;
123
+ }
124
+ return vertexes.length ? z / vertexes.length : 0;
125
+ }
82
126
 
83
127
  function curveTo(cx, cy, rx, ry, start, end, dx, dy) {
84
128
  var result = [];
@@ -113,12 +157,14 @@ Highcharts.SVGRenderer.prototype.toLinePath = function (points, closed) {
113
157
  result.push('L', point.x, point.y);
114
158
  });
115
159
 
116
- // Set the first element to M
117
- result[0] = 'M';
160
+ if (points.length) {
161
+ // Set the first element to M
162
+ result[0] = 'M';
118
163
 
119
- // If it is a closed line, add Z
120
- if (closed) {
121
- result.push('Z');
164
+ // If it is a closed line, add Z
165
+ if (closed) {
166
+ result.push('Z');
167
+ }
122
168
  }
123
169
 
124
170
  return result;
@@ -205,10 +251,9 @@ Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) {
205
251
  z = shapeArgs.z,
206
252
  h = shapeArgs.height,
207
253
  w = shapeArgs.width,
208
- d = shapeArgs.depth,
209
- alpha = shapeArgs.alpha,
210
- beta = shapeArgs.beta,
211
- origin = shapeArgs.origin;
254
+ d = shapeArgs.depth,
255
+ chart = Highcharts.charts[this.chartIndex],
256
+ map = Highcharts.map;
212
257
 
213
258
  var pArr = [
214
259
  {x: x, y: y, z: z},
@@ -221,71 +266,36 @@ Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) {
221
266
  {x: x, y: y, z: z + d}
222
267
  ];
223
268
 
224
- pArr = perspective(pArr, alpha, beta, origin);
269
+ pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);
225
270
 
226
- var path1, // FRONT
227
- path2, // TOP OR BOTTOM
228
- path3; // LEFT OR RIGHT
271
+ var pickShape = function (path1, path2) {
272
+ path1 = map(path1, function (i) { return pArr[i]; });
273
+ path2 = map(path2, function (i) { return pArr[i]; });
274
+ if (shapeArea(path1) < 0) {
275
+ return path1;
276
+ } else if (shapeArea(path2) < 0) {
277
+ return path2;
278
+ } else {
279
+ return [];
280
+ }
281
+ };
229
282
 
230
- // front
231
- path1 = [
232
- 'M', pArr[0].x, pArr[0].y,
233
- 'L', pArr[1].x, pArr[1].y,
234
- 'L', pArr[2].x, pArr[2].y,
235
- 'L', pArr[3].x, pArr[3].y,
236
- 'Z'
237
- ];
238
- var z1 = (pArr[0].z + pArr[1].z + pArr[2].z + pArr[3].z) / 4;
283
+ // front or back
284
+ var front = [3, 2, 1, 0];
285
+ var back = [7, 6, 5, 4];
286
+ var path1 = pickShape(front, back);
239
287
 
240
288
  // top or bottom
241
- var top = [
242
- 'M', pArr[0].x, pArr[0].y,
243
- 'L', pArr[7].x, pArr[7].y,
244
- 'L', pArr[6].x, pArr[6].y,
245
- 'L', pArr[1].x, pArr[1].y,
246
- 'Z'
247
- ];
248
- var bottom = [
249
- 'M', pArr[3].x, pArr[3].y,
250
- 'L', pArr[2].x, pArr[2].y,
251
- 'L', pArr[5].x, pArr[5].y,
252
- 'L', pArr[4].x, pArr[4].y,
253
- 'Z'
254
- ];
255
- if (pArr[7].y < pArr[1].y) {
256
- path2 = top;
257
- } else if (pArr[4].y > pArr[2].y) {
258
- path2 = bottom;
259
- } else {
260
- path2 = [];
261
- }
262
- var z2 = (beta > 0 ? (pArr[0].z + pArr[7].z + pArr[6].z + pArr[1].z) / 4 : (pArr[3].z + pArr[2].z + pArr[5].z + pArr[4].z) / 4);
289
+ var top = [1, 6, 7, 0];
290
+ var bottom = [4, 5, 2, 3];
291
+ var path2 = pickShape(top, bottom);
263
292
 
264
293
  // side
265
- var right = [
266
- 'M', pArr[1].x, pArr[1].y,
267
- 'L', pArr[2].x, pArr[2].y,
268
- 'L', pArr[5].x, pArr[5].y,
269
- 'L', pArr[6].x, pArr[6].y,
270
- 'Z'
271
- ];
272
- var left = [
273
- 'M', pArr[0].x, pArr[0].y,
274
- 'L', pArr[7].x, pArr[7].y,
275
- 'L', pArr[4].x, pArr[4].y,
276
- 'L', pArr[3].x, pArr[3].y,
277
- 'Z'
278
- ];
279
- if (pArr[6].x > pArr[1].x) {
280
- path3 = right;
281
- } else if (pArr[7].x < pArr[0].x) {
282
- path3 = left;
283
- } else {
284
- path3 = [];
285
- }
286
- var z3 = (alpha > 0 ? (pArr[1].z + pArr[2].z + pArr[5].z + pArr[6].z) / 4 : (pArr[0].z + pArr[7].z + pArr[4].z + pArr[3].z) / 4);
294
+ var right = [1, 2, 5, 6];
295
+ var left = [0, 7, 4, 3];
296
+ var path3 = pickShape(right, left);
287
297
 
288
- return [path1, path2, path3, z1, z2, z3];
298
+ return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3)];
289
299
  };
290
300
 
291
301
  ////// SECTORS //////
@@ -302,8 +312,8 @@ Highcharts.SVGRenderer.prototype.arc3d = function (shapeArgs) {
302
312
  result.shapeArgs = shapeArgs; // Store for later use
303
313
 
304
314
  result.top = renderer.path(paths.top).attr({zIndex: paths.zTop}).add(result);
305
- result.side1 = renderer.path(paths.side2).attr({zIndex: paths.zSide2});
306
- result.side2 = renderer.path(paths.side1).attr({zIndex: paths.zSide1});
315
+ result.side1 = renderer.path(paths.side2).attr({zIndex: paths.zSide1});
316
+ result.side2 = renderer.path(paths.side1).attr({zIndex: paths.zSide2});
307
317
  result.inn = renderer.path(paths.inn).attr({zIndex: paths.zInn});
308
318
  result.out = renderer.path(paths.out).attr({zIndex: paths.zOut});
309
319
 
@@ -569,6 +579,17 @@ Highcharts.wrap(Highcharts.Chart.prototype, 'redraw', function (proceed) {
569
579
  proceed.apply(this, [].slice.call(arguments, 1));
570
580
  });
571
581
 
582
+ // Draw the series in the reverse order (#3803)
583
+ Highcharts.Chart.prototype.renderSeries = function () {
584
+ var serie,
585
+ i = this.series.length;
586
+ while (i--) {
587
+ serie = this.series[i];
588
+ serie.translate();
589
+ serie.render();
590
+ }
591
+ };
592
+
572
593
  Highcharts.Chart.prototype.retrieveStacks = function (grouping, stacking) {
573
594
 
574
595
  var stacks = {},
@@ -588,7 +609,7 @@ Highcharts.Chart.prototype.retrieveStacks = function (grouping, stacking) {
588
609
  return stacks;
589
610
  };
590
611
 
591
- /***
612
+ /***
592
613
  EXTENSION TO THE AXIS
593
614
  ***/
594
615
  Highcharts.wrap(Highcharts.Axis.prototype, 'init', function (proceed) {
@@ -611,8 +632,6 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
611
632
  var chart = this.chart,
612
633
  renderer = chart.renderer,
613
634
  options3d = chart.options.chart.options3d,
614
- alpha = options3d.alpha,
615
- beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1),
616
635
  frame = options3d.frame,
617
636
  fbottom = frame.bottom,
618
637
  fback = frame.back,
@@ -623,12 +642,6 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
623
642
  left = this.left,
624
643
  top = this.top;
625
644
 
626
- var origin = {
627
- x: chart.plotLeft + (chart.plotWidth / 2),
628
- y: chart.plotTop + (chart.plotHeight / 2),
629
- z: depth,
630
- vd: options3d.viewDistance
631
- };
632
645
  if (this.horiz) {
633
646
  /// BOTTOM
634
647
  if (this.axisLine) {
@@ -641,12 +654,10 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
641
654
  width: width,
642
655
  height: fbottom.size,
643
656
  depth: depth,
644
- alpha: alpha,
645
- beta: beta,
646
- origin: origin
657
+ insidePlotArea: false
647
658
  };
648
659
  if (!this.bottomFrame) {
649
- this.bottomFrame = renderer.cuboid(bottomShape).attr({fill: fbottom.color, zIndex: (chart.yAxis[0].reversed && alpha > 0 ? 4 : -1)}).css({stroke: fbottom.color}).add();
660
+ this.bottomFrame = renderer.cuboid(bottomShape).attr({fill: fbottom.color, zIndex: (chart.yAxis[0].reversed && options3d.alpha > 0 ? 4 : -1)}).css({stroke: fbottom.color}).add();
650
661
  } else {
651
662
  this.bottomFrame.animate(bottomShape);
652
663
  }
@@ -659,9 +670,7 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
659
670
  width: width,
660
671
  height: height + fbottom.size,
661
672
  depth: fback.size,
662
- alpha: alpha,
663
- beta: beta,
664
- origin: origin
673
+ insidePlotArea: false
665
674
  };
666
675
  if (!this.backFrame) {
667
676
  this.backFrame = renderer.cuboid(backShape).attr({fill: fback.color, zIndex: -3}).css({stroke: fback.color}).add();
@@ -679,9 +688,7 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
679
688
  width: fside.size,
680
689
  height: height + fbottom.size,
681
690
  depth: depth + fback.size,
682
- alpha: alpha,
683
- beta: beta,
684
- origin: origin
691
+ insidePlotArea: false
685
692
  };
686
693
  if (!this.sideFrame) {
687
694
  this.sideFrame = renderer.cuboid(sideShape).attr({fill: fside.color, zIndex: -2}).css({stroke: fside.color}).add();
@@ -693,7 +700,7 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
693
700
 
694
701
  Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed) {
695
702
  var path = proceed.apply(this, [].slice.call(arguments, 1));
696
-
703
+
697
704
  // Do not do this if the chart is not 3D
698
705
  if (!this.chart.is3d()) {
699
706
  return path;
@@ -706,13 +713,6 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed)
706
713
 
707
714
  var d = options3d.depth;
708
715
 
709
- options3d.origin = {
710
- x: chart.plotLeft + (chart.plotWidth / 2),
711
- y: chart.plotTop + (chart.plotHeight / 2),
712
- z: d,
713
- vd: options3d.viewDistance
714
- };
715
-
716
716
  var pArr = [
717
717
  { x: path[1], y: path[2], z : (this.horiz || this.opposite ? d : 0)},
718
718
  { x: path[1], y: path[2], z : d },
@@ -720,12 +720,7 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed)
720
720
  { x: path[4], y: path[5], z : (this.horiz || this.opposite ? 0 : d)}
721
721
  ];
722
722
 
723
- var alpha = chart.options.inverted ? options3d.beta : options3d.alpha,
724
- beta = chart.options.inverted ? options3d.alpha : options3d.beta;
725
-
726
- beta *= (chart.yAxis[0].opposite ? -1 : 1);
727
-
728
- pArr = perspective(pArr, alpha, beta, options3d.origin);
723
+ pArr = perspective(pArr, this.chart, false);
729
724
  path = this.chart.renderer.toLinePath(pArr, false);
730
725
 
731
726
  return path;
@@ -772,27 +767,12 @@ Highcharts.wrap(Highcharts.Tick.prototype, 'getMarkPath', function (proceed) {
772
767
  return path;
773
768
  }
774
769
 
775
- var chart = this.axis.chart,
776
- options3d = chart.options.chart.options3d;
777
-
778
- var origin = {
779
- x: chart.plotLeft + (chart.plotWidth / 2),
780
- y: chart.plotTop + (chart.plotHeight / 2),
781
- z: options3d.depth,
782
- vd: options3d.viewDistance
783
- };
784
-
785
770
  var pArr = [
786
771
  {x: path[1], y: path[2], z: 0},
787
772
  {x: path[4], y: path[5], z: 0}
788
773
  ];
789
-
790
- var alpha = chart.inverted ? options3d.beta : options3d.alpha,
791
- beta = chart.inverted ? options3d.alpha : options3d.beta;
792
-
793
- beta *= (chart.yAxis[0].opposite ? -1 : 1);
794
774
 
795
- pArr = perspective(pArr, alpha, beta, origin);
775
+ pArr = perspective(pArr, this.axis.chart, false);
796
776
  path = [
797
777
  'M', pArr[0].x, pArr[0].y,
798
778
  'L', pArr[1].x, pArr[1].y
@@ -808,22 +788,9 @@ Highcharts.wrap(Highcharts.Tick.prototype, 'getLabelPosition', function (proceed
808
788
  return pos;
809
789
  }
810
790
 
811
- var chart = this.axis.chart,
812
- options3d = chart.options.chart.options3d;
813
-
814
- var origin = {
815
- x: chart.plotLeft + (chart.plotWidth / 2),
816
- y: chart.plotTop + (chart.plotHeight / 2),
817
- z: options3d.depth,
818
- vd: options3d.viewDistance
819
- };
820
-
821
- var alpha = chart.inverted ? options3d.beta : options3d.alpha,
822
- beta = chart.inverted ? options3d.alpha : options3d.beta;
823
-
824
- beta *= (chart.yAxis[0].opposite ? -1 : 1);
791
+ pos = perspective([{x: pos.x, y: pos.y, z: 0}], this.axis.chart, false)[0];
792
+ pos.x = pos.x - (!this.axis.horiz && this.axis.opposite ? this.axis.transA : 0); //#3788
825
793
 
826
- pos = perspective([{x: pos.x, y: pos.y, z: 0}], alpha, beta, origin)[0];
827
794
  return pos;
828
795
  });
829
796
 
@@ -838,7 +805,8 @@ Highcharts.wrap(Highcharts.Axis.prototype, 'drawCrosshair', function (proceed) {
838
805
  }
839
806
  }
840
807
  proceed.apply(this, [].slice.call(args, 1));
841
- });/***
808
+ });
809
+ /***
842
810
  EXTENSION FOR 3D COLUMNS
843
811
  ***/
844
812
  Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (proceed) {
@@ -851,21 +819,10 @@ Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (
851
819
 
852
820
  var series = this,
853
821
  chart = series.chart,
854
- options = chart.options,
855
- seriesOptions = series.options,
856
- options3d = options.chart.options3d,
857
-
858
- depth = seriesOptions.depth || 25,
859
- origin = {
860
- x: chart.plotWidth / 2,
861
- y: chart.plotHeight / 2,
862
- z: options3d.depth,
863
- vd: options3d.viewDistance
864
- },
865
- alpha = options3d.alpha,
866
- beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1);
822
+ seriesOptions = series.options,
823
+ depth = seriesOptions.depth || 25;
867
824
 
868
- var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i;
825
+ var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i;
869
826
  var z = stack * (depth + (seriesOptions.groupZPadding || 1));
870
827
 
871
828
  if (seriesOptions.grouping !== false) { z = 0; }
@@ -878,14 +835,12 @@ Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (
878
835
  tooltipPos = point.tooltipPos;
879
836
 
880
837
  point.shapeType = 'cuboid';
881
- shapeArgs.alpha = alpha;
882
- shapeArgs.beta = beta;
883
838
  shapeArgs.z = z;
884
- shapeArgs.origin = origin;
885
839
  shapeArgs.depth = depth;
840
+ shapeArgs.insidePlotArea = true;
886
841
 
887
842
  // Translate the tooltip position in 3d space
888
- tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], alpha, beta, origin)[0];
843
+ tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], chart, false)[0];
889
844
  point.tooltipPos = [tooltipPos.x, tooltipPos.y];
890
845
  }
891
846
  });
@@ -999,23 +954,13 @@ Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed
999
954
  // Only do this for 3D columns and columnranges
1000
955
  if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {
1001
956
  var series = this,
1002
- chart = series.chart,
1003
- options = chart.options,
1004
- options3d = options.chart.options3d,
1005
- origin = {
1006
- x: chart.plotWidth / 2,
1007
- y: chart.plotHeight / 2,
1008
- z: options3d.depth,
1009
- vd: options3d.viewDistance
1010
- },
1011
- alpha = options3d.alpha,
1012
- beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1);
957
+ chart = series.chart;
1013
958
 
1014
959
  var args = arguments,
1015
960
  alignTo = args[4];
1016
961
 
1017
962
  var pos = ({x: alignTo.x, y: alignTo.y, z: 0});
1018
- pos = perspective([pos], alpha, beta, origin)[0];
963
+ pos = perspective([pos], chart, true)[0];
1019
964
  alignTo.x = pos.x;
1020
965
  alignTo.y = pos.y;
1021
966
  }
@@ -1187,13 +1132,14 @@ Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawDataLabels', function
1187
1132
  var shapeArgs = point.shapeArgs,
1188
1133
  r = shapeArgs.r,
1189
1134
  d = shapeArgs.depth,
1190
- a1 = shapeArgs.alpha * deg2rad,
1135
+ a1 = (shapeArgs.alpha || series.chart.options.chart.options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values
1191
1136
  a2 = (shapeArgs.start + shapeArgs.end) / 2,
1192
1137
  labelPos = point.labelPos;
1193
1138
 
1194
1139
  labelPos[1] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1195
1140
  labelPos[3] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1196
1141
  labelPos[5] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1142
+
1197
1143
  });
1198
1144
  }
1199
1145
 
@@ -1277,36 +1223,38 @@ Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'translate', function
1277
1223
 
1278
1224
  var series = this,
1279
1225
  chart = series.chart,
1280
- options3d = series.chart.options.chart.options3d,
1281
- alpha = options3d.alpha,
1282
- beta = options3d.beta,
1283
- origin = {
1284
- x: chart.inverted ? chart.plotHeight / 2 : chart.plotWidth / 2,
1285
- y: chart.inverted ? chart.plotWidth / 2 : chart.plotHeight / 2,
1286
- z: options3d.depth,
1287
- vd: options3d.viewDistance
1288
- },
1289
- depth = options3d.depth,
1226
+ depth = chart.options.chart.options3d.depth,
1290
1227
  zAxis = chart.options.zAxis || { min : 0, max: depth };
1291
-
1292
- var rangeModifier = depth / (zAxis.max - zAxis.min);
1293
-
1294
- Highcharts.each(series.data, function (point) {
1295
- var pCo = {
1296
- x: point.plotX,
1297
- y: point.plotY,
1298
- z: (point.z - zAxis.min) * rangeModifier
1299
- };
1300
1228
 
1301
- pCo = perspective([pCo], alpha, beta, origin)[0];
1229
+ var rangeModifier = depth / (zAxis.max - zAxis.min),
1230
+ raw_points = [],
1231
+ raw_point,
1232
+ projected_points,
1233
+ projected_point,
1234
+ i;
1235
+
1236
+ for (i = 0; i < series.data.length; i++) {
1237
+ raw_point = series.data[i];
1238
+ raw_points.push({
1239
+ x: raw_point.plotX,
1240
+ y: raw_point.plotY,
1241
+ z: (raw_point.z - zAxis.min) * rangeModifier
1242
+ });
1243
+ }
1302
1244
 
1303
- point.plotXold = point.plotX;
1304
- point.plotYold = point.plotY;
1305
-
1306
- point.plotX = pCo.x;
1307
- point.plotY = pCo.y;
1308
- point.plotZ = pCo.z;
1309
- });
1245
+ projected_points = perspective(raw_points, chart, true);
1246
+
1247
+ for (i = 0; i < series.data.length; i++) {
1248
+ raw_point = series.data[i];
1249
+ projected_point = projected_points[i];
1250
+
1251
+ raw_point.plotXold = raw_point.plotX;
1252
+ raw_point.plotYold = raw_point.plotY;
1253
+
1254
+ raw_point.plotX = projected_point.x;
1255
+ raw_point.plotY = projected_point.y;
1256
+ raw_point.plotZ = projected_point.z;
1257
+ }
1310
1258
  });
1311
1259
 
1312
1260
  Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proceed) {
@@ -1325,7 +1273,8 @@ Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proc
1325
1273
  }
1326
1274
  }
1327
1275
  return result;
1328
- });/**
1276
+ });
1277
+ /**
1329
1278
  * Extension to the VML Renderer
1330
1279
  */
1331
1280
  if (Highcharts.VMLRenderer) {
@@ -1347,20 +1296,6 @@ Highcharts.VMLRenderer.prototype.arc3d = function (shapeArgs) {
1347
1296
 
1348
1297
  Highcharts.VMLRenderer.prototype.arc3dPath = Highcharts.SVGRenderer.prototype.arc3dPath;
1349
1298
 
1350
- // Draw the series in the reverse order
1351
- Highcharts.Chart.prototype.renderSeries = function () {
1352
- var serie,
1353
- i = this.series.length;
1354
- while (i--) {
1355
- serie = this.series[i];
1356
- serie.translate();
1357
- if (serie.setTooltipPoints) {
1358
- serie.setTooltipPoints();
1359
- }
1360
- serie.render();
1361
- }
1362
- };
1363
-
1364
1299
  Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
1365
1300
  proceed.apply(this, [].slice.call(arguments, 1));
1366
1301
  // VML doesn't support a negative z-index