OneHourProcessing 二日目

二日目の作品

今日作った作品はこちら

作るのにかかった時間は「57分30秒」。
コードは以下の通りです。

Pixel[][] pixel;

void setup()
{
  size(800, 450);
  pixel = new Pixel[width][height];

  for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++)
      pixel[x][y] = new Pixel(color(255));
}

void draw()
{
  if (mousePressed && mouseButton == LEFT)
    pixel[mouseX][mouseY].now_color = color(0);

  for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++)
    {
      int left  = x - 1;
      int right = x + 1;
      int up    = y - 1;
      int down  = y + 1;

      if (left == -1)
        left++;
      if (right == width)
        right--;
      if (up == -1)
        up++;
      if (down == height)
        down--;

      pixel[x][y].create(pixel[left][y], pixel[right][y], pixel[x][up], pixel[x][down]);
    }

  loadPixels();

  for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++)
      pixels[x + y * width] = pixel[x][y].update();

  updatePixels();
}

class Pixel
{
  color now_color;
  color next_color;
  
  Pixel(color default_color)
  {
    now_color = default_color;
    next_color = default_color;
  }

  /**** 周りの色を平均して次の色を決める関数 ****/

  void create(Pixel left, Pixel right, Pixel up, Pixel down)
  {
    float red   = (  red(up.now_color) +   red(down.now_color) +   red(left.now_color) +   red(right.now_color)) / 4;
    float green = (green(up.now_color) + green(down.now_color) + green(left.now_color) + green(right.now_color)) / 4;
    float blue  = ( blue(up.now_color) +  blue(down.now_color) +  blue(left.now_color) +  blue(right.now_color)) / 4;
    
    red   = (  red +   red(now_color)) / 2;
    green = (green + green(now_color)) / 2;
    blue  = ( blue +  blue(now_color)) / 2;
    
    next_color = color(red, green, blue);
  }

  /**** 色を更新する関数 ****/

  color update()
  {
    now_color = next_color;
    return now_color;
  }
}