오늘은 genetic algorithm 기반으로 맛있는 것에 다가가고 위험한 것에서 멀어지는 귀엽고 총명한 vehicle 차량 프로그램 공부를 다시 시작하는 날~~^^* Yeah~~^^*
부드러운 음파에 몸을 맡기고 편안한 아침을 열고 계셔요~^^* 공부 정리해서 돌아 올게요~^^* 쓩우웅~^^*
네~^^* 먼저~^^*
우리의 귀엽고 총명한 vehicle 차량이 물체를 잘 추구하는 지 확인해 보겠습니다~^^*
마우스로 target을 이리저리 움직여 vehicle이 target을 잘 따라오는 지 테스트 해 볼게요~^^*
class Vehicle {
constructor(x, y) {
this.acceleration = createVector(0, 0);
this.velocity = createVector(0, -2);
this.position = createVector(x, y);
this.health = 1;
this.r = 6;
this.maxspeed = 8;
this.maxforce = 0.2;
}
update() {
this.velocity.add(this.acceleration);
this.velocity.limit(this.maxspeed);
this.position.add(this.velocity);
this.acceleration.mult(0);
}
applyForce(force) {
this.acceleration.add(force);
}
seek(target) {
const desired = p5.Vector.sub(target, this.position);
// vehicle의 현재 위치에서 target으로 향하는 벡터입니다.
desired.setMag(this.maxspeed);
//벡터 desired의 힘의 크기를 maxspeed로 세팅하겠습니다.
let steer = p5.Vector.sub(desired, this.velocity);
// 가고자 하는 방향의 벡터 desired에서 현재 vehicle이 가고 있는 방향의 벡터 this.velocity를 뺄셈하여 vehicle이 몸을 틀어야 할 방향을 가진 벡터 steer에 저장합니다.
steer.limit(this.maxforce);
// 벡터 steer의 힘을 this.maxforce 값까지로 제한하겠습니다.
this.applyForce(steer);
//벡터 steer를 vehicle에 작용시킵니다.
}
display() {
let theta = this.velocity.heading() + PI / 2;
fill(127);
stroke(200);
strokeWeight(1);
push();
translate(this.position.x, this.position.y);
rotate(theta);
beginShape();
vertex(0, -this.r * 2);
vertex(-this.r, this.r * 2);
vertex(this.r, this.r * 2);
endShape(CLOSE);
pop();
}
}
var vehicle;
function setup() {
createCanvas(400, 400);
vehicle = new Vehicle(width/2, height/2);
}
function draw() {
background(51);
var target = createVector(mouseX, mouseY);
fill(127);
stroke(200);
strokeWeight(2);
ellipse(target.x, target.y, 48, 48);
vehicle.seek(target);
vehicle.update();
vehicle.display();
}
마우스/손가락을 이리저리 움직여 target의 위치를 바꾸어 볼까요~^^* 우리의 귀엽고 총명한 vehicle 차량이 잘 따라 오나요~^^*
네~^^* 함수 seek()가 잘 작동되고 있는 것 같아요~~^^* 우리 작은 성공에 감사하며~^^*
이번엔, 몸에 좋은 맛있는 음식을 만들어 볼까요~~^^*
배열 food[]를 준비해 보겠습니다~^^* 무작위 위치값을 가진 구성요소 열 개를 생성하여 배열 food[]에 담아 보겠습니다~^^* 녹색의 작은 동그라미로 표현해 볼게요~^^*
var vehicle;
var food = [];
function setup() {
createCanvas(400, 400);
vehicle = new Vehicle(width/2, height/2);
for( var i = 0; i < 10; i++) {
var x = random(width);
var y = random(height);
food.push(createVector(x, y));
}
}
function draw() {
background(51);
var target = createVector(mouseX, mouseY);
fill(127);
stroke(200);
strokeWeight(2);
ellipse(target.x, target.y, 48, 48);
for(var i = 0; i < food.length; i++) {
fill(0, 255, 0);
noStroke();
ellipse(food[i].x, food[i].y, 8, 8);
}
vehicle.seek(target);
vehicle.update();
vehicle.display();
}
건강한 초록색 뿜뿜~^^* 맛있는 음식들이 생겨났나요~^^*
네~^^* 몸에 좋은 맛있는 음식들이 차르르 차려지니 보는 것만으로도 배가 부르네요~~^^*
그럼, 이제 이 맛있는 음식들을 먹어 봐야겠네요!!!
새로운 함수 eat()를 만들어 보겠습니다~~~^^*
먼저, 자신에게서 가장 가까운 음식에게 다가가는 동작을 표현해 보도록 하겠습니다.
eat(list) {
var record = Infinity;
var closest = -1;
for (var i = 0; i < list.length; i++) {
var d = this.position.dist(list[i]);
if(d < record) {
record = d;
closest = i;
}
}
this.seek(list[closest]);
}
//가장 가까운 거리에 대한 신기록 record는 앞으로 점점 수치가 작아질 것이므로, 시작하기 전까지는 알 수 없는 가장 큰 값 Infinity 무한대 값으로 초기 설정하겠습니다~^^*
//배열 list[]의 첫 구성요소 list[0]도 살펴봐야 하기 때문에, 가장 가까운 list 구성요소의 인덱스를 표현할 closest는 -1로 초기 설정하겠습니다.
//vehicle과 가장 가까운 거리에 있는 list의 구성요소인 list[closest]를 추구하도록 함수 seek를 호출하겠습니다~^^*
그럼 이제, 자신에게서 가장 가까운 맛있는 음식을 eat하려고 seek하는 vehicle 차량을 만나볼까요~^^*
네~^^* 맛있는 음식 곁을 떠나지 못하는 귀여운 vehicle이 탄생되었네요~~^^*
이제는 자신이 찾은 이 맛있는 음식을 냠냠 먹도록 해 볼까요~~^^* 함수 splice()를 사용해 보겠습니다~^^*
eat(list) {
var record = Infinity;
var closest = -1;
for (var i = 0; i < list.length; i++) {
var d = this.position.dist(list[i]);
if(d < record) {
record = d;
closest = i;
}
}
this.seek(list[closest]);
if(record < 5) {
list.splice(closest, 1);
}
}
//가장 가까운 거리에 대한 신기록 record는 앞으로 점점 수치가 작아질 것이므로, 시작하기 전까지는 알 수 없는 가장 큰 값 Infinity 무한대 값으로 초기 설정하겠습니다~^^*
//배열 list[]의 첫 구성요소 list[0]도 살펴봐야 하기 때문에, 가장 가까운 list 구성요소의 인덱스를 표현할 closest는 -1로 초기 설정하겠습니다.
//vehicle과 가장 가까운 거리에 있는 list의 구성요소인 list[closest]를 추구하도록 함수 seek를 호출하겠습니다~^^*
//가장 가까운 거리에 대한 신기록 recordrk 5 pixel보다도 작다면, 정말 가까운 것이니까, "제가 한 번 먹어 보도록 하겠습니다~"
//list의 closest번째부터 구성요소 하나만을 제거하도록 하겠습니다. 즉, closest 번째 구성요소를 제거하겠습니다.
우리의 귀엽고 총명한 vehicle 차량이 몸에 좋은 맛있는 음식을 냠냠 먹는 먹방 타임~~^^* YEAH~~^^*
오늘 저와 함께, 보기만 해도 함께 배부른 느낌이 드는 먹방 프로그램을 완성해 주셔서 감사합니다~^^*
내일은 우리~^^* 위험한 독약은 피해가는 동작을 코드로 구현해 볼까요~^^*
네~^^* 좋아요~^^* 고마워요~^^*
오늘도
멋진 아침!
맛있는 점심!
따뜻한 저녁!
누리시고요~^^*
깊고 포근한 밤 코~^^* 하시기 바래요~^^*
네~^^* 꿈은 이루어 집니다~^^*
댓글 남기기