Skip to content

Instantly share code, notes, and snippets.

@gonzamoiguer
Created November 22, 2018 04:16
Show Gist options
  • Save gonzamoiguer/bf97d8f50148d8e26207c7b7b09c0c72 to your computer and use it in GitHub Desktop.
Save gonzamoiguer/bf97d8f50148d8e26207c7b7b09c0c72 to your computer and use it in GitHub Desktop.
// Based on Shiffman's Reaction Diffusion Tut: https://youtu.be/Cl_Gjj80gPE
//
// Changed to simulate once, on startup
// Then draw the lines of the resulting chains
// Will need to update vector to Victor.js in order to use with plotter
var tree = [];
var walkers = [];
var maxWalkers = 40;
var iterations = 1000;
var radius = 8;
var hu = 0;
var shrink = 0.995;
var stuckCount = 0;
var drawingComplete = false;
function setup() {
createCanvas(400, 400);
tree[0] = new Walker(width / 2, height / 2);
tree[0].isRoot = true;
radius *= shrink;
for (var i = 0; i < maxWalkers; i++) {
walkers[i] = new Walker();
radius *= shrink;
}
while(!drawingComplete){
for (var n = 0; n < iterations; n++) {
for (var i = walkers.length - 1; i >= 0; i--) {
walkers[i].walk();
if (walkers[i].checkStuck(tree)) {
stuckCount++;
if(stuckCount == 414){
// por que 414 ??
drawingComplete = true;
}
walkers[i].setHue(hu % 360);
hu += 2;
tree.push(walkers[i]);
walkers.splice(i, 1);
}
}
}
//var r = walkers[walkers.length - 1].r;
while (walkers.length < maxWalkers && radius > 1) {
radius *= shrink;
walkers.push(new Walker());
}
} // while !drawingComplete
noFill();
stroke(0);
for(let i=0; i < tree.length; i++){
DrawBranch(tree[i]);
}
}
function DrawBranch(seed){
if(!seed.linkedTo) return;
line(seed.pos.x, seed.pos.y, seed.linkedTo.pos.x, seed.linkedTo.pos.y);
DrawBranch(seed.linkedTo);
}
// Walker Object
function Walker(x, y) {
this.isRoot = false;
this.linkedTo = false;
if (arguments.length == 2) {
this.pos = createVector(x, y);
this.stuck = true;
} else {
this.pos = randomPoint();
this.stuck = false;
}
this.r = radius;
this.walk = function() {
var vel = p5.Vector.random2D();
// var vel = createVector(random(-1, 1), random(-0.5, 1));
this.pos.add(vel);
this.pos.x = constrain(this.pos.x, 0, width);
this.pos.y = constrain(this.pos.y, 0, height);
}
this.checkStuck = function(others) {
for (var i = 0; i < others.length; i++) {
var d = distSq(this.pos, others[i].pos);
if (d < (this.r * this.r + others[i].r * others[i].r + 2 * others[i].r * this.r)) {
//if (random(1) < 0.1) {
this.linkedTo = others[i];
this.stuck = true;
return true;
break;
//}
}
}
return false;
}
}
function randomPoint() {
var i = floor(random(4));
if (i === 0) {
var x = random(width);
return createVector(x, 0);
} else if (i === 1) {
var x = random(width);
return createVector(x, height);
} else if (i === 2) {
var y = random(height);
return createVector(0, y);
} else {
var y = random(height);
return createVector(width, y);
}
}
function distSq(a, b) {
var dx = b.x - a.x;
var dy = b.y - a.y;
return dx * dx + dy * dy;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment