UNPKG

4.39 kBJavaScriptView Raw
1/**
2 * Create gl-scatter2d-fancy test-case
3 */
4
5var fit = require('canvas-fit')
6var mouseWheel = require('mouse-wheel')
7var mouseChange = require('mouse-change')
8// var createScatter = require('../../plotly.js/node_modules/gl-scatter2d-fancy')
9var createScatter = require('../')
10var createSelectBox = require('gl-select-box')
11var createSpikes = require('gl-spikes2d')
12var createPlot = require('gl-plot2d')
13var createFps = require('fps-indicator')
14
15
16module.exports = setup;
17
18
19function setup (options) {
20 createFps()
21
22 var canvas = document.createElement('canvas')
23 document.body.appendChild(canvas)
24 window.addEventListener('resize', fit(canvas, null, +window.devicePixelRatio), false)
25
26 var gl = canvas.getContext('webgl', {
27 depth: false,
28 // alpha: true,
29 // premultipliedAlpha: true
30 })
31
32 var aspect = gl.drawingBufferWidth / gl.drawingBufferHeight
33 var dataBox = [-10,-10/aspect,10,10/aspect]
34
35 function makeTicks(lo, hi) {
36 var result = []
37 for(var i=lo; i<=hi; ++i) {
38 result.push({
39 x: i,
40 text: i + ''
41 })
42 }
43 return result
44 }
45
46 var plot = createPlot({
47 gl: gl,
48 dataBox: dataBox,
49 title: 'gl-scatter2d-fancy',
50 ticks: [ makeTicks(-20,20), makeTicks(-20,20) ],
51 labels: ['x', 'y'],
52 pixelRatio: 1,
53 tickMarkWidth: [1,1,1,1],
54 tickMarkLength: [3,3,3,3]
55 })
56
57
58
59 var selectBox = createSelectBox(plot, {
60 innerFill: false,
61 outerFill: true
62 })
63 selectBox.enabled = false
64
65 var spikes = createSpikes(plot)
66
67 var scatter = createScatter(plot, options)
68
69
70 var lastX = 0, lastY = 0
71 var boxStart = [0,0]
72 var boxEnd = [0,0]
73 var boxEnabled = false
74 mouseChange(function(buttons, x, y, mods) {
75 y = window.innerHeight - y
76 x *= plot.pixelRatio
77 y *= plot.pixelRatio
78
79 if(buttons & 1) {
80 if(mods.shift) {
81 var dataX = (x - plot.viewBox[0]) / (plot.viewBox[2]-plot.viewBox[0]) * (dataBox[2] - dataBox[0]) + dataBox[0]
82 var dataY = (y - plot.viewBox[1]) / (plot.viewBox[3]-plot.viewBox[1]) * (dataBox[3] - dataBox[1]) + dataBox[1]
83 if(!boxEnabled) {
84 boxStart[0] = dataX
85 boxStart[1] = dataY
86 }
87 boxEnd[0] = dataX
88 boxEnd[1] = dataY
89 boxEnabled = true
90 spikes.update()
91 } else {
92 var dx = (lastX - x) * (dataBox[2] - dataBox[0]) / (plot.viewBox[2]-plot.viewBox[0])
93 var dy = (lastY - y) * (dataBox[3] - dataBox[1]) / (plot.viewBox[3] - plot.viewBox[1])
94
95 dataBox[0] += dx
96 dataBox[1] += dy
97 dataBox[2] += dx
98 dataBox[3] += dy
99
100 plot.setDataBox(dataBox)
101 spikes.update()
102 }
103 } else {
104 var result = plot.pick(x/plot.pixelRatio, y/plot.pixelRatio)
105 if(result) {
106 spikes.update({center: result.dataCoord})
107 } else {
108 spikes.update()
109 }
110 }
111
112 if(boxEnabled) {
113 selectBox.enabled = true
114 selectBox.selectBox = [
115 Math.min(boxStart[0], boxEnd[0]),
116 Math.min(boxStart[1], boxEnd[1]),
117 Math.max(boxStart[0], boxEnd[0]),
118 Math.max(boxStart[1], boxEnd[1])
119 ]
120 plot.setDirty()
121 if(!((buttons&1) && mods.shift)) {
122 selectBox.enabled = false
123 dataBox = [
124 Math.min(boxStart[0], boxEnd[0]),
125 Math.min(boxStart[1], boxEnd[1]),
126 Math.max(boxStart[0], boxEnd[0]),
127 Math.max(boxStart[1], boxEnd[1])
128 ]
129 plot.setDataBox(dataBox)
130 boxEnabled = false
131 }
132 }
133
134 lastX = x
135 lastY = y
136 })
137
138 mouseWheel(function(dx, dy, dz) {
139 var scale = Math.exp(0.1 * dy / gl.drawingBufferHeight)
140
141 var cx = (lastX - plot.viewBox[0]) / (plot.viewBox[2] - plot.viewBox[0]) * (dataBox[2] - dataBox[0]) + dataBox[0]
142 var cy = (plot.viewBox[1] - lastY) / (plot.viewBox[3] - plot.viewBox[1]) * (dataBox[3] - dataBox[1]) + dataBox[3]
143
144 dataBox[0] = (dataBox[0] - cx) * scale + cx
145 dataBox[1] = (dataBox[1] - cy) * scale + cy
146 dataBox[2] = (dataBox[2] - cx) * scale + cx
147 dataBox[3] = (dataBox[3] - cy) * scale + cy
148
149 plot.setDataBox(dataBox)
150
151 return true
152 })
153
154 function render() {
155 requestAnimationFrame(render)
156 plot.draw()
157 }
158
159 render()
160
161 return scatter
162}