イラストロジックをやりたくて・・・

イラストロジックをやりたくて・・・正確には自動で解く部分がつくりたくて
その下準備としてイラストロジックを作ります。

##画面の用意
まぁまずは画面がないとねということで・・・。
サイズが変わっても大丈夫なように作ります。
真ん中の塗るところはGridLayoutで並べます。
<img width="300" alt="スクリーンショット 2018-03-05 16.41.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/5b6c65ad-9c2f-af9a-2f1d-268f3ecf6237.png"><img width="300" alt="スクリーンショット 2018-03-05 16.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/6a255666-28a4-b5fd-4964-7e1dcd6330af.png">


縦横のサイズによってここの横幅を変えることで自動でサイズにあった形になります

横と縦の数字
横はVerticalLayout  この幅を数により広げます
それの子に HorizontalLayoutで右寄せにしてその子にボタンを作成
これが一個一個の数字。子にテキストをつけてそこに数字が表示されるようにします。
クリックしたら数字に×をつけたりお好みで。
縦も同じようにVerticalとHorizontalを逆にして配置

あとはロード時に必要な数複製して作成完了

##自動で塗ったら数字が入るように
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e75bfcc6-5e7e-85e8-b74b-1619854fb964.gif" width="300"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/7f525a07-397a-0a85-6765-ff797e31d3d0.gif" width="300">
カラーも考慮するので一つのラインの数字はこんな感じで・・・。

```cs
IllustLineは下記2つのパラメータを持つクラス
    public int count;
    public int drawColor;


###横一列の数の計算
List<IllustLine> line = new List<IllustLine>();
int count = 0;          // 繋がってる数
int dc = 0;             // 塗る色
for (int x = 0; x < width; x++)
{
    // 繋がってる
    if (セルが塗られている状態 && セルの色 == dc)
    {
        count++;
    }
    // 色が変わってる
    else if (セルが塗られている状態 && セルの色 != dc)
    {
        if (dc != 0 && count != 0)
        {
            // リストに数追加
            line.Add(new IllustLine(count, dc));
        }
        count = 1;
    }
    // 繋がってない
    else
    {
        if (count != 0)
        {
            // リストに数追加
            line.Add(new IllustLine(count, dc));
        }
        count = 0;
    }
}
if (count != 0)
{
    // リストに数追加
    line.Add(new IllustLine(count, dc));
}
```

##自分で問題を作るのがめんどくさいので画像から自動で作る
この画像を・・・問題にして見ます。
<img width="200" alt="スクリーンショット 2018-03-04 14.55.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/bccac8ae-bb11-ccba-9bdb-fd507808dc62.png">

概念的には下記のフォトモザイクの考え方です。
<a href="https://qiita.com/ayumegu/items/0ffdad96a43a079613cc">フォトモザイクやりたいな〜その１<a/>
<a href="https://qiita.com/ayumegu/items/6776e79fa55c8a8ad69f">フォトモザイクやりたいな〜その2<a/>

簡単にいえば、
作りたいピクロスのサイズを設定
そのサイズに画像を小さくするために、１ピクセルあたりどれくらいのサイズになるか計算
1ピクセルの平均色を出す
カラーの近い色に色を設定
これをピクセルにセットします

###平均色の計算
```cs
// 1ピクセル分の平均色を計算
    private Color GetAvarageColor(Texture2D tex, int startX, int startY, int cellWidth, int cellHeight)
    {
        float rrr = 0;
        float ggg = 0;
        float bbb = 0;

        for (int y = startY; y < startY + cellHeight; y++)
        {
            for (int x = startX; x < startX + cellWidth; x++)
            {
                Color c = tex.GetPixel(x, y);
                rrr += c.r;
                ggg += c.g;
                bbb += c.b;
            }
        }

        rrr /= (float)cellWidth * (float)cellHeight;
        ggg /= (float)cellWidth * (float)cellHeight;
        bbb /= (float)cellWidth * (float)cellHeight;

        return new Color(rrr, ggg, bbb, 1);
    }
```

###色の差の違いの計算
```cs
// 色差を計算。
float diff = Mathf.Pow(baseImgCellColor.r - imgColor.r, 2) + Mathf.Pow(baseImgCellColor.g - imgColor.g, 2) + Mathf.Pow(baseImgCellColor.b - imgColor.b, 2);
```
一つのピクセルごとにカラーパレットと色差を比較。
一番差が低い色を設定するが、一定以上差がある場合はその色をパレットに追加する


試しに30サイズ、色をサクラクレパスみたいに白を抜いた11色にしたところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/2999a33d-a899-695b-cef1-62f4a7ff0209.png" width="300">

黄緑を薄い茶色にして見ました
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/eb000ead-e410-ecab-ff4a-03c73a075cc0.png" width="300">

同じ色で100pxにしました
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/24d2a379-a117-9abc-8ee4-e845b5d1b072.png" width="300">
このサイズだとほぼ絵は再現される。あとは色

##色は事前に指定じゃなくて画像から色を取るように修正
画像の平均値が既存のパレットから一定以上離れていたら色を追加するように処理を修正したところ。
だいぶ元の絵に近い色になった。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/cf09a6ef-751b-2fc5-cb3d-b0559aeae285.png" width="300">

元絵がドット絵に近いような色の少ないものならかなり色もバッチリ
<img width="150" alt="スクリーンショット 2018-03-05 17.18.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/bc9df617-53ac-6c39-9cc8-60a59b2c3d1b.png">

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/37349078-7e22-c1f9-e964-c2e24f128ffc.png" width="300"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/b47159ef-f5f3-7e0d-444a-3a05e93205ef.png" width="300">

どれくらいの色の差で新しく色を追加するかの設定の調整がひつようだけれど・・。
ここまでが下準備。
ここから自動で解くところがやりたいところなんだけれど・・・。
時間があるときにまったりやってみよう。