Silverback9

#야생으로

Creative Coding 독학 제210일 2024년10월23일(수)

네~~^^* 어제 우리는 종료 조건을 명시하는 것의 중요성을 공부했어요~^^*

종료 조건이 만족되어, 드디어 자신을 호출하는 작업이 종료가 되면~~^^*

비로소 제일 마지막에 호출되었던 자신은 자신을 호출한 자신에게 자신의 작업의 결과물을 return해요~ 그러면 값을 return 받은 자신은 그 값을 가지고 작업을 하고 그 결과를 자신을 호출한 자신에게 return을 해요~~^^*

recursion의 과정을 화살표를 사용해서 정리해 보면~~^^*

자신 #1 - call -> 
자신 #2 - call -> 
자신 #3 - call -> 
자신 #4  
종료 조건 만족   
자신 #4 - return -> 
자신 #3 - return -> 
자신 #2 - return -> 
자신 #1 

(1) 종료 조건이 반드시 있어야 하고~^^*

(2) 종료 조건이 만족될 때까지 자신을 call 하는 횟수가 Stack 저장공간의 한계를 넘지 않아야 하고~^^*

이 두 가지를 충족하면, 아주 재미있는 프랙탈을 컴퓨터가 만들어 주게 되겠네요^^*

recursion 재귀 함수의 이 두 가지 포인트를 잘 지키면서 자유롭게 재미있는 그림을 펼쳐 보도록 할까요~~^^*

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

function draw() {
background(0);
drawCircle(200, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 300 pixel인 원을 그려 달라고 해보겠습니다. 
}

function drawCircle(x, y, d) {
 noFill();
 stroke(255)
 ellipse(x, y, d);
  if (d > 2) {  

  drawCircle(x + d * 0.5, y, d * 0.5);
  drawCircle(x - d * 0.5, y, d * 0.5);  
 }  
 //x좌표 오른쪽과 왼쪽에 동그라미를 그려보겠습니다~
 //원이 오른쪽으로 왼쪽으로 계속 생기고, 그 크기는 작아지게 되겠네요~
}

아주 단순하게 두 개의 원을 그리는 함수가 자신을 계속 호출하는데요. 어떤 그림이 펼쳐 질까요~~^^*

이번에는 세 개의 원이 삼각형 형태를 띄도록 해 볼게요~^^*

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

function draw() {
background(0);
drawCircle(200, 200, 200);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 200 pixel인 원을 그려 달라고 해보겠습니다. 
}

function drawCircle(x, y, d) {
 noFill();
 stroke(255)
 ellipse(x, y, d);
  if (d > 2) {  

  drawCircle(x + d * 0.5, y, d * 0.5);
  drawCircle(x - d * 0.5, y, d * 0.5);  
  drawCircle(x, y + d * 0.5, d * 0.5);
 }  
 //x좌표 오른쪽과 왼쪽에 동그라미를 그려보겠습니다~
 //원이 오른쪽으로 왼쪽으로 계속 생기고, 그 크기는 작아지게 되겠네요~
}

원이 삼각형 대형을 이루며 점점 작아지며 점점 왼쪽 오른쪽으로 움직이면 어떤 그림이 만들어 지는 것일까요? 궁금하시죠~~^^*

이번에는 오른쪽과 아래쪽으로만 원을 그려볼까요~^^*

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

function draw() {
background(0);
drawCircle(200, 200, 200);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 300 pixel인 원을 그려 달라고 해보겠습니다. 
}

function drawCircle(x, y, d) {
 noFill();
 stroke(255)
 ellipse(x, y, d);
  if (d > 2) {  

  drawCircle(x + d * 0.5, y, d * 0.5);
  drawCircle(x, y + d * 0.5, d * 0.5);  
 
 }  
 //x좌표 아래쪽, 오른쪽에 동그라미를 그려보겠습니다~
 //원이 오른쪽으로, 아래쪽으로 계속 생기고, 그 크기는 작아지게 되겠네요~
}

뭔가 스케이트 보드를 타고 U자형 협곡의 오른쪽 면에 다다른 사람의 정지화면 같은 느낌이 들까요~^^*

이번엔 그 그림을 우리가 마우스로 줌인 줌아웃 해보도록 하겠습니다~^^*

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

function draw() {
background(0);
drawCircle(200, 200, mouseX);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 mouseX인 원을 그려 달라고 해보겠습니다. 
}

function drawCircle(x, y, d) {
 noFill();
 stroke(255)
 ellipse(x, y, d);
  if (d > 2) {  

  drawCircle(x + d * 0.5, y, d * 0.5);
 
  drawCircle(x, y + d * 0.5, d * 0.5);  
 }  
 //x좌표 아래쪽, 오른쪽에 동그라미를 그려보겠습니다~
  
 //원이 오른쪽으로, 아래쪽으로 계속 생기고, 그 크기는 마우스로 조절할 수 있어요~^^*
}

마우스로 그림을 줌인~~줌아웃~~해보시겠어요~~^^* 아이 재밌어~~^^*

살짝만 달라져도 그림 전체의 느낌이 달라지는 것이 이 재귀함수로 그리는 그림의 묘미인 것 같아요~^^*

자신을 호출하는 것을 반복하는 것을 사람이 한다면, 정말 많이 헷갈릴 것 같은데요. 이렇게 컴퓨터가 헷갈려하지 않고 충실하게 반복해 주니 참 고마운데요~~^^*

컴퓨터의 탄생! 감사합니다~~^^*

어느새, 따뜻한 자켓이 감사한 계절이 왔어요~~^^*

한 여름 영영 안올 것 같은 겨울이 오고 있네요^^* 계절의 반복도 참 신기한 것 같아요! 4계절이 천천히 자기호출을 하며 기후를 이루고 있어요~^^* 새삼 신기한데요~^^*

멋진 삼각형 대열을 만들어 함께 움직이는 원들이 신기한 오늘이었습니다~^^* 오늘도 저와 함께 코드 공부 해주셔서 감사합니다~^^*

참 멋진 트라이앵글이죠~~^^*

내일 우리 또 만나서 프랙탈 공부를 이어 갈까요~^^*

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

댓글 남기기