Silverback9

#야생으로

Creative Coding 독학 제114일 2024년07월19일(금)

오늘은 열심히 도망치는 굳센 autonomous agent Flee!를 만들어 보도록 할게요~^^*

아래의 동영상 강의를 1:30까지 보시면 오늘 공부 끝~~^^*

네~^^* Flee 참 쉽죠~^^* (밥 아저씨 목소리가 들린다????요~~^^*)

어제 우리가 만들어 본 Seek은 Target으로 다가가는 것이었다면,

오늘 우리가 만들어 볼 Flee는 Target으로부터 멀어지는 것이라서,

어제 만든 Seek()함수의 force 방향을 반대방향으로 돌리면 될 것 같아요!!

force.mult(-1);

어제 만든 프로그램에 이 실행문 하나만 더하면, autonomous agent Flee 탄생!

너무 간단해서 좀 어떨떨한데요….

전체 코드를 살펴 보며, 이 한 문장의 힘을 실감해 볼까요~^^*

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.2.0/p5.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />

  </head>
  <body>
    <script src="vehicle.js"></script>
    <script src="sketch.js"></script>
  </body>
</html>

class Vehicle {
  constructor(x, y) {
    this.pos = createVector(x, y);
    this.vel = createVector(0, 0);
    this.acc = createVector(0, 0);
    this.maxSpeed = 4;
    this.maxForce = 0.25;
    this.r = 16;
  }

 // seek(target) {
 //   let force = p5.Vector.sub(target, this.pos);
 //   force.setMag(this.maxSpeed);
 //   force.sub(this.vel);
 //   force.limit(this.maxForce);
 //   this.applyForce(force);
 // }
  
  flee(chaser) {
    let force = p5.Vector.sub(chaser, this.pos);
    force.setMag(this.maxSpeed);
    force.sub(this.vel);
    force.limit(this.maxForce);
    force.mult(-1);
    this.applyForce(force);
  }
  
  //함수 seek()와 flee()를 비교해 보기위해, 
  //seek()를 지우지 않고 주석처리 하였습니다.
  //flee()는 seek()의 실행문들이 그대로 다 들어있고,
  //벡터 force의 방향을 반대로 바꾸기 위해 
  //force.mult(-1); 이 추가되었네요. 

  applyForce(force) {
    this.acc.add(force);
  }

  update() {
    this.vel.add(this.acc);
    this.vel.limit(this.maxSpeed);
    this.pos.add(this.vel);
    this.acc.set(0, 0);
  }

  show() {
    stroke(255);
    strokeWeight(2);
    fill(255);
    push();
    translate(this.pos.x, this.pos.y);
    rotate(this.vel.heading());
    triangle(-this.r, -this.r / 2, -this.r, this.r / 2, this.r, 0);
    pop();
  }

  edges() {
    if (this.pos.x > width + this.r) {
      this.pos.x = -this.r;
    } else if (this.pos.x < -this.r) {
      this.pos.x = width + this.r;
    }
    if (this.pos.y > height + this.r) {
      this.pos.y = -this.r;
    } else if (this.pos.y < -this.r) {
      this.pos.y = height + this.r;
    }
  }
}

let vehicle;
//let target;
let chaser;

function setup() {
  createCanvas(400, 400);
  vehicle = new Vehicle(100, 100);
}

function draw() {
  background(0);
  fill(255, 0, 0);
  noStroke();
  //target = createVector(mouseX, mouseY);
  //circle(target.x, target.y, 32);
  //vehicle.seek(target);
  chaser = createVector(mouseX, mouseY);
  circle(chaser.x, chaser.y, 32);
  vehicle.flee(chaser);
  vehicle.update();
  vehicle.show();
}
//seek:target & flee:chaser의 관계성을 비교해 보기 위해
//target 관련 실행문을 지우지 않고 주석처리해 놓았습니다.
//chaser가 생성되고 flee를 쫓아가는 실행문과 
//target이 생성되고 seek에 쫓기는 실행문의 구성이 동일하지요?^^*
//마우스/손가락을 움직여 chaser의 위치를 변화시켜 Flee를 추격해 보세요~^^*
//Flee가 엄청 빨리 화면 밖으로 도망가네요~^^* 
//달리기 선수인가봐요^^*

달리기선수인 우리의 autonomous agent Flee를 마우스/손가락을 화면 위에 움직여 추격해 보셔요~^^* 금세 달아나 버려 시원섭섭하실 것 같아요^^;;

벗어나고 싶은 환경과 존재에게서 ,

도망가기로 마침내 굳은 결심을 하고,

뒤돌아 보지 않고 앞으로 앞으로 ,

내일을 향해서 ,

머물고 싶은 곳을 향해서 ,

열심히 달리는 우리의 autonomous agent Flee!는 노벨평화상과 어울리는 굳센 마음을 가졌어요~^^* Flee! 화이팅!

그런데요~~^^*

오늘의 Flee 프로그램이 너무 쉬워서 살짝 헛헛하셨다면, Say Yes~^^*

네~^^*

그러면~~^^*,

내일 좀더 다른 방식으로 Flee를 코딩해 보기로 할까요~^^*

궁금~하시죠~~~^^* 저도 궁금~해요~~~^^*

오늘은 해가 참 좋았던 날이었어요~^^*

오늘도 저와 함께 코딩 공부해 주셔서 감사합니다~~^^*

따스한 땅기운에 감싸인 편안한 저녁 보내셔요~~^^*

우리 내일 또 만나서 Flee version 2!를 함께 만들어 볼까요~~^^*

네!!! 꿈은 이루어 집니다!!!

댓글 남기기