Skip to content

Commit 6ebffbd

Browse files
authored
Merge pull request #3696 from plotly/line-decimation-fill-fix
Always include the very first and last points for fills
2 parents 189ad5d + 9e8c3e9 commit 6ebffbd

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

src/traces/scatter/line_points.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ module.exports = function linePoints(d, opts) {
3131
var baseTolerance = opts.baseTolerance;
3232
var shape = opts.shape;
3333
var linear = shape === 'linear';
34+
var fill = opts.fill && opts.fill !== 'none';
3435
var segments = [];
3536
var minTolerance = constants.minTolerance;
36-
var pts = new Array(d.length);
37+
var len = d.length;
38+
var pts = new Array(len);
3739
var pti = 0;
3840

3941
var i;
@@ -160,8 +162,10 @@ module.exports = function linePoints(d, opts) {
160162
var ptCount = 0;
161163
for(var i = 0; i < 4; i++) {
162164
var edge = edges[i];
163-
var ptInt = segmentsIntersect(pt1[0], pt1[1], pt2[0], pt2[1],
164-
edge[0], edge[1], edge[2], edge[3]);
165+
var ptInt = segmentsIntersect(
166+
pt1[0], pt1[1], pt2[0], pt2[1],
167+
edge[0], edge[1], edge[2], edge[3]
168+
);
165169
if(ptInt && (!ptCount ||
166170
Math.abs(ptInt.x - out[0][0]) > 1 ||
167171
Math.abs(ptInt.y - out[0][1]) > 1
@@ -359,7 +363,7 @@ module.exports = function linePoints(d, opts) {
359363
}
360364

361365
// loop over ALL points in this trace
362-
for(i = 0; i < d.length; i++) {
366+
for(i = 0; i < len; i++) {
363367
clusterStartPt = getPt(i);
364368
if(!clusterStartPt) continue;
365369

@@ -368,7 +372,7 @@ module.exports = function linePoints(d, opts) {
368372
addPt(clusterStartPt);
369373

370374
// loop over one segment of the trace
371-
for(i++; i < d.length; i++) {
375+
for(i++; i < len; i++) {
372376
clusterHighPt = getPt(i);
373377
if(!clusterHighPt) {
374378
if(connectGaps) continue;
@@ -387,7 +391,9 @@ module.exports = function linePoints(d, opts) {
387391

388392
clusterRefDist = ptDist(clusterHighPt, clusterStartPt);
389393

390-
if(clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue;
394+
// #3147 - always include the very first and last points for fills
395+
if(!(fill && (pti === 0 || pti === len - 1)) &&
396+
clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue;
391397

392398
clusterUnitVector = [
393399
(clusterHighPt[0] - clusterStartPt[0]) / clusterRefDist,

src/traces/scatter/plot.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
224224
connectGaps: trace.connectgaps,
225225
baseTolerance: Math.max(line.width || 1, 3) / 4,
226226
shape: line.shape,
227-
simplify: line.simplify
227+
simplify: line.simplify,
228+
fill: trace.fill
228229
});
229230

230231
// since we already have the pixel segments here, use them to make
18.5 KB
Loading

test/image/mocks/ultra_zoom_fill.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"data": [
3+
{
4+
"name": 10000,
5+
"fill": "toself",
6+
"x": [ 1, 10, 10, 1 ],
7+
"y": [ 10000, 10000, -10000, -10000 ]
8+
},
9+
{
10+
"fill": "toself",
11+
"name": 100,
12+
"x": [ 1, 10, 10, 1 ],
13+
"y": [ 100, 100, -100, -100 ]
14+
}
15+
],
16+
"layout": {
17+
"yaxis": {
18+
"range": [ -0.5, 0.5 ]
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)