xxxxxxxxxx
64
let agent;
let target;
function setup() {
createCanvas(400, 400);
agent = new Agent();
target = createVector(random(width), random(height));
}
function draw() {
background(220);
agent.update();
agent.display();
fill(255, 0, 0);
ellipse(target.x, target.y, 20, 20);
if (dist(agent.pos.x, agent.pos.y, target.x, target.y) < 10) {
target = createVector(random(width), random(height));
}
}
class Agent {
constructor() {
this.pos = createVector(width / 2, height / 2);
this.vel = createVector();
this.acc = createVector();
this.maxSpeed = 2;
this.kp = 0.05;
this.ki = 0.001;
this.kd = 0.01;
this.prevError = 0;
this.integral = 0;
}
update() {
let desired = createVector(target.x - this.pos.x, target.y - this.pos.y);
let error = desired.mag();
// P: Proportional term
let p = desired.normalize().mult(this.kp * error);
// I: Integral term
this.integral += error;
let i = desired.normalize().mult(this.ki * this.integral);
// D: Derivative term
let d = desired.normalize().mult(this.kd * (error - this.prevError));
this.prevError = error;
this.acc = p5.Vector.add(p, p5.Vector.add(i, d));
this.vel.add(this.acc);
this.vel.limit(this.maxSpeed);
this.pos.add(this.vel);
this.acc.mult(0);
}
display() {
fill(0, 255, 0);
ellipse(this.pos.x, this.pos.y, 10, 10);
}
}