오늘은 드디어 L-System Fractal Tree (Plant)를 그림으로 그려 보겠습니다~^^*
어제 만들었던 문자 전개도 프로그램을 개선해서 그림을 그려 보겠습니다~~^^*
그림을 그리는 함수를 추가해야 될 것 같네요~~^^* 그림 그리는 거북이 납시오~~^^*
* 매번 같은 자리에서 출발할 수 있도록 좌표체계를 재설정하는 함수 resetMatrix()를 사용해 보겠습니다~^^*
* 선이 그려지면, 그 선의 끝점이 시작점이 될 수 있도록 상대좌표체계를 변환하기 위해 함수 translate()를 사용하겠습니다~^^*
var len = 100;
var angle;
function turtle() {
background(52);
resetMatrix();
//함수 turtle()이 호출될 때마다 좌표체계를 원래대로 복원하겠습니다~^^*
translate(width / 2, height);
//나무기둥을 x축 가운데 y축 맨 아래에 그리기 위해 (200, 400)이 (0,0)이 되도록 좌표체계를 바꾸겠습니다~^^*
stroke(255, 100);
//나뭇가지들이 엄청 많아서 잘 보이게 하기 위해 불투명도를 낮추겠습니다~^^*
angle = radians(25);
//회전각은 25도로 설정하겠습니다~^^*
for(var i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
if(current == "F") {
line(0,0,0,-len);
//원점에서 수직으로 len 길이만큼 떨어진 지점까지 선으로 잇겠습니다~^^*
translate(0, -len);
//선의 끝점(0, -len)이 다음 가지의 시작점(0,0)이 될 수 있도록 좌표체계를 바꾸겠습니다~~^^*
} else if (current == "+") {
rotate(angle);
//왼쪽으로 25도 회전합니다~
} else if (current == "-") {
rotate(-angle);
//오른쪽으로 25도 회전합니다~
} else if (current == "[") {
push();
//현재 위치와 각도를 저장하고 push()작동합니다~
} else if (current == "]") {
pop();
//pop()작동하고 저장되어 있던 기존의 위치와 각도로 돌아옵니다~
}
}
}
이제 함수 setup()에서 맨 처음의 나무 기둥을 그려보겠습니다.
*캔버스를 생성하겠습니다~^^*
*axiom이 생성되면 함수 turtle()을 호출하겠습니다~^^*
function setup(){
createCanvas(400,400);
background(52);
createP(axiom);
//나무 기둥을 생성합니다~
turtle();
//나무 기둥을 그립니다~
var button = createButton("generate");
button.mousePressed(generate);
}
함수 generate()에서 다음 세대 나뭇가지들을 그려보겠습니다.
* [generate] 버튼이 눌려질 때 마다 나뭇가지 길이를 줄여서 나무 전체가 화면에 다 들어올 수 있도록 조정하겠습니다.
*다음 세대가 생성되면~ 함수 turtle()을 호출하여 그림으로 표현하겠습니다~^^*
function generate() {
len *= 0.5;
//가지 길이를 점차 줄이겠습니다~
.
.
.
sentence = nextSentence;
createP(sentence);
//새로운 세대 나뭇가지를 생성합니다~
turtle();
//새로운 세대 나뭇가지를 그립니다~
}
네~^^* 자동 무한 반복 함수인 draw()를 사용하지 않고~~^^* 그림을 그려야 할 때 마다 함수 turtle()을 호출하는 시스템을 만들어 보았습니다~^^*
큰 흐름을 정리해 보면~~
(1) 맨처음 setup()에서 turtle()을 호출하여 첫 나무 기둥을 그리고~~^^*
(2) [generate] 버튼이 눌려질 때마다 generate()가 새 세대를 생성한 후 turtle()을 호출하여 나뭇가지들을 그리고~~^^*
(3) turtle()이 호출될 때마다 원래의 위치좌표로 Matrix가 reset되고~^^*
(4) 나무 기둥이 그려질 시작점과 나뭇가지의 시작점이 원점이 되도록 위치좌표가 translate됩니다~^^*
그럼 이제 우리 전체 코드를 함께 살펴 볼까요~^^* 주석은 생략하도록 할게요~^^*
var axiom = "F";
var sentence = axiom;
var rules = [];
var len = 100;
var angle;
rules[0] = {
a: "F",
b: "FF+[+F-F-F]-[-F+F+F]"
}
function turtle() {
background(52);
resetMatrix();
translate(width / 2, height);
stroke(255, 100);
angle = radians(25);
for(var i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
if(current == "F") {
line(0,0,0,-len);
translate(0, -len);
} else if (current == "+") {
rotate(angle);
} else if (current == "-") {
rotate(-angle);
} else if (current == "[") {
push();
} else if (current == "]") {
pop();
}
}
}
function generate() {
len *= 0.5;
var nextSentence = "";
for (let i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
for ( let j = 0; j < rules.length; j++) {
var found = false;
if ( current == rules[j].a ) {
found = true;
nextSentence += rules[j].b;
break;
}
}
if(!found) {
nextSentence += current;
}
}
sentence = nextSentence;
createP(sentence);
turtle();
}
function setup(){
createCanvas(400,400);
background(52);
createP(axiom);
turtle();
var button = createButton("generate");
button.mousePressed(generate);
}
[generate] 버튼을 누르며 나무의 성장과정을 지켜 볼까요~^^* 점점 커지는 나무를 나뭇가지 길이를 줄여 화폭에 잘 담아내고 있나요?
오늘 저와 함께 L-System Fractal Tree (Plant) 를 완성해 주셔서 감사합니다~^^*
아침마다 지구 반대편에서 우리의 용이 물어다 준 태양 덕분에 우리의 L-System Fractal Tree (Plant)가 쑥쑥 잘 자라고 있는 것 같아요~~^^*
그렇다면~~!!!
네~~^^*
내일 우리 또 만나서~~^^*
드래곤 그리기에 도전해 볼까요~~^^*
네~~^^* 코딩공부 새로운 도전 우리 또 함께 하면 좋겠어요~~^^*
어린이들의 최고의 슈퍼 스타~~ 드래곤을 그려 보는 새로운 도전!
오늘도 점심 맛있게 드시고요! 멋진 하루 보내시고요!
내일 우리 또 만나요~~^^*
네~~!! 꿈은 이루어 집니다~~!!
댓글 남기기