Silverback9

#야생으로

Creative Coding 독학 제230일 2024년11월12일(화)

오늘은 어제 만들었던 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가 뿜어주는 소중한 산소 가슴 깊이 들이마시고~~^^*

남은 오전 시간도 즐겁게 보내셔요~~^^*

오늘도 점심 맛있게 드시고요~!!!

멋진 하루! 보내셔요~~!!!

우리 내일 또~~ 만나요~~^^*

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

댓글 남기기