xxxxxxxxxx
83
const size = 10;
const maxSpeed = 3;
const maxForce = 0.1;
let roads = [];let vehicles = [];
function setup() {
createCanvas(400, 400);
road = new Road(createVector(100,200),createVector(300,200))
append(roads,road);
vehicle = new Vehicle(road);
append(vehicles,vehicle)
}
function draw() {
background(220);
for(let road of roads){
road.render();
}
for(let vehicle of vehicles){
vehicle.update();
vehicle.render();
}
}
class Vehicle{
constructor(road){
road.addVehicle(this);
this.road = road;
this.pos = road.start.copy();
this.pos.y += 100;
this.maxSpeed = maxSpeed;
this.maxForce = maxForce;
this.vel = createVector();
}
update(){
let target = this.road.getNextPoint(this.pos);
let desired = p5.Vector.sub(target, this.pos);
desired.setMag(this.maxSpeed);
let steering = p5.Vector.sub(desired,this.vel);
steering.limit(this.maxForce);
this.vel.add(steering);
this.pos.add(this.vel);
}
render(){
stroke(0,0,0);
fill(255,0,0);
circle(this.pos.x,this.pos.y,size)
}
}
class Road{
constructor(startPos,endPos){
this.start = startPos;
this.end = endPos;
this.population = [];
}
addVehicle(vehical){
append(this.population,vehical)
}
render(){
stroke(0,0,0);
line(this.start.x,this.start.y,this.end.x,this.end.y)
}
getNextPoint(currentPos){
let roadVector = p5.Vector.sub(this.end,this.start);
let toCurrent = p5.Vector.sub(currentPos,this.start);
let projectedLength = toCurrent.dot(roadVector);
projectedLength = constrain(projectedLength,0,1);
return p5.Vector.add(this.start,roadVector.mult(projectedLength))
}
}