프랙탈 나무

과학이야기/물리학 2013. 11. 27. 14:39

[이 글의 프로세싱(Processing) 애니메이션은 크롬이나, IE9이상에서 작동됩니다.]

 

어제 아이들과 프랙탈 이미지를 만드는 것을 해 봤습니다. 간단하게 칠판에다 나무가 자라는 모습을 그려 보았는데, 오늘 프로세싱으로 구현을 해 봤습니다. 다음은 나무가 특정한 규칙에 의해 자라나는 모습을 프로세싱으로 시뮬레이션해본 모습입니다. 1초에 1단계씩 진행되며 총 9단계가 진행되는 모습입니다. 프로그래밍의 편의를 위해 옆으로 자라난다고 가정하고 시뮬레이션을 해 봤습니다.

 

 

규칙은 다음과 같습니다.

 

 

위의 그림에서 초록색으로 표시된 것이 첫 단계입니다. 그리고 옆으로 가지가 각각 1/3, 2/3, 그리고 끝부분에서, 각각 ,각도로 뻗어 나오고 자라는 길이는 원래 길이의 80%까지 자란다고 가정했습니다. 위의 시뮬레이션에서는 =-10도, =10도, =5도로 시뮬레이션을 했습니다.

 

그리고 뻗어나온 가지에서도 역시 같은 규칙에 의해 뻗어나온다고 했을 때 총 10단계가 진행되는 모습을 시뮬레이션해 본 것입니다.

 

위의 그림에서는 위로 자라나는 모습으로 보여드리는데 시뮬레이션에서는 간단하게 하기 위해 옆으로 자라난다고 가정하고 시뮬레이션을 했습니다. 소스를 공개하니 적당히 알아서 수정해 보시기 바랍니다.

 

아래는 1단계부터 9단계까지 진행되는 모습을 단계별로 저장하고 그림을 회전시켜 놓았습니다. 참고하시기 바랍니다.

 

 

 

 

 

 

 

 

 

 

 

[새길]

 

 

int m = 1;
float scale = 0.8; //뻗어나온 가지가 자라는 비율

 

void setup() {
  size(400, 400);
  smooth();
  background(255);
  frameRate(1);
}

 

void draw() {
  background(255); 
  drawTree( 0, height/2, -10, 10, 5, 100, m);
  m = m + 1;
  if (m > 9) {
    m = 1;
  }
}

 

void drawTree(float x, float y, float theta1, float theta2, float theta3, float len, int level) {
  stroke(0, 255*(10-level)/10, 0);
  strokeWeight(level/3);
  pushMatrix();
    translate(x, y);
    line(0, 0, len, 0);
    if (level > 1) {
      level = level - 1;
     
      pushMatrix();
        translate( len/3, 0);
        rotate(radians(theta1));
        drawTree(0, 0, theta1, theta2, theta3, len*scale, level);   
      popMatrix();
     
      pushMatrix();
        translate( len*2/3, 0);
        rotate(radians(theta2));
        drawTree(0, 0, theta1, theta2, theta3, len*scale, level);   
      popMatrix();

 

      pushMatrix();
        translate( len, 0);
        rotate(radians(theta3));
        drawTree(0, 0, theta1, theta2, theta3, len*scale, level);   
      popMatrix();
    }
  popMatrix();
}

 

이 글이 마음에 드시면 아래 손가락 한번 꾹 찍어주세요...^_^

설정

트랙백

댓글