From c58a83221cf552b7cc9cc0a53254944b60da3cd0 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 27 May 2019 19:12:38 -0400 Subject: [PATCH 1/2] refactor and fix bug 2950 --- src/traces/parcoords/axisbrush.js | 34 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/traces/parcoords/axisbrush.js b/src/traces/parcoords/axisbrush.js index e84c53c4438..ce56da9e5d7 100644 --- a/src/traces/parcoords/axisbrush.js +++ b/src/traces/parcoords/axisbrush.js @@ -28,34 +28,36 @@ function closeToCovering(v, vAdjacent) { return v * (1 - snapClose) + vAdjacent function ordinalScaleSnapLo(a, v, existingRanges) { if(overlappingExisting(v, existingRanges)) return v; - var aPrev = a[0]; - var aPrevPrev = aPrev; - for(var i = 1; i < a.length; i++) { - var aNext = a[i]; + var aHere = a[0]; + var aPrev = aHere; + for(var i = 0; i < a.length - 1; i++) { + var nextI = i + 1; + var aNext = a[nextI]; // very close to the previous - snap down to it - if(v < closeToCovering(aPrev, aNext)) return snapOvershoot(aPrev, aPrevPrev); - if(v < aNext || i === a.length - 1) return snapOvershoot(aNext, aPrev); + if(v < closeToCovering(aHere, aNext)) return snapOvershoot(aHere, aPrev); + if(v < aNext || nextI === a.length - 1) return snapOvershoot(aNext, aHere); - aPrevPrev = aPrev; - aPrev = aNext; + aPrev = aHere; + aHere = aNext; } } function ordinalScaleSnapHi(a, v, existingRanges) { if(overlappingExisting(v, existingRanges)) return v; - var aPrev = a[a.length - 1]; - var aPrevPrev = aPrev; - for(var i = a.length - 2; i >= 0; i--) { - var aNext = a[i]; + var aHere = a[a.length - 1]; + var aPrev = aHere; + for(var i = a.length - 1; i > 0; i--) { + var nextI = i - 1; + var aNext = a[nextI]; // very close to the previous - snap down to it - if(v > closeToCovering(aPrev, aNext)) return snapOvershoot(aPrev, aPrevPrev); - if(v > aNext || i === a.length - 1) return snapOvershoot(aNext, aPrev); + if(v > closeToCovering(aHere, aNext)) return snapOvershoot(aHere, aPrev); + if(v > aNext || nextI === 0) return snapOvershoot(aNext, aHere); - aPrevPrev = aPrev; - aPrev = aNext; + aPrev = aHere; + aHere = aNext; } } From 0555cfab0bbe49b834083b2f7477bfea4d7cb27c Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 27 May 2019 19:55:10 -0400 Subject: [PATCH 2/2] parcoords axisbrush refactor - remove extra function --- src/traces/parcoords/axisbrush.js | 42 ++++----- .../gl2d_parcoords_select_first_last_enum.png | Bin 0 -> 17100 bytes ...gl2d_parcoords_select_first_last_enum.json | 85 ++++++++++++++++++ 3 files changed, 102 insertions(+), 25 deletions(-) create mode 100644 test/image/baselines/gl2d_parcoords_select_first_last_enum.png create mode 100644 test/image/mocks/gl2d_parcoords_select_first_last_enum.json diff --git a/src/traces/parcoords/axisbrush.js b/src/traces/parcoords/axisbrush.js index ce56da9e5d7..b0add8c017e 100644 --- a/src/traces/parcoords/axisbrush.js +++ b/src/traces/parcoords/axisbrush.js @@ -25,36 +25,28 @@ function closeToCovering(v, vAdjacent) { return v * (1 - snapClose) + vAdjacent // so it's clear we're covering it // find the interval we're in, and snap to 1/4 the distance to the next // these two could be unified at a slight loss of readability / perf -function ordinalScaleSnapLo(a, v, existingRanges) { +function ordinalScaleSnap(isHigh, a, v, existingRanges) { if(overlappingExisting(v, existingRanges)) return v; - var aHere = a[0]; - var aPrev = aHere; - for(var i = 0; i < a.length - 1; i++) { - var nextI = i + 1; - var aNext = a[nextI]; + var dir = isHigh ? -1 : 1; - // very close to the previous - snap down to it - if(v < closeToCovering(aHere, aNext)) return snapOvershoot(aHere, aPrev); - if(v < aNext || nextI === a.length - 1) return snapOvershoot(aNext, aHere); - - aPrev = aHere; - aHere = aNext; + var first = 0; + var last = a.length - 1; + if(dir < 0) { + var tmp = first; + first = last; + last = tmp; } -} - -function ordinalScaleSnapHi(a, v, existingRanges) { - if(overlappingExisting(v, existingRanges)) return v; - var aHere = a[a.length - 1]; + var aHere = a[first]; var aPrev = aHere; - for(var i = a.length - 1; i > 0; i--) { - var nextI = i - 1; + for(var i = first; dir * i < dir * last; i += dir) { + var nextI = i + dir; var aNext = a[nextI]; // very close to the previous - snap down to it - if(v > closeToCovering(aHere, aNext)) return snapOvershoot(aHere, aPrev); - if(v > aNext || nextI === 0) return snapOvershoot(aNext, aHere); + if(dir * v < dir * closeToCovering(aHere, aNext)) return snapOvershoot(aHere, aPrev); + if(dir * v < dir * aNext || nextI === last) return snapOvershoot(aNext, aHere); aPrev = aHere; aHere = aNext; @@ -335,8 +327,8 @@ function attachDragBehavior(selection) { var a = d.unitTickvals; if(a[a.length - 1] < a[0]) a.reverse(); s.newExtent = [ - ordinalScaleSnapLo(a, s.newExtent[0], s.stayingIntervals), - ordinalScaleSnapHi(a, s.newExtent[1], s.stayingIntervals) + ordinalScaleSnap(0, a, s.newExtent[0], s.stayingIntervals), + ordinalScaleSnap(1, a, s.newExtent[1], s.stayingIntervals) ]; var hasNewExtent = s.newExtent[1] > s.newExtent[0]; s.extent = s.stayingIntervals.concat(hasNewExtent ? [s.newExtent] : []); @@ -507,8 +499,8 @@ function cleanRanges(ranges, dimension) { var sortedTickVals = dimension.tickvals.slice().sort(sortAsc); ranges = ranges.map(function(ri) { var rSnapped = [ - ordinalScaleSnapLo(sortedTickVals, ri[0], []), - ordinalScaleSnapHi(sortedTickVals, ri[1], []) + ordinalScaleSnap(0, sortedTickVals, ri[0], []), + ordinalScaleSnap(1, sortedTickVals, ri[1], []) ]; if(rSnapped[1] > rSnapped[0]) return rSnapped; }) diff --git a/test/image/baselines/gl2d_parcoords_select_first_last_enum.png b/test/image/baselines/gl2d_parcoords_select_first_last_enum.png new file mode 100644 index 0000000000000000000000000000000000000000..b0cf3961415a2a6b20458e978cf212d8f36629ad GIT binary patch literal 17100 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/gl2d_parcoords_select_first_last_enum.json b/test/image/mocks/gl2d_parcoords_select_first_last_enum.json new file mode 100644 index 00000000000..f48818b86f0 --- /dev/null +++ b/test/image/mocks/gl2d_parcoords_select_first_last_enum.json @@ -0,0 +1,85 @@ +{ + "data": [ + { + "type": "parcoords", + "line": { + "colorscale": "Portland", + "showscale": true, + "reversescale": true, + "color": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ] + }, + "dimensions": [ + { + "label": "A", + "values": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "tickvals": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "constraintrange": [ + [ + 1, + 1 + ], + [ + 3, + 3 + ], + [ + 5, + 6 + ], + [ + 8, + 8 + ] + ] + }, + { + "label": "B", + "values": [ + 1, + 2, + 3, + 5, + 8, + 13, + 22, + 35 + ] + } + ] + } + ], + "layout": { + "width": 400, + "height": 400, + "title": { + "text": "should select first and last enum" + } + } +}