Published
Edited
Sep 28, 2020
2 forks
16 stars
Insert cell
Insert cell
draw = {
let agents = init2();
function update() {
agents = gUpdate2(agents);
// agents = gTest(agents);
gShow(agents);
return gShow.getCanvas();
}
// return update();
while (true) {yield Promises.delay(1, update());}
}
Insert cell
init2 = gpu.createKernel(function(){
let x = this.thread.x;
let y = this.thread.y;
let r = [1,0];
if (Math.random() < 0.03) {
// if (x < 330 && x > 310 && y < 330 && y > 310) {
r = [1,1];
}
return r;
}).setPipeline(true).setOutput([640, 640]);
Insert cell
gUpdate2 = gpu.createKernel(function(agents){
let dA = 1;
let dB = 0.5;
//KSims default
// let feed = 0.055;
// let kill = 0.062;
//Pmneila default
// let feed = 0.037;
// let kill = 0.06;
// Solitons
// let feed = 0.03;
// let kill = 0.062;
//Pulsing solitons X
// let feed = .025;
// let kill = .006;
//Worms (slow)
// let feed = 0.078;
// let kill = 0.061;
//Mazes
let feed = 0.029;
let kill = 0.057;
//Holes
// let feed = 0.039;
// let kill = 0.058;
//Waves
// let feed = 0.014;
// let kill = 0.045;
let lapA = 0;
let lapB = 0;
for (let i = -1; i <= 1; i++) {
let p = (this.thread.y + i + 640) % 640;
for (let j = -1; j <= 1; j++) {
let q = (this.thread.x + j + 640) % 640;
let vpq = agents[p][q];
let lapInc = 0;
if (Math.abs(i) > 0) lapInc++;
if (Math.abs(j) > 0) lapInc++;
let lap = -1;
if (lapInc == 1) lap = 0.2;
if (lapInc == 2) lap = 0.05;
lapA += vpq[0] * lap;
lapB += vpq[1] * lap;
}
}
let v = agents[this.thread.y][this.thread.x];
let a = v[0];
let b = v[1];
// let nA = a + (dA * lapA) - (a * b * b) + feed * (1-a);
// let nB = b + (dB * lapB) + (a * b * b) - (kill + feed) * b;
let mut = 0.02;
let nA = a + (dA * lapA) - (a * b * b) + feed * (1-a) + (Math.random() * mut * 2) - mut;
let nB = b + (dB * lapB) + (a * b * b) - (kill + feed) * b + (Math.random() * mut * 2) - mut;
// nA = Math.max(Math.min(nA, 1),0);
// nB = Math.max(Math.min(nB, 1),0);
if (nA < 0) nA = 0;
if (nA > 1) nA = 1;
if (nB < 0) nB = 0;
if (nB > 1) nB = 1;
return [nA, nB];
}).setPipeline(true).setImmutable(true).setOutput([640, 640]);

Insert cell
gShow = gpu.createKernel(function(agents){
let v = agents[this.thread.y][this.thread.x];
let g = (v[0] - v[1]) * Math.PI * 2;
this.color(
(1 + Math.cos(g))/2,
(1 + Math.cos((Math.PI * 2 / 3) + g))/2,
(1 + Math.cos((Math.PI * 4 / 3) + g))/2,
1
);
}).setOutput([640, 640]).setGraphical(true);
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more