@@ -528,9 +528,9 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
528
528
529
529
proto . updateFx = function ( fullLayout , polarLayout ) {
530
530
if ( ! this . gd . _context . staticPlot ) {
531
- this . updateMainDrag ( fullLayout , polarLayout ) ;
532
531
this . updateAngularDrag ( fullLayout , polarLayout ) ;
533
532
this . updateRadialDrag ( fullLayout , polarLayout ) ;
533
+ this . updateMainDrag ( fullLayout , polarLayout ) ;
534
534
}
535
535
} ;
536
536
@@ -858,6 +858,10 @@ proto.updateRadialDrag = function(fullLayout, polarLayout) {
858
858
dragBox . clearSelect ( fullLayout . _zoomlayer ) ;
859
859
} ;
860
860
861
+ // decrease min drag value to be able to catch smaller dx/dy that
862
+ // can determine rotateMove vs rerangeMove
863
+ dragOpts . minDrag = 2 ;
864
+
861
865
dragElement . init ( dragOpts ) ;
862
866
} ;
863
867
@@ -871,17 +875,18 @@ proto.updateAngularDrag = function(fullLayout, polarLayout) {
871
875
var cxx = _this . cxx ;
872
876
var cyy = _this . cyy ;
873
877
var sector = polarLayout . sector ;
878
+ var dbs = constants . angularDragBoxSize ;
874
879
875
880
var angularDrag = dragBox . makeDragger ( layers , 'path' , 'angulardrag' , 'move' ) ;
876
881
var dragOpts = { element : angularDrag , gd : gd } ;
877
882
878
883
d3 . select ( angularDrag )
879
- . attr ( 'd' , pathAnnulus ( radius , radius + constants . angularDragBoxSize , sector ) )
884
+ . attr ( 'd' , pathAnnulus ( radius , radius + dbs , sector ) )
880
885
. attr ( 'transform' , strTranslate ( cx , cy ) )
881
886
. call ( setCursor , 'move' ) ;
882
887
883
888
function xy2a ( x , y ) {
884
- return Math . atan2 ( cyy - y , x - cxx ) ;
889
+ return Math . atan2 ( cyy + dbs - y , x - cxx - dbs ) ;
885
890
}
886
891
887
892
// scatter trace, points and textpoints selections
@@ -909,6 +914,10 @@ proto.updateAngularDrag = function(fullLayout, polarLayout) {
909
914
strTranslate ( _this . xOffset2 , _this . yOffset2 ) + strRotate ( [ - da , cxx , cyy ] )
910
915
) ;
911
916
917
+ _this . clipPaths . circle . select ( 'path' ) . attr ( 'transform' ,
918
+ strTranslate ( cxx , cyy ) + strRotate ( da )
919
+ ) ;
920
+
912
921
// 'un-rotate' marker and text points
913
922
scatterPoints . each ( function ( ) {
914
923
var sel = d3 . select ( this ) ;
@@ -1111,29 +1120,42 @@ function pathSectorClosed(r, sector) {
1111
1120
( isFullCircle ( sector ) ? '' : 'L0,0Z' ) ;
1112
1121
}
1113
1122
1114
- // inspired by https://gist.github.com/buschtoens/4190516
1115
- function pathAnnulus ( r0 , r1 , _sector ) {
1116
- var sector = _sector . slice ( ) ;
1117
- var s0 = deg2rad ( sector [ 0 ] ) ;
1118
- var s1 = deg2rad ( sector [ 1 ] ) ;
1119
-
1120
- // make a small cut on full sectors so that the
1121
- // inner region isn't filled
1122
- if ( isFullCircle ( sector ) ) s1 -= 1e-3 ;
1123
+ // TODO recycle this routine with the ones used for pie traces.
1124
+ function pathAnnulus ( r0 , r1 , sector ) {
1125
+ var largeArc = Math . abs ( sector [ 1 ] - sector [ 0 ] ) <= 180 ? 0 : 1 ;
1126
+ // sector angle at [s]tart, [m]iddle and [e]nd
1127
+ var ss , sm , se ;
1123
1128
1124
- var p00 = [ r0 * Math . cos ( s0 ) , - r0 * Math . sin ( s0 ) ] ;
1125
- var p01 = [ r0 * Math . cos ( s1 ) , - r0 * Math . sin ( s1 ) ] ;
1126
- var p10 = [ r1 * Math . cos ( s0 ) , - r1 * Math . sin ( s0 ) ] ;
1127
- var p11 = [ r1 * Math . cos ( s1 ) , - r1 * Math . sin ( s1 ) ] ;
1129
+ function pt ( r , s ) {
1130
+ return [ r * Math . cos ( s ) , - r * Math . sin ( s ) ] ;
1131
+ }
1128
1132
1129
- var largeArc = Math . abs ( sector [ 1 ] - sector [ 0 ] ) <= 180 ? 0 : 1 ;
1133
+ function arc ( r , s , cw ) {
1134
+ return 'A' + [ r , r ] + ' ' + [ 0 , largeArc , cw ] + ' ' + pt ( r , s ) ;
1135
+ }
1130
1136
1131
- return 'M' + p00 +
1132
- 'L' + p10 +
1133
- 'A' + [ r1 , r1 ] + ' ' + [ 0 , largeArc , 0 ] + ' ' + p11 +
1134
- 'L' + p01 +
1135
- 'A' + [ r0 , r0 ] + ' ' + [ 0 , largeArc , 1 ] + ' ' + p00 +
1136
- 'Z' ;
1137
+ if ( isFullCircle ( sector ) ) {
1138
+ ss = 0 ;
1139
+ se = 2 * Math . PI ;
1140
+ sm = Math . PI ;
1141
+ return 'M' + pt ( r0 , ss ) +
1142
+ arc ( r0 , sm , 0 ) +
1143
+ arc ( r0 , se , 0 ) +
1144
+ 'Z' +
1145
+ 'M' + pt ( r1 , ss ) +
1146
+ arc ( r1 , sm , 1 ) +
1147
+ arc ( r1 , se , 1 ) +
1148
+ 'Z' ;
1149
+ } else {
1150
+ ss = deg2rad ( sector [ 0 ] ) ;
1151
+ se = deg2rad ( sector [ 1 ] ) ;
1152
+ return 'M' + pt ( r0 , ss ) +
1153
+ 'L' + pt ( r1 , ss ) +
1154
+ arc ( r1 , se , 0 ) +
1155
+ 'L' + pt ( r0 , se ) +
1156
+ arc ( r0 , ss , 1 ) +
1157
+ 'Z' ;
1158
+ }
1137
1159
}
1138
1160
1139
1161
function isFullCircle ( sector ) {
0 commit comments