Skip to content

Commit b35d7ec

Browse files
committed
update ticks when panning sectors using new wrap180 routine
... so that the resulting ticks (via Axes.doTicks) are the same as via a relayout. Note that wrap180 is called also when coercing `valType: 'angle'` attributes.
1 parent a96131d commit b35d7ec

File tree

4 files changed

+17
-10
lines changed

4 files changed

+17
-10
lines changed

src/lib/angles.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@ exports.wrap360 = function(deg) {
2222
var out = deg % 360;
2323
return out < 0 ? out + 360 : out;
2424
};
25+
26+
exports.wrap180 = function(deg) {
27+
if(Math.abs(deg) > 180) deg -= Math.round(deg / 360) * 360;
28+
return deg;
29+
};

src/lib/coerce.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var colorscaleNames = Object.keys(require('../components/colorscale/scales'));
1818
var nestedProperty = require('./nested_property');
1919
var counterRegex = require('./regex').counter;
2020
var DESELECTDIM = require('../constants/interactions').DESELECTDIM;
21+
var wrap180 = require('./angles').wrap180;
2122

2223
exports.valObjectMeta = {
2324
data_array: {
@@ -184,10 +185,7 @@ exports.valObjectMeta = {
184185
coerceFunction: function(v, propOut, dflt) {
185186
if(v === 'auto') propOut.set('auto');
186187
else if(!isNumeric(v)) propOut.set(dflt);
187-
else {
188-
if(Math.abs(v) > 180) v -= Math.round(v / 360) * 360;
189-
propOut.set(+v);
190-
}
188+
else propOut.set(wrap180(+v));
191189
}
192190
},
193191
subplotid: {

src/lib/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ var anglesModule = require('./angles');
8181
lib.deg2rad = anglesModule.deg2rad;
8282
lib.rad2deg = anglesModule.rad2deg;
8383
lib.wrap360 = anglesModule.wrap360;
84+
lib.wrap180 = anglesModule.wrap180;
8485

8586
var geom2dModule = require('./geometry2d');
8687
lib.segmentsIntersect = geom2dModule.segmentsIntersect;

src/plots/polar/polar.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ var MID_SHIFT = require('../../constants/alignment').MID_SHIFT;
2929
var deg2rad = Lib.deg2rad;
3030
var rad2deg = Lib.rad2deg;
3131
var wrap360 = Lib.wrap360;
32+
var wrap180 = Lib.wrap180;
3233

3334
var setConvertAngular = require('./helpers').setConvertAngular;
3435
var constants = require('./constants');
@@ -587,13 +588,19 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
587588
else return;
588589
}
589590

591+
var crossedOrigin = (
592+
sign(x0 - cxx) * sign(x1 - cxx) === -1 &&
593+
sign(cyy - y0) * sign(cyy - y1) === -1
594+
);
595+
if(crossedOrigin) rr0 = 0;
596+
590597
r0 = Math.min(rr0, rr1);
591598
r1 = Math.min(Math.max(rr0, rr1), radius);
592599

593600
var path1;
594601
var cpath;
595602

596-
if(r1 - r0 > MINZOOM) {
603+
if(r1 - r0 > MINZOOM || crossedOrigin) {
597604
path1 = path0 + pathSectorClosed(r1, sector) + pathSectorClosed(r0, sector);
598605

599606
var a = xy2a(x1, y1);
@@ -667,13 +674,9 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
667674
);
668675

669676
var angularAxis = _this.angularAxis;
670-
angularAxis.position = angle1;
677+
angularAxis.position = wrap180(angle1);
671678

672679
if(angularAxis.type === 'linear' && !isFullCircle(sector)) {
673-
// TODO must wrap360 or something to get just right
674-
// on large pan
675-
// or maybe a wrap180 ??
676-
677680
angularAxis.range = sector0
678681
.map(deg2rad)
679682
.map(angularAxis.unTransformRad)

0 commit comments

Comments
 (0)