Skip to content

Commit d867c55

Browse files
committed
Introduce point-cluster
1 parent d67b8ab commit d867c55

File tree

2 files changed

+43
-32
lines changed

2 files changed

+43
-32
lines changed

src/traces/scattergl/index.js

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var createRegl = require('regl');
1212
var createScatter = require('regl-scatter2d');
1313
var createLine = require('regl-line2d');
1414
var createError = require('regl-error2d');
15-
var kdtree = require('kdgrass');
15+
var cluster = require('point-cluster');
1616
var rgba = require('color-normalize');
1717
var svgSdf = require('svg-path-sdf');
1818
var arrayRange = require('array-range');
@@ -42,6 +42,7 @@ var SYMBOL_SVG_CIRCLE = Drawing.symbolFuncs[0](SYMBOL_SIZE * 0.05);
4242
var TOO_MANY_POINTS = 1e5;
4343
var DOT_RE = /-dot/;
4444
var OPEN_RE = /-open/;
45+
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
4546

4647
function calc(gd, trace) {
4748
var fullLayout = gd._fullLayout;
@@ -81,14 +82,15 @@ function calc(gd, trace) {
8182
// and it is also
8283
if(xa.type !== 'log' && ya.type !== 'log') {
8384
// FIXME: delegate this to webworker
84-
stash.tree = kdtree(positions, 512);
85+
stash.tree = cluster(positions);
8586
} else {
8687
var ids = stash.ids = new Array(count);
8788
for(i = 0; i < count; i++) {
8889
ids[i] = i;
8990
}
9091
}
9192

93+
9294
// create scene options and scene
9395
calcColorscales(trace);
9496
var options = sceneOptions(gd, subplot, trace, positions);
@@ -114,6 +116,13 @@ function calc(gd, trace) {
114116
if(options.line && !scene.line2d) scene.line2d = true;
115117
if((options.errorX || options.errorY) && !scene.error2d) scene.error2d = true;
116118

119+
// FIXME: organize it in a more appropriate manner, probably in sceneOptions
120+
// put point-cluster instance for optimized regl calc
121+
if (options.marker) {
122+
options.marker.cluster = stash.tree;
123+
}
124+
125+
117126
// save scene options batch
118127
scene.lineOptions.push(options.line);
119128
scene.errorXOptions.push(options.errorX);
@@ -176,6 +185,33 @@ function sceneOptions(gd, subplot, trace, positions) {
176185
}
177186
}
178187

188+
function makeErrorOptions(axLetter, errorOpts, vals) {
189+
var options = {};
190+
options.positions = positions;
191+
192+
var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']);
193+
var errors = options.errors = new Float64Array(4 * count);
194+
var pOffset = {x: 0, y: 1}[axLetter];
195+
var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter];
196+
197+
for(var i = 0, p = 0; i < count; i++, p += 4) {
198+
errors[p + eOffset[0]] = positions[i * 2 + pOffset] - ax.d2l(vals[i][axLetter + 's']) || 0;
199+
errors[p + eOffset[1]] = ax.d2l(vals[i][axLetter + 'h']) - positions[i * 2 + pOffset] || 0;
200+
errors[p + eOffset[2]] = 0;
201+
errors[p + eOffset[3]] = 0;
202+
}
203+
204+
if(errorOpts.copy_ystyle) {
205+
errorOpts = trace.error_y;
206+
}
207+
208+
options.capSize = errorOpts.width * 2;
209+
options.lineWidth = errorOpts.thickness;
210+
options.color = errorOpts.color;
211+
212+
return options;
213+
}
214+
179215
if(hasLines) {
180216
lineOptions = {};
181217
lineOptions.thickness = trace.line.width;
@@ -271,34 +307,9 @@ function sceneOptions(gd, subplot, trace, positions) {
271307
markerOptions = makeMarkerOptions(markerOpts);
272308
selectedOptions = makeSelectedOptions(trace.selected, markerOpts);
273309
unselectedOptions = makeSelectedOptions(trace.unselected, markerOpts);
274-
markerOptions.positions = positions;
275-
}
276-
277-
function makeErrorOptions(axLetter, errorOpts, vals) {
278-
var options = {};
279-
options.positions = positions;
280-
281-
var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']);
282-
var errors = options.errors = new Float64Array(4 * count);
283-
var pOffset = {x: 0, y: 1}[axLetter];
284-
var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter];
285-
286-
for(var i = 0, p = 0; i < count; i++, p += 4) {
287-
errors[p + eOffset[0]] = positions[i * 2 + pOffset] - ax.d2l(vals[i][axLetter + 's']) || 0;
288-
errors[p + eOffset[1]] = ax.d2l(vals[i][axLetter + 'h']) - positions[i * 2 + pOffset] || 0;
289-
errors[p + eOffset[2]] = 0;
290-
errors[p + eOffset[3]] = 0;
291-
}
292-
293-
if(errorOpts.copy_ystyle) {
294-
errorOpts = trace.error_y;
295-
}
310+
if (!trace.unselected) unselectedOptions.opacity = DESELECTDIM;
296311

297-
options.capSize = errorOpts.width * 2;
298-
options.lineWidth = errorOpts.thickness;
299-
options.color = errorOpts.color;
300-
301-
return options;
312+
markerOptions.positions = positions;
302313
}
303314

304315
function makeSelectedOptions(selected, markerOpts) {
@@ -882,8 +893,8 @@ function plot(gd, subplot, cdata) {
882893
if(selectMode) {
883894
// create select2d
884895
if(!scene.select2d) {
885-
// create scatter instance by cloning scatter2d
886-
scene.select2d = createScatter(fullLayout._glcanvas.data()[1].regl, {clone: scene.scatter2d});
896+
// create select scatter instance by cloning scatter2d
897+
scene.select2d = createScatter(fullLayout._glcanvas.data()[1].regl);
887898
}
888899

889900
if(scene.scatter2d && scene.selectBatch && scene.selectBatch.length) {
@@ -1126,7 +1137,6 @@ function selectPoints(searchInfo, polygon) {
11261137
scene.selectBatch = [];
11271138
scene.unselectBatch = [];
11281139
}
1129-
11301140
if(!scene.selectBatch[stash.index]) {
11311141
// enter every trace select mode
11321142
for(i = 0; i < scene.count; i++) {

src/traces/scatterpolargl/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ function plot(container, subplot, cdata) {
9898
}
9999
}
100100

101+
101102
var options = ScatterGl.sceneOptions(container, subplot, trace, positions);
102103

103104
// set flags to create scene renderers

0 commit comments

Comments
 (0)