Silverback9

#야생으로

Creative Coding 독학 제272일 2024년12월24일(화)

오늘은~~^^* Weighted Selection 코드 공부를 이어나가 보겠습니다~~^^*

일요일 공부하다가 좀 헷갈렸다가 colorMode()의 역할을 알게 되어 신기하기도 했었는데요~~^^*

네~^^* colorMode(RGB, 1); 작업문 덕분에, color 값 범위를 0에서 1 사이 실수 범위로 유지해도 된다는 것을 알게 되었었지요~~^^*

안될 것 같은데, 왜 작동이 잘 되는 것이지? 작동이 잘 되는 이유를 결국 찾아내어 참 신기하고 감사한 경험이었어요~^^*

그런데~~^^*

어머~~^^* 크리스마스가 1일 남았네요!!!

숫자 1은 시작을 의미한다고 하네요~~^^*

진짜 크리스마스가 시작된다는 것을 실감하는 Christmas Eve예요~~^^* 우리 Live로 Christmas Eve를 축하할까요~~^^*

크리스마스가 시작하는 날인 오늘! 크리스마스가 1일 남은 오늘!

행복한 시간을 선물받는 날~^^* 행복한 시간을 선물하는 날~^^* 감사한 마음~^^* 보람찬 마음~^^* 가득한 오늘이 될거예요~~^^* Yeah~~^^*

네~~^^* 저는 코딩공부 정리해서 곧 돌아올게요~~^^* 음악과 함께 즐거운 시간 보내고 계셔요~~^^*

class DNA {
  constructor() {

    this.genes = [];
    for (let i = 0; i < 14; i++) {
      this.genes[i] = random(0, 1);
    }
  }
  //0에서 1사이 무작위 실수를 genes[i]에 저장합니다. 

  crossover(partner) {
    let child = new DNA();


    let midpoint = floor(random(this.genes.length));
    for (let i = 0; i < this.genes.length; i++) {
   
      if (i < midpoint) {
        child.genes[i] = this.genes[i];
      
      } else {
        child.genes[i] = partner.genes[i];
      }
    }
    return child;
  }
  //0에서 genes[] 구성요소 총 갯수 사이 무작위 수를 교차 기준점으로 하여 child.genes[i]의 앞부분은 this.genes[i]의 데이터를, 뒷부분은 partner.genes[i] 데이터를 저장하여, 교차 작업을 합니다. 

