自治智能体转向行为之到达目的地
程序员文章站
2022-04-27 13:17:43
...
此篇为学习《代码本色》笔记
自治智能体特点:
自治智能体对环境存在感知能力.且感知能力有限。
自治智能体需要处理来自外部环境的信息,并由此计算具体的行为。
自治智能体没有领导者。
转向力
在引力作用下,无论物体与目标之间的距离多近,它所受的里永远不会远离目标;但在转向力的到达行为中,如果它朝向目标运动的速度过快,转向力会让你减速以纠正误差。
数学分析:
所需速度 = 目标位置 - 当前位置,需设置最大速度
转向力 = 所需速度 - 当前速度,需设置最大转向力
转向力:
转向力的本质是当前速度的偏差。
快靠近目标时的减速行为:
设在半径为r的范围内从速度从最大速度减小到0。
完整代码:
Vehicle v;
void setup()
{
size(640,360);
v = new Vehicle(width/2,height/2);
}
void draw()
{
background(255);
PVector mouse = new PVector(mouseX, mouseY);
// Draw an ellipse at the mouse position
fill(200);
stroke(0);
strokeWeight(2);
ellipse(mouse.x, mouse.y, 48, 48);
// Call the appropriate steering behaviors for our agents
v.seek(mouse);
v.update();
v.display();
}
class Vehicle
{
ArrayList<PVector> history = new ArrayList<PVector>();
PVector position;
PVector velocity;
PVector acceleration;
float r;
float maxforce;
float maxspeed;
Vehicle(float x,float y)
{
acceleration = new PVector();
velocity = new PVector(0,-2);
position = new PVector(x,y);
r = 6;
maxspeed = 4;
maxforce = 0.1;
}
void update()
{
velocity.add(acceleration);
velocity.limit(maxspeed);
position.add(velocity);
acceleration.mult(0);
history.add(position.get());
if (history.size() > 100) {
history.remove(0);
}
}
void applyForce(PVector force)
{
acceleration.add(force);
}
void seek(PVector target)
{
PVector desired = PVector.sub(target,position);
float d = desired.mag();
// Scale with arbitrary damping within 100 pixels
if (d < 100) {
float m = map(d,0,100,0,maxspeed);
desired.setMag(m);
} else {
desired.setMag(maxspeed);
}
PVector steer = PVector.sub(desired,velocity);
steer.limit(maxforce);
applyForce(steer);
}
void display() {
beginShape();
stroke(0);
strokeWeight(10);
noFill();
for(PVector v: history) {
vertex(v.x,v.y);
}
endShape();
float theta = velocity.heading2D() + PI/2;
fill(127);
stroke(0);
strokeWeight(1);
pushMatrix();
translate(position.x,position.y);
rotate(theta);
beginShape();
vertex(0, -r*2);
vertex(-r, r*2);
vertex(r, r*2);
endShape(CLOSE);
popMatrix();
}
}
推荐阅读