xxxxxxxxxx
223
let particles = [];
let wallDistance = 10;
let buddyView = 50;
let popSize = 300;
let maxColor;
let minColor;
let points;
let font;
function preload(){
font = loadFont("Helvetica.ttf");
}
function setup() {
createCanvas(400, 400);
for(let i = 0; i < popSize; i++){
particles.push(new Particle(random(width),random(height)));
}
maxColor = createVector(25,116,210);
minColor = createVector(0,0,80);
textFont(font);
textSize(100);
points = font.textToPoints("Liddy",100,200);
}
function draw() {
background(220);
stroke(0);
text("Liddy",100,200);
for(let p of particles){
p.findBuddies(particles);
p.separate(points);
p.separate(particles);
p.boundaries();
p.update();
p.display();
}
}
class Particle {
constructor(x, y) {
this.acceleration = createVector(random(-0.1,0.1), random(-0.1,0.1));
this.velocity = createVector(0, 0);
this.position = createVector(x, y);
this.r = 6;
this.maxspeed = 0.1;
this.maxforce = 0.01;
this.buddies = [];
this.color = createVector(0,0,0);
this.sepRange = 50;//random(40,60);
}
update() {
this.velocity.add(this.acceleration);
this.velocity.limit(this.maxspeed);
this.position.add(this.velocity);
this.acceleration.mult(0);
let rColor = map(this.position.y,0,height,minColor.x,maxColor.x);
let gColor = map(this.position.y,0,height,minColor.y,maxColor.y);
let bColor = map(this.position.y,0,height,minColor.z,maxColor.z);
this.color = createVector(rColor,gColor,bColor);
}
applyForce(force) {
this.acceleration.add(force);
}
separate(vehicles) {
let desiredseparation;
let sum = createVector();
let count = 0;
let force;
for (let i = 0; i < vehicles.length; i++) {
let pos;
if(vehicles[i].position == undefined){
pos = createVector(vehicles[i].x,vehicles[i].y);
force = 2;
desiredseparation = this.sepRange/2;
}else{
pos = vehicles[i].position;
force = 1;
desiredseparation = this.sepRange;
}
let d = p5.Vector.dist(this.position, pos);
if ((d > 0) && (d < desiredseparation)) {
let diff = p5.Vector.sub(this.position, pos);
diff.normalize();
diff.div(d);
sum.add(diff);
count++;
}
}
if (count > 0) {
sum.div(count);
sum.normalize();
let steer = p5.Vector.sub(sum, this.velocity);
steer.limit(this.maxforce);
steer.mult(force);
this.applyForce(steer);
}
}
boundaries() {
let desired = null;
if (this.position.x < wallDistance) {
desired = createVector(this.maxspeed, this.velocity.y);
} else if (this.position.x > width - wallDistance) {
desired = createVector(-this.maxspeed, this.velocity.y);
}
if (this.position.y < wallDistance) {
desired = createVector(this.velocity.x, this.maxspeed);
} else if (this.position.y > height - wallDistance) {
desired = createVector(this.velocity.x, -this.maxspeed);
}
if (desired !== null) {
desired.normalize();
desired.mult(this.maxspeed);
let steer = p5.Vector.sub(desired, this.velocity);
steer.limit(this.maxforce);
this.applyForce(steer);
}
}
findBuddies(particles){
this.buddies = [];
// let record1 = Infinity;
// let record2 = Infinity;
// let record3 = Infinity;
// let record4 = Infinity;
// let record5 = Infinity;
// let recordHolder1;
// let recordHolder2;
// let recordHolder3;
// let recordHolder4;
// let recordHolder5;
// for(let p of particles){
// if(p != this){
// let d = this.position.dist(p.position);
// if(d < record1){
// record5 = record4;
// record4 = record3;
// record3 = record2;
// record2 = record1;
// record1 = d;
// recordHolder5 = recordHolder4;
// recordHolder4 = recordHolder3;
// recordHolder3 = recordHolder2;
// recordHolder2 = recordHolder1;
// recordHolder1 = p;
// }else if (d < record2){
// record5 = record4;
// record4 = record3;
// record3 = record2;
// record2 = d;
// recordHolder5 = recordHolder4;
// recordHolder4 = recordHolder3;
// recordHolder3 = recordHolder2;
// recordHolder2 = p;
// }else if(d < record3){
// record5 = record4;
// record4 = record3;
// record3 = d;
// recordHolder5 = recordHolder4;
// recordHolder4 = recordHolder3;
// recordHolder3 = p;
// }else if(d < record4){
// record5 = record4;
// record4 = d;
// recordHolder5 = recordHolder4;
// recordHolder4 = p;
// }else if(d < record5){
// record5 = d;
// recordHolder5 = p;
// }
// }
// }
//D = buddyView;
// this.buddies.push(recordHolder1);
// this.buddies.push(recordHolder2);
// this.buddies.push(recordHolder3);
// this.buddies.push(recordHolder4);
// this.buddies.push(recordHolder5);
for(let p of particles){
let d = this.position.dist(p.position);
if(p != this && d < buddyView){
this.buddies.push(p);
}
}
}
display() {
fill(0);
//stroke(0,0,0,90);
noStroke();
//stroke(this.color.x,this.color.y,this.color.z);
//circle(this.position.x,this.position.y,5);
fill(this.color.x,this.color.y,this.color.z,90);
beginShape();
vertex(this.position.x,this.position.y);
for(let b of this.buddies){
// let d = this.position.dist(b.position);
// let strokeD = 80;//map(d,0,buddyView,100,10);
//stroke(0,0,0,strokeD);
//line(this.position.x,this.position.y,b.position.x,b.position.y);
vertex(b.position.x,b.position.y);
}
vertex(this.position.x,this.position.y);
endShape();
}
}