p5.js [タイルで埋める] 色塗り編

＊この記事は[p5.js [タイルで埋める] 基本編](https://qiita.com/Majogari/items/6e5a9b41445ef3d1c49b)の内容を前提にしています
##タイルに色を塗る方法
>**STEP1：タイルの座標から色を生成する**
>**STEP2：カラーリストを作成して色を呼び出す**

以下のコードをテンプレートとし、「塗り方のルール」,「カラーリスト」の部分に変更を加えていきます。

```javascript:qiita.js
//画面いっぱいにタイルを敷き詰める

//カラーリストを予めグローバル変数として設定
let colorList = [];

let tileCountX, tileCountY;
let tileWidth, tileHeight;

function setup(){
  //キャンバス設定
  createCanvas(600, 500);//600px * 500px
  //色設定
  colorMode(HSB);
  //1.タイルの枚数
  tileCountX = 20;
  tileCountY = 10;
  //2.タイルの幅
  tileWidth = width/tileCountX;
  tileHeight = height/tileCountY;
  //=== カラーリスト ===

  //ここまで
}

function draw(){
  //3.タイルの座標&描画
  for(let gridY = 0; gridY < tileCountY; gridY++){
    for(let gridX = 0; gridX < tileCountX; gridX++){
      //=== 塗り方のルール ===

      //ここまで
      let posX = gridX*tileWidth;
      let posY = gridY*tileHeight;
      rect(posX, posY, tileWidth, tileHeight);
    }
  }
}
```
##STEP1：タイルの座標から色を生成する
###例１）
まずは実際に見てみましょう。
**「塗り方のルール」**以下に、こんな感じで書いてみます。

```javascript:qiita.js
  fill(0, gridX*5, gridY*5);
```
赤のグラデーションができました。
![スクリーンショット 2020-06-25 17.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/bd67feaf-4c55-38ac-0d58-7ca57a113cd6.png)
<解説>
赤色（H = 0）に対し、彩度(S)がX座標、明度(B)がY座標に対応して変化します。右に行くほど鮮やかに、下に行くほど明るい色のタイルが生成されます。
###例２）
今度は条件式を使ってみます。

```javascript:qiita.js
if((gridX + gridY) % 2){
  fill(90);
}else{
  fill(100);
}
```
こんな感じのモザイク模様ができました。
![スクリーンショット 2020-06-25 19.09.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/d67e034a-a40b-09af-90fb-aea4bb0764bb.png)

<解説>
「X座標とY座標を足した値が、偶数なら白、奇数ならグレーで塗る」というルールを適用しています。

===

以上のように、座標の値を直接計算式や条件式に入れて色を生成することができます。
##STEP2：カラーリストを作成して色を呼び出す

例えば20×20=400枚のタイルを、ランダムに生成したグレースケール（fill(0~100)）で塗りたい時どうすればいいでしょうか。

**「塗り方のルール」**以下に「fill(random(100))」としてしまうと、**drawが呼び出される度に400枚の色がランダムに再生成**され、砂嵐のようなことになってしまいます。

このような事態を避けるには、あらかじめdraw関数の外で色を定義し、保存しておく必要があります。**「カラーリスト」**以下にこのように書いてみましょう。

```javascript:qiita.js
for(i = 0; i < 400; i++){
  colorList[i] = color(random(100));
}
```

colorList[]に、400個の色が保存されました。
「塗り方のルール」以下にこのように書いて呼び出してみます。

```javascript:qiita.js
fill(colorList[20*gridY + gridX]);
```
![スクリーンショット 2020-06-25 18.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/906a6c17-b3e8-a3db-e579-a4ed65d21457.png)
無事、400枚のグレースケールが呼び出されました。

===

最後に、二つのステップを利用した例を紹介します。

```javascript:qiita.js
//画面いっぱいにタイルを敷き詰める

let colorList = [];
let tileCountX,tileCountY;
let tileWidth, tileHeight;

function setup(){
  //キャンバス設定
  createCanvas(600, 600);
  noStroke();
  //色設定
  colorMode(HSB);

  //1.タイルの枚数
  tileCountX = 20;
  tileCountY = 20;
  //2.タイルの幅
  tileWidth = width/tileCountX;
  tileHeight = height/tileCountY;

  //=== カラーリスト ===
  for(let i = 0; i < 7; i++){
    //寒色をランダムに7種類保存
    colorList[i] = color(random(180,360),80,95);
  }
  //ここまで
}

function draw(){
  //3.タイルの座標&描画
  for(let gridY = 0; gridY < tileCountY; gridY++){
    for(let gridX = 0; gridX < tileCountX; gridX++){

      //=== 塗り方のルール ===
      //X,Y座標の積・和をそれぞれ剰余演算し、それらの和をさらに剰余演算
      //→ それぞれのタイルに0~6の数字を代表させ、modColorに代入
      let modColor = (((gridX*gridY) % 3) + ((gridY + gridX) % 5)) %  7;
      //modColorに応じた色をカラーリストから呼びだす
      fill(colorList[modColor]);
      //ここまで

      let posX = gridX*tileWidth;
      let posY = gridY*tileHeight;
      rect(posX, posY, tileWidth, tileHeight);
    }
  }
}
```
![スクリーンショット 2020-06-25 18.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/ae110525-4a58-edd8-7433-f9a12fde8f14.png)
サイケ。