검색결과 리스트
프랙탈에 해당되는 글 2건
- 2013.11.27 프랙탈 나무
- 2013.11.22 시에르핀스키 삼각형
글
프랙탈 나무
[이 글의 프로세싱(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();
}
이 글이 마음에 드시면 아래 손가락 한번 꾹 찍어주세요...^_^
'과학이야기 > 물리학' 카테고리의 다른 글
등전위면 그리기 계산 (0) | 2013.12.03 |
---|---|
전기장 그리기 계산 (0) | 2013.12.03 |
시에르핀스키 삼각형 (0) | 2013.11.22 |
회전된 좌표계에서 본 벡터의 표현 (0) | 2013.05.07 |
2차원 충돌 후의 물체의 속력 계산 (1) | 2013.04.10 |
글
시에르핀스키 삼각형
아래는 시에르핀스키 삼각형을 구현하는 프로세싱 애니메이션입니다. 잘 지켜보시면 삼각형의 형태가 나타날 것입니다. 그리고 애니메이션이 되고 있는 그림을 마우스로 클릭하시면 새로 그리기 시작합니다.
먼저 다음과 같이 세점 A, B, C와 그 안의 임의의 점 D가 있다고 가정해 봅시다.
이제 주사위를 던저 1이나 2가 나오면 A와 D의 중점에 점을 찍고, 3이나 4가 나오면 B와 D사이의 중점에 점을 찍고. 5나 6이 나오면 C와 D사이에 점을 찍습니다. 그리고 새롭게 찍힌 점을 다시 출발점으로 삼고 다시 주사위를 계속 던저 같은 과정을 반복합니다. 그러면 아래와 같은 그림을 얻을 수 있습니다.
아래는 1000번 정도 찍었을 때의 모습입니다.
아래는 5000번 정도 찍었을 때의 모습입니다.
아래는 10000번 정도 찍었을 때의 모습이니다.
이렇듯이 주사위를 던지는 횟수를 점점 더 늘려 갈수록 패턴은 더욱 뚜렸해지는데, 이런 프랙탈 이미지를 '시에르핀스키 삼각형'이라고 합니다.
바츌라프 시에르핀스키(Waclaw Sierpinski)(1882-1969)는 폴란드 수학자로 집합론에서 뛰어난 논문을 많이 남겼습니다. 그는 1915년에 시에르핀스키 삼각형을 발견했는데, 이것은 훗날 말덴브로가 프랙탈을 연구하는데 많은 영감을 주었습니다. 시에르핀스키 삼각형은 프랙탈의 단순한 형태라고 할 수 있습니다.
시에르핀스키 삼각형을 구현하는 프로세싱 코드는 다음과 같습니다. 여기서는 주사위를 던지는 대신에 1, 2, 3중에서 난수를 뽑아 점을 찍게 했습니다. 아래 소스를 복사하셔서 프로세싱에 붙여 넣으면 작동이 됩니다.
int x1, y1, x2, y2, x3, y3;
int x, y;
int dice;
void setup() {
size(400, 400);
background(255);
stroke(0);
x1 = width/2;
y1 = 0;
x2 = 0;
y2 = height;
x3 = width;
y3 = height;
x = width/2;
y = height/2;
point(x, y);
}
void draw() {
dice = int(random(0, 4));
if (dice == 1) {
x = (x + x1)/2;
y = (y + y1)/2;
} else if (dice == 2) {
x = (x + x2)/2;
y = (y + y2)/2;
} else if (dice == 3) {
x = (x + x3)/2;
y = (y + y3)/2;
}
point(x, y);
}
void mousePressed() {
background(255);
}
[새길]
[이 글이 마음에 드시면 아래 손가락을 한번 꾹 눌러 주세요...^_^]
'과학이야기 > 물리학' 카테고리의 다른 글
전기장 그리기 계산 (0) | 2013.12.03 |
---|---|
프랙탈 나무 (0) | 2013.11.27 |
회전된 좌표계에서 본 벡터의 표현 (0) | 2013.05.07 |
2차원 충돌 후의 물체의 속력 계산 (1) | 2013.04.10 |
[Processing] 기체분자의 확산(2) (0) | 2013.04.09 |