{
var colourBase = 500;
var invertColour = false;
var nodeThreshold = 0.04;
function increaseHue () {
if (colourBase < 360) { colourBase += 2}
else {colourBase = 0}
}
function decreaseHue () {
if (colourBase > 0) {colourBase -=2}
else {colourBase = 360}
}
function invertHue() {
invertColour = !invertColour;
}
function range(n) {
return Array.from((Array(n)).keys()) ;
}
function hslColorChooser(level) {
var l = Math.floor(level * 100);
if (invertColour) {
l = Math.floor(100 - l);
}
return "hsl("+ colourBase + ", 50%, " + l +"%)";
};
const size = 400;
let sandcount = 15000;
let dotSize = 3;
let sand = [];
let wavepool = new WavePool();
var waveController = new WaveController(wavepool);
waveController.newWave();
waveController.newWave();
waveController.newWave();
wavepool.waves[0].fn += 1;
wavepool.waves[1].open().fn+=3;
wavepool.waves[2].close().fn += 5;
const svg = d3.create('svg')
.attr('width', size)
.attr('height', size);
for (var i = 0; i < sandcount; i ++){
let p = new RandomPoint(size);
sand.push(p);
}
svg.selectAll("circle")
.data(sand)
.enter().append("circle")
.attr("cx", function(s) {
return s.x;})
.attr("cy", function(s) {
return s.y;})
.attr("r", function(s) { return dotSize; })
.attr("class","dot")
.style("fill", function(s){
let value = wavepool.value(s);
return hslColorChooser(value);
});
await Promises.delay(100)
yield svg.node();
while(true){
let remaining = 0;
svg.selectAll("circle").filter(function(s){
let value = wavepool.value(s);
if (value > nodeThreshold){
s.perturb();
remaining ++;
}
});
svg.selectAll("circle").transition()
.duration(600)
.attr('cx', function(s){return s.x;})
.attr('cy',function(s){return s.y;});
await Promises.delay(100)
yield svg.node();
if (remaining == 0) break;
}
}