오늘은 어제 만들었던 L-System의 Fractal Algea 프로그램을 좀더 유연하게 만들어 보겠습니다~~^^* YEAH~~^^*
다양한 규칙 여러 개를 적용할 수 있도록 개선해 보면 어떨까요~~^^*
규칙 여러 개를…..음…..?
빙고!
네~^^*
규칙을 배열 형태로 저장하도록 해 볼게요~~^^*
var rules = [];
rules[0] = {
a: "A",
b: "AB"
}
rules[1] = {
a: "B",
b: "A"
}
이제~~^^* 규칙 적용 부분을 rules[] 사용에 맞게 바꾸어 볼까요~^^*
function generate() {
var nextSentence = "";
for (let i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
for ( let j = 0; j < rules.length; j++) {
if ( current == rule[j].a ) {
nextSentence += rule[j].b;
break;
}
}
//규칙은 하나만 적용되므로, 적용이 되고 나면 바로 반복구조를 빠져나오도록 하겠습니다~^^*
sentence = nextSentence;
createP(sentence);
}
아….!
그런데요…..
적용될 규칙을 찾지 못하면 어쩌죠? 예를 들어, “a”와 “b”와 “c”와 “d”에 대한 규칙만 있는데, “z”가 sentence에 들어 있다면요…?
음…진리값…..
네…진리값을 사용해 볼까요?
어떻게 사용해 보면 좋을까요?
음…!!!
아! 좋은 생각인 것 같아요!!!
sentence에 있는 글자에 대한 규칙을~~^^*
<찾았다!>와 <못찾았다!>의 두 가지 상태로~~^^*
볼 수 있겠네요~~^^*
이 두 상태를 하나의 진리값 변수로 표현해 보면~~^^*
var found = false;
.
.
.
found = true;
// <아직 못찾은 상태>와 <이제 찾은 상태>로 표현할 수 있겠네요~~^^*
네~^^* 그럼 이번에는~~^^*
<아직 못찾았다> <이제 찾았다> 의 상태를 표현하는 진리값 변수 found를 사용하여~~^^* 규칙 적용 부분을 한 번 더! 개선해 보겠습니다~~^^*
function generate() {
var nextSentence = "";
for (let i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
var found = false;
for ( let j = 0; j < rules.length; j++) {
if ( current == rule[j].a ) {
found = true;
nextSentence += rule[j].b;
break;
}
}
//적용될 규칙이 있으면, 상태 진리값 변수 found에 true를 저장합니다.
//규칙은 하나만 적용되므로, 적용이 되고 나면 바로 반복 구조를 빠져나오도록 하겠습니다~^^*
if (!found) {
nextSentence += current;
}
//<not found>가 true라면~~^^* 즉, <found>가 false라면~^^*
//current에 대해 알맞은 규칙을 발견하지 못했다면~^^*
//current를, 규칙적용 없이, 그대로 nextSentence에 더합니다.
sentence = nextSentence;
createP(sentence);
}
그럼 이제 전체 코드를 함께 살펴 볼까요~^^* 규칙 적용이 안되는 경우를 테스트하기 위해 “C”를 첨가해 보겠습니다~^^*
var axiom = "A";
var sentence = axiom;
var rules = [];
//다양한 규칙을 유연하게 담을 수 있는 배열 구조를 준비하겠습니다~^^*
rules[0] = {
a: "A",
b: "ABC"
}
//"A"는 "ABC"로 바뀌는 규칙[0]을 준비합니다~^^*
rules[1] = {
a: "B",
b: "A"
}
//"B"는 "A"로 바뀌는 규칙[1]을 준비합니다~^^*
function generate() {
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;
//규칙 발견 상태를 나타내는 진리값 변수 found에 false를 저장합니다~
if ( current == rules[j].a ) {
found = true;
//규칙이 발견되었으니, found에 true를 저장하겠습니다~
nextSentence += rules[j].b;
//규칙을 반영하여 nextSentence에 더하겠습니다~
break;
}
}
if(!found) {
nextSentence += current;
}
//규칙이 발견되지 않은 경우, 규칙 적용 없이 원래 그대로의 current를 nextSentence에 더하겠습니다~
}
sentence = nextSentence;
createP(sentence);
}
function setup(){
noCanvas();
createP(axiom);
var button = createButton("generate");
button.mousePressed(generate);
}
테스트를 해보도록 할까요~^^* C는 적용되는 규칙이 없어서 계속 C로 남는 모습이 보이시나요~^^*
오늘 저와 함께 Fractal Algea 프랙탈 조류식물 프로그램이 좀더 유연해 질 수 있도록 개선해 주셔서 감사합니다~~^^*
내일은 우리 본격적으로 algea 그림을 그려 볼까요~~^^* YEAH~~^^*
지구 산소의 75%를 거대 조류(25%)와 미세 조류(50%)가 뿜어 준다는데요~~^^*
우리의 algea가 뿜어주는 소중한 산소 가슴 깊이 들이마시고~~^^*
남은 오전 시간도 즐겁게 보내셔요~~^^*
오늘도 점심 맛있게 드시고요~!!!
멋진 하루! 보내셔요~~!!!
우리 내일 또~~ 만나요~~^^*
네~!! 꿈은 이루어 집니다~~!!
댓글 남기기