花火を打ち上げてみた(人工無能その2)

KASAです

前回のボットは文章でしたが、今回は絵?です。

最近はAIに「○○の絵を××風に」っていうとちゃんと要望通りに書いてくれるものが幾つも発表されていて驚いています。

タッチや構図をどうやって学習させるのか興味がありますね。

 

 

さて、絵についてはPythonを使ってなら画像を水彩画風とかポップな感じに補正とかして遊んだことがあるのですが、このブログでは、基本的には見てる方が手軽に試せることをモットーとしていますんで(誰か知っているのかw)

Pythonは諦め、Excelで何かできないか考えました。

Pythonでやった内容をExcelで実装しようと考えたのですが結構めんどくさい。

Pythonは繰り返し文や配列演算に相当する処理がめっちゃ強力で通常十数行くらい必要な処理を1行で書けたりしますし、OpenCVを使えばいろんな画像フィルタが用意されていて数十行で立派なプログラムが作れます。

頑張ればVBAでもOpenCVを使えるようですので気が向いたらやってみたいと思います。

色々試してみましたが、なかなか面白いものができないので「花火?」でも書いてみることにしました。

何故「花火」かというととっても乱数を使いやすいからです。

AIチックにしたいとなると同じことを繰り返さないように考える必要がありますが、その辺を一番簡単にやってくれるのが乱数です。

文章の際もRnd関数のおかげで名()文が生まれましたねw。

花火はどれも似ていますが、同じものは有りません。

その辺を乱数で表現したいと思います。

今回の花火は計算が面倒なので丸ではなく四角いですw

その辺はご愛敬ということで

シートのマスを正方形になるよう幅を調整します。(Excel方眼紙ってやつです)

開発タブの挿入から「ボタン」を選びシートの左上に大きめに(ココ重要)貼り付けます。

そのボタンのアクションとして以下の処理を書き込み(貼り付け)ましょう。(上の5行もお忘れなく)

#If Win64 Then
    Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
#End If

Sub ボタン1_Click()

Dim STP_S As Integer
Dim ON_OFF As Integer
Dim STP As Integer
Dim YP As Integer
Dim XP As Integer
Dim SZ As Integer
Dim S As Integer
Dim R As Integer
Dim G As Integer
Dim B As Integer

Dim MAX_SZ As Integer
Dim TOP_Y As Integer
Dim LFT_X As Integer

MAX_SZ = Cells(1, 1)
TOP_Y = Cells(1, 2)
LFT_X = Cells(1, 3)

If MAX_SZ <> 0 Then
‘前回の花火を消します
    For SZ = 1 To MAX_SZ
      YP = TOP_Y – SZ
      XP = LFT_X – SZ
      If YP <= 0 Then
        YP = 1
      End If
      If XP <= 0 Then
        XP = 1
      End If

      For S = 0 To SZ * 2
        Cells(YP + S, XP).Interior.Color = RGB(0, 0, 0)
        Cells(YP + S, XP + SZ * 2).Interior.Color = RGB(0, 0, 0)

        Cells(YP, XP + S).Interior.Color = RGB(0, 0, 0)
        Cells(YP + SZ * 2, XP + S).Interior.Color = RGB(0, 0, 5)
      Next S

    Next SZ
Else
    ‘夜にします
    For Y = 1 To 128
      For X = 1 To 128
        Cells(Y, X).Interior.Color = RGB(0, 0, 0)
      Next X
    Next Y
End If

‘ここで花火の特徴(形)を決めます
MAX_SZ = Rnd() * 30
TOP_Y = Rnd() * 50 + MAX_SZ
LFT_X = Rnd() * 50 + MAX_SZ
STP_S = Rnd() * 10
Cells(1, 1) = MAX_SZ
Cells(1, 2) = TOP_Y
Cells(1, 3) = LFT_X

ON_OFF = MAX_SZ

‘打ち上げ中

For YP = 120 To TOP_Y Step -5
    ‘1点の色を決めます
    R = Rnd() * 250
    G = Rnd() * 250
    B = Rnd() * 250
    Cells(YP, LFT_X).Interior.Color = RGB(R, G, B)
    Sleep (200)
    Cells(YP, LFT_X).Interior.Color = RGB(0, 0, 0)

Next YP

‘花火本体
For SZ = 1 To MAX_SZ
    YP = TOP_Y – SZ
    XP = LFT_X – SZ

    If Rnd() * MAX_SZ > SZ Then
      STP = STP_S
    Else
      STP = 0
    End If

    For S = 0 To SZ * 2
      If Rnd() * ON_OFF – STP > SZ Then
        ‘1点の色を決めます
        R = Rnd() * 250
        G = Rnd() * 250
        B = Rnd() * 250
        Cells(YP + S, XP).Interior.Color = RGB(R, G, B)
      End If
      If Rnd() * ON_OFF – STP > SZ Then
        ‘1点の色を決めます
        R = Rnd() * 250
        G = Rnd() * 250
        B = Rnd() * 250
        Cells(YP + S, XP + SZ * 2).Interior.Color = RGB(R, G, B)
      End If

      If Rnd() * ON_OFF – STP > SZ Then
        ‘1点の色を決めます
        R = Rnd() * 250
        G = Rnd() * 250
        B = Rnd() * 250
        Cells(YP, XP + S).Interior.Color = RGB(R, G, B)
      End If
      If Rnd() * ON_OFF – STP > SZ Then
        ‘1点の色を決めます
        R = Rnd() * 250
        G = Rnd() * 250
        B = Rnd() * 250
        Cells(YP + SZ * 2, XP + S).Interior.Color = RGB(R, G, B)
      End If
    Next S

Next SZ

End Sub

 

ボタンのテキストを「ボタン1」ではなく「発射」とかにすると雰囲気が出るかもしれません

完成したらシートの表示倍率を30%くらいにしてボタンを押してください。

ボタンを大きくする理由はここで30%にしても押せるサイズが必要だからです。

そうするとシートの一部(左上)に夜が訪れ1発の四角い花火が上がったと思います。

(たまにスカもありますのでw)

もう一回ボタンを押すと見えていた花火が消えてもう1発花火が上がります。

「これのどこが人口無能(AI)やねん」と突っ込まれそうですが、この程度でAIと名乗っているものは世の中に五万とあります。

今回の乱数を使って変化させている部分を条件と考えて、特定の値を入力すればある形の花火を書くことができます。

うーんこじつけくさいですね

まあ深いことは置いといて、夏の終わりにあなただけの花火をExcelで上げてください。

玉屋~、鍵屋~

 

 

弊社では人材を募集しております
「俺ならこんな四角じゃなく丸いのを上げてやるぜ」という気合の入ったあなたのご応募お待ちしてます。


▼この記事がいいね!と思ったらブックマークお願いします
このエントリーをはてなブックマークに追加