Trails
click to explode
//some old processing code ported to p5js
//click to explode
let numAgents= 50;
let agents= [];
let rotX= 0, rotY= 0, rotZ= 0, rx, ry, rz;
let tx, ty, tz;
let sx, sy, sz, sxDrift, syDrift, szDrift;
function setup() {
let div= select('#sketch');
let cnv= createCanvas(div.width, div.height, WEBGL);
cnv.parent('sketch');
frameRate(30);
mouseClicked();
}
function draw() {
translate(tx, ty, tz);
sx= sx+sxDrift;
sy= sy+syDrift;
sz= sz+szDrift;
scale(sx, sy, sz);
rotX= rotX+radians(rx); rotateX(rotX);
rotY= rotY+radians(ry); rotateY(rotY);
rotZ= rotZ+radians(rz); rotateZ(rotZ);
for(let i= 0; i<numAgents; i++) {
agents[i].move();
agents[i].draw();
}
}
function mouseClicked() {
background(150, 150, 120);
initAgents();
newTrans();
newScale();
newRotation();
}
function initAgents() {
let world= new AWorld(3, 400, 400, 400, 0.95);
for(let i= 0; i<numAgents; i++) {
let loc= new ALocation(world, random(-0.1, 0.1), random(-0.1, 0.1), random(-0.1, 0.1));
let dir= new ADirection(random(-0.05, 0.05), random(-0.05, 0.05), random(-0.05, 0.05));
agents[i]= new Agent3D(loc, dir, random(1.0), color(255, 0, 0), color(0), 5);
//agents[i]= new Agent2D(loc, dir, random(1.0), color(255, 0, 0), color(0), 5);
//agents[i]= new Agent1D(loc, dir, random(1.0), color(255, 0, 0), color(0), 5);
}
}
function newTrans() {
tx= int(random(-width/3, width/3));
ty= int(random(-height/3, height/3));
tz= 0;
}
function newScale() {
if(random(0, 10)>7) {
sx= random(0.6, 1.2);
sy= random(0.6, 1.2);
sz= random(0.1, 2);
if(random(0, 10)>8) {sxDrift= random(-0.1, 0.1);} else {sxDrift= 0;}
if(random(0, 10)>8) {syDrift= random(-0.1, 0.1);} else {syDrift= 0;}
if(random(0, 10)>8) {szDrift= random(-0.1, 0.1);} else {szDrift= 0;}
} else {
sxDrift= 0;
syDrift= 0;
szDrift= 0;
if(random(0, 10)>5) {
sx= random(0.3, 0.7);
sy= random(0.2, 0.6);
sz= random(0.01, 0.25);
} else {
sx= 1;
sy= 1;
sz= 1;
}
}
}
function newRotation() {
rx= ry= rz= 0;
rotX= rotY= rotZ= 0;
if(random(0, 10)>7) {
ry= random(-4, 4);
}
if(random(0, 10)>7) {
rz= random(-4, 4);
}
if(random(0, 10)>4) {
rx= random(-4, 4);
}
if(rx+ry+rz==0) { //make sure always some rotation
rx= random(0.5, 3);
}
}
// redFri - version 060225
class ALocation {
constructor(_world, _x, _y, _z) {
this.world= _world;
this.x= _x;
this.y= _y;
this.z= _z;
}
distance(other) {
return abs(sqrt(pow(other.x-this.x, 2)+pow(other.y-this.y, 2)+pow(other.z-this.z, 2)));
}
add(dir) {
this.x= this.x+dir.vx;
this.y= this.y+dir.vy;
this.z= this.z+dir.vz;
}
}
class ADirection {
constructor(_vx, _vy, _vz) {
this.vx= _vx;
this.vy= _vy;
this.vz= _vz;
}
mul(_const) {
this.vx= this.vx*_const;
this.vy= this.vy*_const;
this.vz= this.vz*_const;
}
}
class AWorld {
constructor(_dim, _w, _h, _d, _damp) {
this.dim= _dim;
this.w= _w;
this.h= _h;
this.d= _d;
this.damp= _damp;
}
}
//--
class Agent { //abstract
constructor(_loc, _dir, _energy, _col, _borderCol, _agentSize) {
if(this.constructor==Agent) {
throw new Error("Abstract classes can't be instantiated.");
}
this.loc= _loc;
this.dir= _dir;
this.energy= _energy;
this.col= _col;
this.borderCol= _borderCol;
this.agentSize= _agentSize;
}
draw() {
stroke(this.borderCol);
fill(this.col);
this.drawShape();
}
drawShape() {} //to override
move() {
this.loc.add(this.dir);
this.dir.mul(this.loc.world.damp);
}
}
//--
class Agent1D extends Agent {
drawShape() {
point(this.loc.x*width, this.height/2); //agentSize???
}
}
class Agent2D extends Agent {
drawShape() {
rect(this.loc.x*width, this.loc.y*height, this.agentSize, this.agentSize);
}
}
class Agent3D extends Agent {
drawShape() {
push();
translate(this.loc.x*width, this.loc.y*height, this.loc.z*100);
box(this.agentSize);
pop();
}
}