오늘은 하나의 target을 pursue하면서 다른 하나의 target을 evade하는 모습을 프로그램으로 표현해 보겠습니다~^^*
아, 네!! 그렇죠~~!!
이틀 동안 우리가 만들어 보았던 함수 pursue()와 함수 evade()를 모두 사용하면 될 것 같아요~^^*
은근 간단~~~^^* 오늘은 금요일~~~^^* 은근 간단 프로그램이 제격인 오늘은 금요일~~^^*
TGIF!!
음….근데요….evade하고 싶은 target과 pursue하고 싶은 target을 우리가 구별할 수 있어야 할 것 같아요…
그래서~!!
Class Target의 함수 show()가 RGB 수치를 인자로 받도록 살짝 고쳐 볼게요~^^*
이제~ 대략의 청사진은 그려졌으니, 오늘의 동영상 강의를 편안한 마음으로 시청해 보셔도 좋을 것 같습니다~~^^*
아래 영상을 클릭하시면 오늘 공부 내용을 바로 시작(10:03)하실 수 있어요~^^* 10:34까지 보시면 오늘 공부 끝~^^*
먼저~~^^* 핵심 코드를 살펴 보도록 할게요~^^*
class Target의 함수 show()가 R, G, B 수치를 받아 색칠하도록 수정하였습니다~^^*
class Target extends Vehicle {
constructor(x, y) {
super(x, y);
this.vel = p5.Vector.random2D();
this.vel.mult(5);
}
show(r, g, b,) {
stroke(255);
strokeWeight(2);
fill(r,g,b);
push();
translate(this.pos.x, this.pos.y);
circle(0, 0, this.r * 2);
pop();
}
}
target을 두 개 생성하여 하나는 evade하고 다른 하나는 pursue하도록 하겠습니다.
두 target의 함수 show(r, g, b)를 호출하면서 색상지정을 하겠습니다~^^*
let pursuer;
let targetE;
let targetP
pursuer = new Vehicle(100, 100);
targetE = new Target(200, 100);
targetP = new Target(200, 300);
let steeringE = (pursuer.evade(targetE));
let steeringP = (pursuer.pursue(targetP));
pursuer.applyForce(steeringE);
pursuer.applyForce(steeringP);
targetE.show(255, 0, 0);
targetP.show(0, 255, 0);
그럼 이제 전체 코드를 함께 살펴 볼까요, 우리~~^^*
<!DOCTYPE html>
<html>
<head>
https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.2.0/p5.min.js
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
http://vehicle.js
http://sketch.js
</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;
}
evade(vehicle) {
let pursuit = this.pursue(vehicle);
pursuit.mult(-1);
return pursuit;
}
pursue(vehicle){
let target = vehicle.pos.copy();
let prediction = vehicle.vel.copy();
prediction.mult(10);
target.add(prediction);
return this.seek(target);
}
seek(target) {
let force = p5.Vector.sub(target, this.pos);
force.setMag(this.maxSpeed);
force.sub(this.vel);
force.limit(this.maxForce);
return force;
}
applyForce(force) {
this.acc.add(force); //21
}
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;
}
}
}
class Target extends Vehicle {
constructor(x, y) {
super(x, y);
this.vel = p5.Vector.random2D();
this.vel.mult(5);
}
show(r, g, b,) {
stroke(255);
strokeWeight(2);
fill(r,g,b);
push();
translate(this.pos.x, this.pos.y);
circle(0, 0, this.r * 2);
pop();
}
}
let pursuer;
let targetE;
let targetP;
function setup() {
createCanvas(400, 400);
pursuer = new Vehicle(100, 100);
targetE = new Target(200, 100);
targetP = new Target(200, 300);
}
function draw() {
background(0);
let steeringE = (pursuer.evade(targetE));
let steeringP = (pursuer.pursue(targetP));
pursuer.applyForce(steeringE);
pursuer.applyForce(steeringP);
pursuer.edges();
pursuer.update();
pursuer.show();
targetE.edges();
targetE.update();
targetE.show(255, 0, 0);
targetP.edges();
targetP.update();
targetP.show(0, 255, 0);
}
하나의 target은 evade하고 다른 하나의 target은 pursue하느라 바쁜 우리 pursuer를 응원하러 가볼까요~~^^*
기약없이 쫓고 쫓기는 삶의 고단함을 우리 pursue가 작은 p5.js 캔버스 화면 위에서 보여주고 있네요…
서로의 자유를 존중하는 삶의 세계로 바꾸기 위해서는…
그 방법을 깊게 생각해 봐야하고…
용기를 내어 실천의 발걸음을 떼어야 하는 것 같아요.
그 여정이 힘들어 주저 앉을 때 서로 다시 일으켜 주는 사랑의 힘으로 기운을 내어서
서로의 자유를 존중하는 세계를 조금씩 만들어가면 참 좋을 것 같아요~~^^*
오늘도 저와 함께 코딩 공부 해주셔서 감사합니다~~^^*
우리 내일도 함께 코딩 공부 해요~~^^*
오늘은 금요일~~^^* 익숙해서 편안한 곳 낯설어서 설레는 곳 산책하는 시간도 좀 있는 편안한 금요일 하루 되시길 바래요~^^*
네~!! 꿈은 이루어 집니다~~!!
댓글 남기기