欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自治智能体转向行为之到达目的地

程序员文章站 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();
  }
  
}

相关标签: processing