Silverback9

#야생으로

Creative Coding 독학 제143일 2024년08월17일(토)

오늘은 벡터 A가 벡터 B 위에 드리우는 Scalar Project를 시각적으로 표현하는 프로그램을 만들어 보겠습니다~^^*

아래 동영상 강의를 클릭하시면 오늘 공부 내용을 바로 시작(6:12)하실 수 있어요~^^* 9:40까지 보시면 오늘 공부 끝~~^^*

저는 좌표체계를 (100, 200)을 원점으로 하는 상대좌표로 변환하여 작업을 진행해 보았습니다~ 벡터 a, b가 화면 가운데 나오면서도, 벡터 a, b 의 위치좌표 표현이 간단해 지는 것 같아서요~^^*

하나, 필요한 벡터들을 생성합니다~ 벡터 a, 벡터 b, 그리고, 벡터 a가 벡터 b 위에 드리운 Scalar Project를 시각적으로 표현하기 위해 만들어 진 벡터 v가 있습니다~

둘. 필요한 선들을 표현합니다~ 원점과 벡터 a, b, v 의 위치좌표 사이의 선들, 그리고 벡터 a가 벡터 b에 수직으로 내려오는 normal line이 있습니다~

셋. 필요한 점들을 표현합니다~ 원점, 벡터 a, b, v의 위치좌표가 있습니다~

그럼 전체 코드를 우리 함께 살펴 볼까요~~^^*

function setup() {
  createCanvas(400, 400);
  a = createVector(100, -60);
  //x축 100 y축 -60 만큼 이동하는 크기와 방향을 가진 벡터 a입니다~
  b = createVector(200, 60);
  //x축 200 y축 60 만큼 이동하는 크기와 방향을 가진 벡터 b입니다~
}

function vectorProjection(a, b) {
  let bCopy = b.copy().normalize();
  let sp = a.dot(bCopy);
  bCopy.mult(sp);
  return bCopy;
  //벡터 b를 복사합니다~
  //벡터 b의 복사본의 크기를 1로 만듭니다~ 
  //벡터 b의 방향성을 가진 크기 1의 유닛벡터가 된 것을 변수 bCopy에 저장합니다~ 
  //벡터 a와 벡터 b의 유닛벡터인 벡터 bCopy를 Dot Product하여 Scalar Project를 구합니다~ 
  //Scalar Project를 변수 sp에 저장합니다~
  //벡터 b의 유닛벡터인 벡터 bCopy를 Scalar Project를 곱합니다~ 
  //벡터 b의 방향성을 가지고 크기가 Scalar Project가 된 벡터 bCopy를 return 합니다~
  //bCopy는 이제 벡터 b에 드리워진 벡터 a의 Scalar Project를 컴퓨터 화면에 시각적으로 표현하는 역할을 하게 될 것입니다~
  
}

function draw() {
  background(0);
 
  translate(100, 200);
  //(100, 200)을 원점(0,0) 으로 하는 상대좌표체계를 만들겠습니다~
  //벡터 a와 벡터 b를 화면 가운데 부분에서 표현하기 위한 조치입니다~
  
   let v = vectorProjection(a, b);
  //벡터 a가 벡터 b에 드리우는 Scalar Project를 구합니다~
  //벡터 b의 유닛벡터와 Scalar Project를 곱합니다~
  //Scalar Project의 크기를 가지고 벡터 b의 방향성을 가진 벡터가 만들어 집니다~
  //이 벡터를 변수 v에 저장합니다~

  strokeWeight(8);
  stroke(255);
  line(0, 0, a.x, a.y);
  line(0, 0, b.x, b.y);
  //원점에서 x축 100 y축 -60 이동한 지점이 벡터 a의 위치좌표가 됩니다~
  //원점과 벡터 a의 위치좌표를 두꺼운 흰 선으로 연결합니다~
  //원점에서 x축 200 y축 60 이동한 지점이 벡터 B의 위치좌표가 됩니다~
  //원점과 벡터 b의 위치좌표를 두꺼운 흰 선으로 연결합니다~
  
 
  strokeWeight(8);
  stroke(0, 0, 255);
  line(0, 0, v.x, v.y);
  //원점에서 벡터 b의 방향성을 가지고 Scalar Project 크기만큼 이동한 지점이 벡터 v의 위치좌표가 됩니다~
  //원점과 벡터 v의 위치좌표를 두꺼운 파란 선으로 연결합니다~ 

  strokeWeight(1);
  stroke(255);
  line(a.x, a.y, v.x, v.y);
  //벡터 a가 벡터 b 위로 드리우는 Scalar Project를 시각적으로 표현하는 벡터 v의 위치좌표를 얇은 흰 선으로 연결합니다~
  //벡터 a가 벡터 b 위로 수직으로 내려오는 선(normal line)을 표현하는 선이기도 합니다~
  //벡터 a의 위치좌표(100, -60)와 벡터 B사이의 거리를 표현하기도 합니다~
  //normal line은 한 점과 한 선 사이의 거리를 계산할 때 중요해지는 개념이기도 합니다~

  fill(0, 255, 255);
  noStroke();
  circle(0, 0, 16);
  //원점을 하늘 색 동그라미로 표현합니다~

  fill(0, 255, 0);
  noStroke();
  circle(a.x, a.y, 16);
  //벡터 a의 위치좌표를 녹색 동그라미로 표현합니다~

  fill(255, 0, 0);
  noStroke();
  circle(v.x, v.y , 16);
  //벡터 v의 위치좌표를 빨강색 동그라미로 표현합니다~ 
 
}

자~~~ 이제 우리~~~~ 벡터 a가 벡터 b에 드리우는 그림자를 만나보러 갈까요~~ 그림자 Scalar Project야~~~ 어서 너의 모습을 보여줘~~~

궁금했던 그림자를 보니 반가우면서도 살짝 아쉬우시다구요~~~???^^*

네, 그럼 우리 내일은 그림자를 우리 스스로 만들어 보는 상호작용 프로그램에 도전해 볼까요~~^^*

오늘 저와 함께 Scalar Project 시각화하기를 도전해 주셔서 감사합니다~~^^*

구구단도 시각화를 하면 오호~~ 재미있어지는데요~~^^*

우리~~~ 내일은~~~ 더 큰 도전! 상호작용하는 그림자!!! 함께 공부해 볼까요~~^^*

코딩 공부를 마치고 시작하는 뿌듯한 하루~~ 오늘 하루도 즐겁게 보내셔요~~^^*

넵!! 꿈은 이루어 집니다~~!!!

댓글 남기기