Silverback9

#야생으로

Creative Coding 독학 제212일 2024년10월25일(금)

오늘은 나무 심는 날이예요~~^^*

프랙탈 나무가 씩씩하게 자라나는 시월은 푸르구나~~^^*예요~~^^*

나무는 하늘을 향해 자라는 데요~~^^*

그래서, p5.js 캔버스 화면의 위치좌표체계로 보면, y 좌표가 줄어드는 것이 될 거 같아요~^^* 컴퓨터 그래픽의 화면 좌표쳬계에서는, 위로 갈수록 y좌표값이 줄어드니까요~^^*

그러면 우리 하늘로 올곧게 올라가는 나무 기둥을 그려 볼까요~~^^*

캔버스 화면 가운데 맨아래 (200, height)에서 위로 100만큼 올곧게 올라갈게요~~^^*

function setup(){
  createCanvas(400, 400);
}

function draw() {
  background(51);
  
  var len = 100;
  
  stroke(255);
  line (200, height, 200, height - len);
}
//화면의 높이가 height인데, y좌표는 값이 커질 수록 내려가는 것이니까, height가 맨 아래를 의미하게 되는 것이겠지요~~^^*

씨앗을 심었고~~ 비가 내려주고~~흙이 영양분을 나누어 주어서~~여린 싹이 나더니~~어머 어느새 가느다란 나무 기둥이 되었네요~~아직 가지가 나오진 않았지만~~이것만으로도 충분히 신비하고 감사한 생명의 힘~~^^*

이제 나무가 쑥쑥 자랄테니, 나무가지를 만드는 함수를 따로 만든 후 메인함수에서 자유롭게 호출하는 형태로 코드 구조를 바꾸어 볼게요~~^^*

function setup(){
  createCanvas(400, 400);
}

function draw() {
  background(51);
  
  var len = 100;
  
  stroke(255);
  branch(len);
}

function branch(len) {
  line (200, height, 200, height - len);
}
//메인 함수가 branch 함수를 호출하는 형태로 작업해 보겠습니다~~

어때요~~^^* 나무 기둥이 똑같이 그려지나요~~^^*

이번에는, 다른 나뭇가지들이 계속 자라날 때를 대비해 보겠습니다~^^*

매번 나뭇가지들의 좌표위치를 지정한 branch#1(len ), branch#2(len), branch#3(len)…를 계속 따로 만들 수는 없겠지요~~^^*?

그래서~^^* 나뭇가지를 생성하려고 할 때마다 좌표체계를 상대좌표체계로 바꾼 후 branch (len) 함수를 호출하도록 해보겠습니다~~

나뭇가지가 생성될 시작위치를 중심(0,0)으로 하는 상대좌표체계로 바꾼 후 branch(len) 함수를 호출하면 어떨까요~~^^* 이렇게 말이죠~~^^*

function setup(){
  createCanvas(400, 400);
}

function draw() {
  background(51);
  
  var len = 100;
  
  stroke(255);
  translate(200, height);
  branch(len);
}

function branch(len) {
  line (0, 0, 0, - len);
}
//메인 함수가 가지가 시작되는 위치를 중심으로 하는 상대좌표체계로 변화시킨 후 branch함수를 호출하도록 하겠습니다~
//이제 branch함수는 위치좌표를 신경쓰지 않아도 되겠네요~~!!!

어때요~~^^* 이번에도 같은 모양의 나무 줄기가 땅에서 올라왔나요~~^^*

이제 우리 슬슬~~ 나무줄기에 나뭇가지가 생겨나도록 준비해 볼까요~~^^* 계속 나뭇가지가 생겨나도록 하려면~~^^*

그렇죠!!

recursion 재귀 함수!!!

함수 branch(len)가 자신을 호출하여 나뭇가지를 계속 그려나갈 수 있도록 해 볼게요~^^*

이때 우리가 꼭 기억해야 할 것은~~~~~???

네~~!!! 맞아요~~!!!

종료 조건 명시!!!!

그럼 우리~~^^* 나뭇가지 길이를 100부터 조금씩 줄여나가다가 4가 되면 종료하도록 해볼까요~~^^*

그리고 나무가지는 자신의 시작위치에서 살짝 방향을 꺽어서 자라는 것이니까~~ 회전각 4분의 1 파이 (45도) 를 주도록 해 볼게요~~^^*

function setup(){
  createCanvas(400, 400);
}

function draw() {
  background(51);
  
  var len = 100;
  
  stroke(255);
  translate(200, height);
  branch(len);
}

function branch(len) {
  line (0, 0, 0, - len);
  
  translate(0, - len);
  
  rotate(PI/4);
  
  if(len > 4) {
    branch(len * 0.7);
  }
}
//메인 함수가 가지가 시작되는 위치를 중심으로 하는 상대좌표체계로 변화 시킨 후 branch함수를 호출하도록 하겠습니다~
//이제 branch함수는 위치좌표를 신경쓰지 않아도 되겠네요~~!!!
//branch 함수 안에서 다음 나뭇가지의 위치를 중심으로 하는 상대좌표 체계로 바꾼 후 나뭇가지 길이를 30% 감소해 나가며 길이 4가 될 때까지 자기호출을 계속해 보겠습니다. 
//나뭇가지 길이가 4보다 작게 되어 자기호출이 멈춰지면, 결과값을 return하기 시작하면서 비로소 나뭇가지가 그려지겠네요~~^^*

와우!! 우리들의 첫 작품이예요~~!!! 와우 정말 나뭇가지가 자라나네요!!!

오늘 재귀함수가 만들어 지는 과정을 찬찬히 저와 함께 걸어 주셔서 감사합니다~~^^*

오늘 저와 함께 recursion 재귀 함수를 사용해서 가녀리지만 대견한 나무가지를 그려 주셔서 감사합니다~~^^*

우리 내일은~~ 나뭇가지가 뻗어나가는 방향도 조절해 보고~~나뭇가지가 양 옆으로 자라도록 만들어 보기도 할까요~~^^*

네~~!!!

맞아요!!!

시작은 미약하지만~~ 작은 도전들을 연이어 계속해나가다 보면 어느새 또 멋진 작품이 탄생될 거예요~~!!!

오늘은 작은 콩알 하나 심은 날이네요~~^^* 내일은 멋진 나무로 자라나 있을 거예요~~^^*

오늘도 멋진 아침! 멋진 하루! 보내시고요~~^^*

내일 우리 또 만나요~~^^*

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

댓글 남기기