Skip to content

Commit 2873abb

Browse files
committed
[for bug report] add Rossler attractor example
1 parent 8d0c829 commit 2873abb

File tree

2 files changed

+3856
-0
lines changed

2 files changed

+3856
-0
lines changed

example/cone_rossler.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
var createCamera = require('3d-view-controls')
2+
var getBounds = require('bound-points')
3+
var perspective = require('gl-mat4/perspective')
4+
var createAxes = require('gl-axes3d')
5+
var createSpikes = require('gl-spikes3d')
6+
var createSelect = require('gl-select-static')
7+
var getBounds = require('bound-points')
8+
var mouseChange = require('mouse-change')
9+
var createConePlot = require('../cone')
10+
var createMesh = createConePlot.createConeMesh;
11+
var data = require('./dataset-rossler');
12+
13+
var bounds = []
14+
15+
var conePlot = createConePlot({
16+
positions: data.positions,
17+
vectors: data.vectors,
18+
// uncomment to see visible cones
19+
//coneSize: 40,
20+
colormap: 'portland'
21+
}, bounds)
22+
23+
var canvas = document.createElement('canvas')
24+
document.body.appendChild(canvas)
25+
window.addEventListener('resize', require('canvas-fit')(canvas))
26+
var gl = canvas.getContext('webgl')
27+
28+
var camera = createCamera(canvas, {
29+
eye: [3,3,3],
30+
center: [0,0,0],
31+
zoomMax: 500,
32+
mode: 'turntable'
33+
})
34+
35+
36+
var mesh = createMesh(gl, conePlot)
37+
38+
var select = createSelect(gl, [canvas.width, canvas.height])
39+
var tickSpacing = 1;
40+
var ticks = bounds[0].map(function(v,i) {
41+
var arr = [];
42+
var firstTick = 0; //Math.ceil(bounds[0][i] / tickSpacing) * tickSpacing;
43+
var lastTick = 3; //Math.floor(bounds[1][i] / tickSpacing) * tickSpacing;
44+
for (var tick = firstTick; tick <= lastTick; tick += tickSpacing) {
45+
if (tick === -0) tick = 0;
46+
arr.push({x: tick, text: tick.toString()});
47+
}
48+
return arr;
49+
});
50+
var axes = createAxes(gl, { bounds: bounds, ticks: ticks })
51+
var spikes = createSpikes(gl, {
52+
bounds: bounds
53+
})
54+
var spikeChanged = false
55+
56+
mouseChange(canvas, function(buttons, x, y) {
57+
var pickData = select.query(x, canvas.height - y, 10)
58+
var pickResult = mesh.pick(pickData)
59+
if(pickResult) {
60+
spikes.update({
61+
position: pickResult.position,
62+
enabled: [true, true, true]
63+
})
64+
spikeChanged = true
65+
} else {
66+
spikeChanged = spikes.enabled[0]
67+
spikes.update({
68+
enabled: [false, false, false]
69+
})
70+
}
71+
})
72+
73+
function render() {
74+
requestAnimationFrame(render)
75+
76+
gl.enable(gl.DEPTH_TEST)
77+
78+
var needsUpdate = camera.tick()
79+
var cameraParams = {
80+
projection: perspective([], Math.PI/4, canvas.width/canvas.height, 0.1, 300),
81+
view: camera.matrix
82+
}
83+
84+
if(needsUpdate || spikeChanged) {
85+
gl.bindFramebuffer(gl.FRAMEBUFFER, null)
86+
gl.viewport(0, 0, canvas.width, canvas.height)
87+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
88+
axes.draw(cameraParams)
89+
spikes.draw(cameraParams)
90+
mesh.draw(cameraParams)
91+
spikeChanged = false
92+
}
93+
94+
if(needsUpdate) {
95+
select.shape = [canvas.width, canvas.height]
96+
select.begin()
97+
mesh.drawPick(cameraParams)
98+
select.end()
99+
}
100+
}
101+
render()

0 commit comments

Comments
 (0)