日本語プログラミング言語Mind９βのキャンバスで図形移動してみた

# はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン９βをご提供いただいたので、新機能であるキャンバスのグラフィックス機能についてなにかやってみることにしました。

[前の記事](https://qiita.com/mylifewithviolin/items/565e61987a0fbaaa6abe)では１４０の小さな円を使って雪っぽいグラフィックを試してみました。@killyさんのコメントによるとMind９βのキャンバス上の図形は移動させた方がはやいかもとのお話をいただきましたのでさっそく書き換えてみました。

# 解説

### 「雪片」の構造体　
「雪片」の構造体は下記のように記述しました。今回は	図形ＩＤを構造体のメンバとしたところがポイントです。

```mind:snowfall2.src
雪の数は　定数　７。

雪片は　構造体
        円ＩＤは	図形ＩＤ
        Y座標は　変数
        速度は　 変数
    雪片本体は　円ＩＤと　Y座標と　速度
    全体は　雪の数の　雪片本体。
```
これを最初に乱数を使って下記のように初期化します。雪片初期化値を返すは前回と同じで、乱数によって生成された座標を返していますが、その値を使って図形IDを初期設定してしまいます。Y座標と速度は端に来た場合の判定用に構造体メンバとしても保持します。

```mind:snowfall2.src
全ての雪片を初期化するとは
        Xは　変数
        Rは　変数
    20170316を　乱数種値に　入れ
    雪の数で　回数指定し
        キャンパス幅で　雪片初期化値を返し
        速度（回数）に　入れ
        Rに　入れ
        Y座標（回数）に　入れ
        xに　入れ
        キャンバスと　Xと Y座標（回数）と Rで　円のＩＤを取得し　円ＩＤ（回数）に　入れ
    繰り返す。
```
乱数は引き続きQiitaユーザー@t-tkd3aさんの下記の記事のソースを利用させていただいております。Mind9の「評価した値」によるTcl乱数を使ってもよいのですが、ここはひとまず同条件ということで。

https://qiita.com/t-tkd3a/items/460b6f42ea69051f1130

そして「雪の描く位置を更新する」では、今回、座標を変更するだけでなく図形IDをここで移動させています。ここがキモ。

```mind:snowfall2.src
雪の描く位置を更新するとは
        Xは　変数
        Yは　変数
        Rは　変数

    雪の数で　回数指定し
        Y座標（回数）に　速度（回数）を　加え　Yに　入れる
        Yが　キャンパス高　以下
        ならば
            Yを　Y座標（回数）に　入れる
            雪片を少し揺らし　xに　入れる
            円ＩＤ（回数）を　xと　速度（回数）で　図形を移動し
        さもなければ
            Y座標（回数）を　Yに　入れる
            キャンパス幅で　雪片初期化値を返し
            速度（回数）に　入れ
            Rに　入れ
            Y座標（回数）に　入れ
            xに　入れる
            円ＩＤ（回数）を　xと　Yで　図形を移動し
        つぎへ
    繰り返す。
```

通常の描画は最初だけとなります。

```mind:snowfall2.src
雪片を描くとは
		＿回数は　変数

    ＿回数に　入れる
    白色で	円ＩＤ（＿回数）に　満たす色を設定し
	円ＩＤ（＿回数）を　描画すること。

雪の降る様子を描くとは
    雪の数で　回数指定し
        回数で　雪片を描く
    繰り返す。

```

### メイン処理の構造
こうして、メインは下記のようになります。今回は引き続き「遅延」を使ってループさせています。キャンバスクリアは不要となりました。これによりキャンバスクリアしないことによる累積的に図形IDが増えていくためと推定される描画遅延は解消されるものと推定されます。

```mind:snowfall2.src
キャンバスは　ＩＤ。
キャンパス幅は　定数　８００。
キャンパス高は　定数　４００。

メインは
    メインウィンドウと　キャンパス幅と　キャンパス高と　黒色で
　　　　　　　　　　　　　　キャンバスを立て　キャンバスに　入れ

    全ての雪片を初期化する

    雪の降る様子を描く
    ここから
        １０ミリ秒で　　　遅延
        雪の描く位置を更新する
    繰り返す。
```

遅延時間も前回より１０倍確保しています。

# 実行イメージ

実行時の様子は下記の感じです。だいぶするする感がでてきましたね:relaxed:

![mind9betatcl3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/54dd23b4-ea8a-6358-019c-eefa0164fef7.gif)

ウィンドウの下端に到達したときに座標をリセットすることがまだできていません。GIFアニメの場合ループしているように見えるのは単にGIF再生がループしているからです。

構造体に格納できる図形の数が最大７に制限されているような印象がありますが、これはもしかしたらβ由来の制限かもしれません。このため、元の小さな雪ですと動きがわかりにくいため、少し大きくしています。


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕４０周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます！

## 参考情報
<details><summary>ソースコード全文</summary>

```mind:snowfall2.src
"random.src"を　コンパイル。

キャンバスは　ＩＤ。
キャンパス幅は　定数　８００。
キャンパス高は　定数　４００。
雪の数は　定数　７。

雪片は　構造体
        円ＩＤは	図形ＩＤ
        Y座標は　変数
        速度は　変数
    雪片本体は　円ＩＤと　Y座標と　速度
    全体は　雪の数の　雪片本体。

雪片初期化値を返すとは　　（変数　→　変数、変数、変数、変数）
        Xは　小数変数
        Yは　小数変数
        Rは　小数変数
        Sは　小数変数
        キャンバスサイズ幅は　変数
    キャンバスサイズ幅に　入れ
    キャンバスサイズ幅に　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Xに　入れる
    50と　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Yに　入れる
    20と　小数化し　一様乱数()を　f掛けて   Rに　入れる
    2と　小数化し　ガウス分布乱数(0.8,0.3)を　f掛けて   Sに　入れる
    Sが 1.0より　ｆ以下　
    ならば 
        1.0を Sに　入れ
    つぎに
    Xを　整数化
    Yを　整数化
    Rを　整数化
    Sを　整数化。

雪片を描くとは
		＿回数は　変数

    ＿回数に　入れる
    白色で	円ＩＤ（＿回数）に　満たす色を設定し
	円ＩＤ（＿回数）を　描画すること。

全ての雪片を初期化するとは
        Xは　変数
        Rは　変数
    20170316を　乱数種値に　入れ
    雪の数で　回数指定し
        キャンパス幅で　雪片初期化値を返し
        速度（回数）に　入れ
        Rに　入れ
        Y座標（回数）に　入れ
        xに　入れ
        キャンバスと　Xと Y座標（回数）と Rで　円のＩＤを取得し　円ＩＤ（回数）に　入れ
    繰り返す。

雪片を少し揺らすとは
        Xは　小数変数
    -2を　小数化し　一様乱数()を　f掛けて   Xに　入れ
    Xを　整数化。

雪の描く位置を更新するとは
        Xは　変数
        Yは　変数
        Rは　変数

    雪の数で　回数指定し
        Y座標（回数）に　速度（回数）を　加え　Yに　入れる
        Yが　キャンパス高　以下
        ならば
            Yを　Y座標（回数）に　入れる
            雪片を少し揺らし　xに　入れる
            円ＩＤ（回数）を　xと　速度（回数）で　図形を移動し
        さもなければ
            Y座標（回数）を　Yに　入れる
            キャンパス幅で　雪片初期化値を返し
            速度（回数）に　入れ
            Rに　入れ
            Y座標（回数）に　入れ
            xに　入れる
            円ＩＤ（回数）を　xと　Yで　図形を移動し
        つぎへ
    繰り返す。

雪の降る様子を描くとは
    雪の数で　回数指定し
        回数で　雪片を描く
    繰り返す。

メインは
    メインウィンドウと　キャンパス幅と　キャンパス高と　黒色で
　　　　　　　　　　　　　　キャンバスを立て　キャンバスに　入れ

    全ての雪片を初期化する

    雪の降る様子を描く
    ここから
        １０ミリ秒で　　　遅延
        雪の描く位置を更新する
    繰り返す。
```

</details>