상쾌한 아침입니다. 지금은 6시40분입니다. 바로 공부 시작해 볼게요~ 오늘은 서로 다른 크기의 동그라미 여러 개를 생성하여 그 각각의 동그라미들이 마찰에 반응하는 모습을 프로그램으로 만들어 볼게요. 아래 동영상을 클릭하시면 오늘 공부내용을 바로 시작(8:15)하실 수 있어요~^^*
음…여러 개의 동그라미들이라….. 배열이라고 들어보셨어요? 혹시 낯설거나 아스라한 느낌이 드시는 분은 배열에 대한 기초강의를 먼저 되짚어 살펴 보셔도 좋을 것 같아요~^^*
하나. 배열을 사용할 때 자연스럽게 함께 사용하게 되는 반복구조에 대해 복습해 보고요~^^*
둘. 배열에 대해 살펴 보고요~^^*
셋. 배열과 반복구조를 사용하는 것에 대해 살펴 보고요~^^*
넷. 클래스를 정의하여 객체를 생성하고 배열에 담는 것을 살펴 보고요~^^*
다섯. java script의 특징사항이기도 [for … of loop] 구문 사용법을 살펴 볼게요~^^*.
네, 오늘 공부는 함께 확인해 보면 좋을 기초 내용이 좀 많지요? 여유있게 살펴 보시고 오늘의 공부에 점프해 보아요~^^* 동영상 보시는 동안, 저는 코드 정리해서 다시 돌아올게요. 잠시 후에 우리 또 만나요~^^*
넵, 코드를 완성해서 돌아왔습니다~^^* 기다려 주셔서 감사합니다~^^*
하나. 여러 개의 동그라미들을 담을 배열 구조 변수 movers를 준비해 봅시다.
둘. 동그라미들이 동일한 마찰계수를 가지도록, class 안에서 마찰계수를 정의한 문장은 지우고, 메인함수 제일 위 부분에 global 변수 mu가 마찰계수를 저장하도록 해 볼게요.
셋. [for 구문]을 사용하여 열 개의 동그라미를 동일한 높이와 캔버스 범위 안 다양한 좌우 위치에서, 1~8 범위 안의 다양한 크기로 생성하여 배열 구조 변수 안에 순차적으로 담을게요.
넷. [for of 구문]을 사용하여, 배열 안의 모든 동그라미들에 대해 모든 명령문들이 적용되도록 할게요. for of 구문은 java script의 feature~ 우후~^^*
class Mover{
constructor(x,y,m){
this.pos = createVector(x,y);
this.vel = createVector(0,0);
this.acc = createVector(0,0);
this.mass = m;
this.r = sqrt(this.mass)*10;
}
friction(){
let diff = height - (this.pos.y + this.r);
if(diff < 1){
console.log('friction');
let friction = this.vel.copy();
friction.normalize();
friction.mult(-1);
//let mu = 0.1; 클래스 안에서 마찰계수를 정의하던 문장은 지웁니다.
let normal = this.mass;
friction.setMag(mu * normal);
this.applyForce(friction);
}
}
applyForce(force){
let f = p5.Vector.div(force, this.mass);
this.acc.add(f);
}
edges(){
if(this.pos.y >= height - this.r){
this.pos.y = height - this.r;
this.vel.y *= -1;
}
if(this.pos.x >= width - this.r){
this.pos.x = width - this.r;
this.vel.x *= -1;
} else if(this.pos.x <= this.r){
this.pos.x = this.r;
this.vel.x *= -1;
}
}
update(){
this.vel.add(this.acc);
this.pos.add(this.vel);
this.acc.set(0,0);
}
show(){
stroke(255);
strokeWeight(2);
fill(255, 100);
ellipse(this.pos.x, this.pos.y, this.r*2);
}
}
let movers = [];
//배열구조를 가진 movers 변수를 정의합니다.
let mu = 0.1;
// 모든 동그라미가 동일한 마찰계수를 가지도록 mu는 global 변수로 정희합니다.
function setup() {
createCanvas(400, 400);
for(i = 0; i <10; i++){
//배열 movers는 movers[0]부터 movers[9]까지 총 10개의 개체를 가지게 됩니다.
movers[i] = new Mover(random(width), 200, random(1,8));
//mover[0]부터 mover[9]는 동일한 높이(y= 200)에서, 캔버스 좌우 반경 안의 다양한 수평 위치에서(x = 0 ~ x = width), 1에서 8 사이의 다양한 크기로 생성된 동그라미 객체를 저장하게 됩니다.
}
}
function draw() {
background(0);
for (let mover of movers){
//배열 movers[] 안에 있는 모든 객체 movers[0] ~ movers[9]를 순차적으로 변수 mover에 저장해서 아래에 기술된 모든 명령어들을 그 mover에 대해 실행하도록 합니다. 결국, mover[0] ~ mover[9] 모두에 대해 아래의 명령어들이 작용됩니다.
//[for....of...]는 어느 집합 안의 각 개체들을 구체적으로 호칭하지 않고서도 집합내 모든 개체를 따로따로 호칭하는 효과를 가진 java.script 만의 특징적인 문법사항입니다.
if(mouseIsPressed){
let wind = createVector(0.1, 0);
mover.applyForce(wind);
}
let gravity = createVector(0,0.2);
let weight = p5.Vector.mult(gravity, mover.mass);
mover.applyForce(weight);
mover.friction();
mover.update();
mover.edges();
mover.show();
}
}
꿈은 이루어 집니다!!
댓글 남기기