DATT4950 - week 3

In this example below you will see how to do a DATT4950 - week 3 with some HTML / CSS and Javascript

Artificial Life

Thumbnail
This awesome code was written by grrrwaaa, you can see more from this user in the personal repository.
You can find the original code on Codepen.io
Copyright grrrwaaa ©
  • HTML
  • JavaScript
<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  <title>DATT4950 - week 3</title>
  
  
  
  
  
</head>

<body>

  
  <script src='https://grrrwaaa.github.io/courses/code/al.min.js'></script>

  

    <script  src="js/index.js"></script>




</body>

</html>

/*Downloaded from https://www.codeseek.co/grrrwaaa/datt4950-week-3-LGebzj */
var agents = [];

function make_agent() {
  var a = {
    pos: new vec2(random(), random()),
    vel: vec2.random(0.001),
    size: 1/30,
    max_force: 1/400,
    max_speed: 1/100,
    view_range: 0.3,
  };
  agents.push(a);
}
for (var i=0; i<100; i++) make_agent();

var target = {
  pos: new vec2(random(), random()),
  pos_prev: new vec2(),
  vel: new vec2(),
  size: 0.1,
};
function mouse(e, p) {
  if (e == "down") {
    var pos_prev = target.pos.clone();
    target.pos.set(p);
    target.vel = target.pos.clone().sub(pos_prev);
  }
}

function update() {
  var targetspd = target.vel.len();
  
  for (var a of agents) {
    // given the position of the light (target.pos)
    // how do I compute the required steering?
    // target from the agent's point of view
    var rel = target.pos.clone().sub(a.pos);
    rel.relativewrap(1);
    
    // limit this to our top speed
    var desired_velocity = rel;
    desired_velocity.limit(a.max_speed);
    
    // run away?
    if (targetspd > 0.01) desired_velocity.negate();
    
    for (var n of agents) {
      // don't check self:
      if (a != n) {
        var rel = n.pos.clone().sub(a.pos);
        rel.relativewrap(1);
        
        // where is the target in the agent's field of view?
        var heading = a.vel.angle(); // our direction in radians
        var relview = rel.clone().rotate(-heading);
        // will we collide?
        var in_front = relview[0] > 0;
        var in_range = relview[0] < a.view_range;
        var in_path = Math.abs(relview[1]) < (a.size/2 + n.size/2);
        if (in_front && in_range && in_path) {
          // take evasive action!
          var avoid = new vec2(0, -relview[1]);
          avoid.rotate(heading);
          desired_velocity.add(avoid);
        }
      }
    }
    
    // locomotion:
    
    // subtract our current velocity
    var steering = desired_velocity.sub(a.vel);
    // forward Euler integration
    //var steering = vec2.random(0.001);
    var acceleration = steering.limit(a.max_force);
    a.vel.add(acceleration).limit(a.max_speed);
    a.pos.add(a.vel).wrap(1);
    
  }
}

function draw() {
  draw2D.color("yellow");
  draw2D.circle(target.pos, target.size);
  
  for (var a of agents) {
    draw2D.push()
      .translate(a.pos)
      .rotate(a.vel)
      .scale(a.size);
      draw2D.color("green");
      draw2D.circle();
      draw2D.color("white");
      draw2D.circle([0.25, 0.25], 0.2);
      draw2D.circle([0.25,-0.25], 0.2);
    draw2D.pop();
  }
}

Comments