오늘은 두 개의 동그라미가 서로를 끌어당기는 것을 프로그램으로 표현해 보겠습니다~^^*. 그리고, 그것의 응용으로 서로를 끌어당기는 동그라미 쌍을 여러 개 만들어 보겠습니다. 이것은 동영상 강의에 들어있지 않고, 제 나름으로 응용작품을 만들어 보았습니다~^^* 살펴봐 주시면 감사하겠습니다~^^*
아래의 동영상 강의를 클릭하시면 오늘의 공부내용을 바로 시작(4:00)할 수 있어요~^^* 7:58까지 보시면 오늘 공부 끝~^^*
한 쌍의 동그라미가 서로 반대방향으로 가려고 하면서 서로 끌어당기는 것을 표현해 볼게요~^^*
// class Mover 정의한 파일
class Mover{
constructor(x,y,vx,vy,m){
this.pos = createVector(x,y);
this.vel = createVector(vx, vy);
this.acc = createVector(0,0);
this.mass = m;
this.r = sqrt(this.mass)*2;
}
applyForce(force){
let f = p5.Vector.div(force, this.mass);
this.acc.add(f);
}
attract(mover){
//동그라미가 지정된 다른 동그라미를 끌어당깁니다.
let force = p5.Vector.sub(this.pos, mover.pos);
let distanceSq = constrain(force.magSq(),100, 1000);
let G =25;
//현재 동그라미의 초기 속력 5와 질량 10에 반응하여 짝지은 동그라미들 사이의 거리가 대체로 유지됩니다.
let strength = G*(this.mass*mover.mass)/distanceSq;
force.setMag(strength);
mover.applyForce(force);
}
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 = [];
//mover 동그라미를 여러 개 만들어 봅시다.
function setup() {
createCanvas(400, 400);
//캔버스를 만듭니다.
movers[0] = new Mover(300, 200, 0, -5, 10);
movers[1] = new Mover(100, 200, 0, 5, 10);
//동그라미 두 개를 캔버스 중앙 왼쪽과 오른쪽에 생성합니다.오른편 동그라미movers[0]는 속력 5로 위쪽 방향으로 왼편 동그라미 mover[1]은 같은 속력으로 아래쪽 방향으로 움직이려고 합니다. 질량은 10입니다
}
function draw() {
background(0, 10);
movers[0].attract(movers[1]);
movers[1].attract(movers[0]);
//서로 마주보는 동그라미가 서로를 끌어당깁니다.
for(let mover of movers){
mover.update();
mover.show();
//짝지은 동그라미 사이의 인력의 작용에 따른 움직임을 표현합니다.
}
}
여러 쌍의 동그라미들이 짝끼리 서로를 끌어당기면 전체적으로는 재미있는 대형이 생겨나는 것 같아요.
동그라미의 위치의 x,y 좌표와 속도 벡터의 x,y 방향 길이값을 계산하기 쉽도록, 특수직각삼각형의 피타고라스 정리를 활용해 보았습니다. 자세한 내용을 노트를 참고해 보셔도 좋을 듯 합니다~^^*




class Mover{
constructor(x,y,vx,vy,m){
this.pos = createVector(x,y);
this.vel = createVector(vx, vy);
this.acc = createVector(0,0);
this.mass = m;
this.r = sqrt(this.mass)*2;
}
applyForce(force){
let f = p5.Vector.div(force, this.mass);
this.acc.add(f);
}
attract(mover){
//동그라미가 지정된 다른 동그라미를 끌어당깁니다.
let force = p5.Vector.sub(this.pos, mover.pos);
let distanceSq = constrain(force.magSq(),100, 1000);
let G =100;
//현재 동그라미의 초기 속력 10과 질량 10에 반응하여, 짝지은 동그라미들 사이의 거리가 대체로 유지됩니다.
//중력이 커지면 짝지은 동그라미들 사이의 거리가 줄었다가 회복되기를 반복하게 됩니다.
//중력이 작아지면 짝지은 동그라미들 사이의 거리가 커졌다가 회복되기를 반복하게 됩니다.
let strength = G*(this.mass*mover.mass)/distanceSq;
force.setMag(strength);
mover.applyForce(force);
}
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 = [];
//mover 동그라미를 여러 개 만들어 봅시다.
function setup() {
let side = 400;//캔버스 한 변의 길이
let center = side/2; //캔버스 중싱
let radius = 100; // 원형 움직임의 반지름
let velocity = 10; //동그라미의 초기 속도
let mass = 10; //동그라미의 질량
let a = radius/sqrt(2); //원형움직임반지름의 내각45도 측면 길이
let b = radius*sqrt(3)/2; //원형움직임반지름의 내각30도 측면 길이
let c = radius/2; //원형움직임반지름의 내각60도 측면 길이
let d = velocity/sqrt(2); //내각45도 면의 속도 벡터 길이
let e = velocity*sqrt(3)/2; //내각30도 면의 속도 벡터 길이
let f = velocity/2; //내각 60도 면의 속도 벡터 길이
//수치 조절의 편의성을 위해 관련 수치들을 변수화 해보았습니다.
createCanvas(side, side);
//캔버스를 만듭니다.
movers[0] = new Mover(center+radius, center, 0, -velocity,mass);
movers[1] = new Mover(center-radius, center, 0, velocity,mass);
//0도 180도
movers[2] = new Mover(center, center-radius, -velocity, 0,mass);
movers[3] = new Mover(center, center+radius, velocity, 0,mass);
//90도 270도
movers[4] = new Mover(center+a, center-a, -d,-d,mass);
movers[5] = new Mover(center-a, center+a, d,d,mass);
//45도 225도
movers[6] = new Mover(center-a, center-a, -d, d,mass);
movers[7] = new Mover(center+a, center+a, d, -d,mass);
//135도 315도
movers[8] = new Mover(center+b, center-c, -f,-e,mass );
movers[9] = new Mover(center-b, center+c,f,e, mass);
//30도 210도
movers[10] = new Mover(center-b, center-c,-f,e,mass);
movers[11] = new Mover(center+b, center+c,f,-e, mass );
//150도 330도
movers[12] = new Mover(center+c, center-b,-e, -f,mass );
movers[13] = new Mover(center-c, center+b,e,f,mass);
//60도 240도
movers[14] = new Mover(center-c, center-b,-e,f,mass );
movers[15] = new Mover(center+c, center+b,e,-f,mass);
//120도 300도
//서로 마주보면서 서로 반대방향으로 움직이려는 동그라미 쌍들이 생성됩니다.
}
function draw() {
background(0);
movers[0].attract(movers[1]);
movers[1].attract(movers[0]);
movers[2].attract(movers[3]);
movers[3].attract(movers[2]);
movers[4].attract(movers[5]);
movers[5].attract(movers[4]);
movers[6].attract(movers[7]);
movers[7].attract(movers[6]);
movers[8].attract(movers[9]);
movers[9].attract(movers[8]);
movers[10].attract(movers[11]);
movers[11].attract(movers[10]);
movers[12].attract(movers[13]);
movers[13].attract(movers[12]);
movers[14].attract(movers[15]);
movers[15].attract(movers[14]);
//서로 마주보는 동그라미들이 서로를 끌어당깁니다.
for(let mover of movers){
mover.update();
mover.show();
//짝지은 동그라미 사이의 인력의 작용에 따른 움직임을 모두 표현합니다.
//동그라미들이 원형으로 돌아가는 듯 보이게 됩니다.
}
}
짝끼리 서로 반대 방향으로 움직이려고 하면서 서로를 끌어당기는데, 전체 대형은 바퀴가 돌아가는 것 같기도 하고, 우리의 민속춤을 추는 것 같기도 하고….^^*
아 네~, 우리~, 아름다운 민속춤 강강술래를 계승하고 있는 멋진 소녀들을 만나 볼까요?
옛 것을 익히는 모습 넘 근사하지요~^^* 이번에는 온고지신을 해낸 멋진 작품도 만나 볼게요~^^*
오늘은 서로를 끌어당기는 동그라미들이 서로 반대방향을 향하여 나아가며 원형의 움직임을 만들어 내는 것을 공부해 보았습니다~^^* 오늘도 함께 공부해 주셔서 감사합니다~^^*
내일은 또 어떤 움직임을 프로그램으로 표현해 볼까요? 두둥실 떠오른 달을 보며 춤을 추듯 설레는 마음으로 내일 우리 또 만나서 함께 공부해 볼까요~^^*
넵, 꿈은 이루어 집니다~~!!
댓글 남기기