@@ -3480,7 +3480,9 @@ axes.drawLabels = function(gd, ax, opts) {
3480
3480
var labelFns = opts . labelFns ;
3481
3481
var tickAngle = opts . secondary ? 0 : ax . tickangle ;
3482
3482
3483
- var autoTickAngles = ax . autotickangles ;
3483
+ var autoTickAnglesRadians = ax . autotickangles ?
3484
+ ax . autotickangles . map ( function ( degrees ) { return degrees * Math . PI / 180 ; } ) :
3485
+ undefined ;
3484
3486
var prevAngle = ( ax . _prevTickAngles || { } ) [ cls ] ;
3485
3487
3486
3488
var tickLabels = opts . layer . selectAll ( 'g.' + cls )
@@ -3784,30 +3786,30 @@ axes.drawLabels = function(gd, ax, opts) {
3784
3786
( ax . tickwidth || 0 ) + 2 * TEXTPAD ;
3785
3787
3786
3788
// old behavior for backwards-compatibility
3787
- var angle = ( ( tickSpacing < maxFontSize * 2.5 ) || ax . type === 'multicategory' || ax . _name === 'realaxis' ) ? 90 : 30 ;
3789
+ var angleRadians = ( ( ( tickSpacing < maxFontSize * 2.5 ) || ax . type === 'multicategory' || ax . _name === 'realaxis' ) ? 90 : 30 ) * Math . PI / 180 ;
3788
3790
// autotickangles
3789
- if ( autoTickAngles !== undefined ) {
3791
+ if ( autoTickAnglesRadians !== undefined ) {
3790
3792
var adjacent = tickSpacing ;
3791
3793
var opposite = maxFontSize * 1.25 * maxLines ;
3792
3794
var hypotenuse = Math . sqrt ( Math . pow ( adjacent , 2 ) + Math . pow ( opposite , 2 ) ) ;
3793
- // sin(angle) = opposite / hypotenuse
3794
- var minAngle = Math . asin ( opposite / hypotenuse ) * ( 180 / Math . PI /* to degrees */ ) ;
3795
-
3796
- angle = autoTickAngles . find ( function ( angle ) { return Math . abs ( angle ) >= minAngle ; } ) ;
3797
- if ( angle === undefined ) {
3798
- // no angle larger than minAngle, just pick the largest angle
3799
- angle = autoTickAngles . reduce (
3800
- function ( currentMax , nextAngle ) { return Math . abs ( currentMax ) < Math . abs ( nextAngle ) ? nextAngle : currentMax ; }
3801
- , autoTickAngles [ 0 ]
3795
+ var maxCos = adjacent / hypotenuse ;
3796
+ angleRadians = autoTickAnglesRadians . find ( function ( angle ) { return Math . abs ( Math . cos ( angle ) ) <= maxCos ; } ) ;
3797
+ if ( angleRadians === undefined ) {
3798
+ // no angle with smaller cosine than maxCos, just pick the angle with smallest cosine
3799
+ angleRadians = autoTickAnglesRadians . reduce (
3800
+ function ( currentMax , nextAngle ) {
3801
+ return Math . abs ( Math . cos ( currentMax ) ) < Math . abs ( Math . cos ( nextAngle ) ) ? currentMax : nextAngle ;
3802
+ }
3803
+ , autoTickAnglesRadians [ 0 ]
3802
3804
) ;
3803
3805
}
3804
3806
}
3805
3807
if ( prevAngle !== undefined ) {
3806
- angle = Math . abs ( angle ) > Math . abs ( prevAngle ) ? angle : prevAngle ;
3808
+ angleRadians = Math . abs ( Math . cos ( angleRadians ) ) < Math . abs ( Math . cos ( prevAngle ) ) ? angleRadians : prevAngle ;
3807
3809
}
3808
3810
for ( i = 0 ; i < lbbArray . length - 1 ; i ++ ) {
3809
3811
if ( Lib . bBoxIntersect ( lbbArray [ i ] , lbbArray [ i + 1 ] , pad ) ) {
3810
- autoangle = angle ;
3812
+ autoangle = angleRadians * ( 180 / Math . PI /* to degrees */ ) ;
3811
3813
break ;
3812
3814
}
3813
3815
}
0 commit comments