  mutate(mutationRate) {
    for (let i = 0; i < this.genes.length; i++) {

      if (random(1) < mutationRate) {
        this.genes[i] = random(1);
      }
    }
  }
  //돌연변이최대확률보다 작은 수의 무작위 값이 나왔을 경우, this.genes[i]에 0에서 1 사이의 무작위 값을 저장하여 돌연변이 시킵니다. 
}
class Flower {
  constructor(dna, x, y) {
    this.rolloverOn = false; 
    this.dna = dna;
    this.x = x; 
    this.y = y;
    this.w = 70; 
    this.h = 140; 
    this.fitness = 1;
    this.boundingBox = new Rectangle(
      this.x - this.w / 2,
      this.y - this.h / 2,
      this.w,
      this.h
    );
  }
  //꽃의 dna와 화면 위치좌표와 크기, 적합성 수치, 그리고 사각형 틀 위치좌표과 크기 에 대한 값을 구성요소로 가지고 있습니다.
  //this.boundingBox는 Class Rectangle을 생성하여 저장한 변수입니다. 

  
  show() {
    let genes = this.dna.genes;
    let c = color(genes[0], genes[1], genes[2], genes[3]); // 꽃잎 색상
    let size = map(genes[4], 0, 1, 4, 24); // 꽃잎 크기
    let count = floor(map(genes[5], 0, 1, 2, 16)); // 꽃잎 갯수
    let centerColor = color(genes[6], genes[7], genes[8]); // 중심 색상
    let centerSize = map(genes[9], 0, 1, 24, 48); // 중심 크기
    let stemColor = color(genes[10], genes[11], genes[12]); // 줄기 색상
    let stemLength = map(genes[13], 0, 1, 50, 100); // 줄기 길이 

    push(); 꽃 하나를 그리기 시작합니다. 

    translate(this.x, this.y);
    // 꽃의 위치좌표를 중심으로 한 상대좌표 체계로 바꿉니다. 

    if (this.rolloverOn) fill(0, 0.25);
    else noFill();
    stroke(0);
    strokeWeight(0.5);
    rectMode(CENTER);
    rect(0, 0, this.w, this.h);
    //사각형 틀을 그립니다. 
    //마우스가 사각형 틀 내부에 있을 때 사각형을 회색으로 채웁니다. 

    translate(0, this.h / 2 - stemLength);
    //사각의 중심에서, 줄기 길이 차만큼 올라가거나 내려간 위치을 중점으로 한 상대좌표체계로 바꿉니다. 
    //줄기의 윗부분 끝점이 중점이 됩니다. 

    stroke(stemColor);
    strokeWeight(4);
    line(0, 0, 0, stemLength);
    //줄기 길이만큼 아래로 선을 그립니다. 

    noStroke();
    fill(c);
    for (let i = 0; i < count; i++) {
      let angle = map(i, 0, count, 0, TWO_PI);
      let x = size * cos(angle);
      let y = size * sin(angle);
      ellipse(x, y, size, size);
    }
    //꽃잎을 그립니다. 

    fill(centerColor);
    ellipse(0, 0, centerSize, centerSize);
    //중심을 그립니다. 

    pop(); //꽃 하나 그리기를 마무리합니다. 

    textAlign(CENTER);
    if (this.rolloverOn) fill(0);
    else fill(0.25);
    text("" + floor(this.fitness), this.x, this.y + 90);
  }
    //적합성 수치를 보여줍니다. 

 
  rollover(mx, my) {
    if (this.boundingBox.contains(mx, my)) {
      this.rolloverOn = true;
      this.fitness += 0.25;
    } else {
      this.rolloverOn = false;
    }
  //마우스가 사각형 틀 영역 안에 있을 동안 fitness 적합성 수치를 계속 증가시킵니다. 
  }

 //꽃과 사각틀의 시각적 표현, 마우스가 사각틀 안에 머물고 있는 상태 표현, 적합성 수치값 증가 및 적합성 수치값 표시 등의 일을 합니다. 
  
}
class Rectangle {
  constructor(x, y, w, h) {
    this.x = x;
    this.y = y;
    this.width = w;
    this.height = h;
  }

  contains(px, py) {
    return (
      px > this.x &&
      px < this.x + this.width &&
      py > this.y &&
      py < this.y + this.height
    );
  }
}
//this.boundingBox가 될 class Rectangle입니다. 

네~^^* 오늘은

(1) 꽃의 dna (= genotype 유전형),

(2) 꽃의 시각적 묘사 (= phenotype 표현형),

(3) 꽃을 둘러싼 상자와

(4) 그 안에 마우스가 위치할 때의 시각적 표현과 꽃의 fitness 적합성 수치 증가

에 대해 보다 상세하게 살펴 보았습니다~^^*

오늘 저와 함께 핵심 코드 내용 들여다 봐주셔서 감사합니다~^^*

핵심코드를 살펴보았으니, 프로그램 플레이도 한 번 더 해 볼까요~~^^* 좀 더 친숙한 느낌이 들 것 같아요~~^^*

우리 내일은~~^^* 이렇게 증가된 fitness 값이 다음 세대 꽃들의 전반적 특성에 어떻게 영향을 주는지 그 작용방법을 함께 살펴 볼까요~~^^*

성탄 전날은 성탄 시작이기도 해서요~^^*

많이 설레고 기쁜 것 같아요~^^*

오늘도 멋진 하루 보내시며~^^*

기쁨 선사하는 보람~^^*

기쁨 나누는 감사함~^^*

만끽하시기 바래요~^^*

그리고 우리 내일 또 만나면 좋겠어요~~^^*

네~~^^* 꿈은 이루어 집니다~~^^*

댓글 남기기