Trails
// redFrik
//click to explode
int maxNumAgents= 50;
int numAgents= 50;
Agent[] agents= new Agent[maxNumAgents];
float rotX= 0, rotY= 0, rotZ= 0, rx, ry, rz;
int tx, ty, tz;
float sx, sy, sz, sxDrift, syDrift, szDrift;
void setup() {
size(640, 480, P3D);
frameRate(30);
smooth(4);
background(150, 150, 120);
initAgents();
newTrans();
newScale();
newRotation();
}
void draw() {
translate(width/2+tx, height/2+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 (int i= 0; i<numAgents; i++) {
agents[i].move();
agents[i].draw();
}
}
void mousePressed() {
background(150, 150, 120);
initAgents();
newTrans();
newScale();
newRotation();
}
void initAgents() {
AWorld world= new AWorld(3, 400, 400, 400, 0.95);
for (int i= 0; i<numAgents; i++) {
ALocation loc= new ALocation(world, random(-0.1, 0.1), random(-0.1, 0.1), random(-0.1, 0.1));
ADirection 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);
}
}
void newTrans() {
tx= int(random(-width/3, width/3));
ty= int(random(-height/3, height/3));
tz= 0;
}
void 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;
}
}
}
void 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 {
AWorld world;
float x, y, z;
public ALocation(AWorld _world, float _x, float _y, float _z) {
world= _world;
x= _x;
y= _y;
z= _z;
}
float distance(ALocation other) {
return abs(sqrt(pow(other.x-x, 2)+pow(other.y-y, 2)+pow(other.z-z, 2)));
}
void add(ADirection dir) {
x= x+dir.vx;
y= y+dir.vy;
z= z+dir.vz;
}
}
class ADirection {
float vx, vy, vz;
public ADirection(float _vx, float _vy, float _vz) {
vx= _vx;
vy= _vy;
vz= _vz;
}
void mul(float val) {
vx= vx*val;
vy= vy*val;
vz= vz*val;
}
}
class AWorld {
Agent[] agents;
int dim, w, h, d;
float damp;
public AWorld(int _dim, int _w, int _h, int _d, float _damp) {
dim= _dim;
w= _w;
h= _h;
d= _d;
damp= _damp;
}
}
//--
abstract class Agent {
ALocation loc;
ADirection dir;
float energy;
color col, borderCol;
int agentSize;
public Agent(ALocation _loc, ADirection _dir, float _energy, color _col, color _borderCol, int _agentSize) {
loc= _loc;
dir= _dir;
energy= _energy;
col= _col;
borderCol= _borderCol;
agentSize= _agentSize;
}
void draw() {
stroke(borderCol);
fill(col);
drawShape();
}
void drawShape() {
} //to override
void move() {
loc.add(dir);
dir.mul(loc.world.damp);
}
}
//--
class Agent1D extends Agent {
public Agent1D(ALocation _loc, ADirection _dir, float _energy, color _col, color _borderCol, int _agentSize) {
super(_loc, _dir, _energy, _col, _borderCol, _agentSize);
}
void drawShape() {
point(loc.x*width, height/2); //agentSize???
}
}
class Agent2D extends Agent {
public Agent2D(ALocation _loc, ADirection _dir, float _energy, color _col, color _borderCol, int _agentSize) {
super(_loc, _dir, _energy, _col, _borderCol, _agentSize);
}
void drawShape() {
rect(loc.x*width, loc.y*height, agentSize, agentSize);
}
}
class Agent3D extends Agent {
public Agent3D(ALocation _loc, ADirection _dir, float _energy, color _col, color _borderCol, int _agentSize) {
super(_loc, _dir, _energy, _col, _borderCol, _agentSize);
}
void drawShape() {
pushMatrix();
translate(loc.x*width, loc.y*height, loc.z*100);
box(agentSize, agentSize, agentSize);
popMatrix();
}
}