水流シミュレーション改良

STATUS: 故障中

 水流シミュレーションの水の流れを改良しました。
 また、セーブ・ロードなど追加してみました。

 →ダウンロード (Windows用)

【マニュアル書いてみました】
----------------------------------------------
「水流シミュレーション」(testWater) マニュアル

■ プログラム概要

 水が流れ落ちる様子を再現したプログラムです。
 いんちきながら水圧を考慮しているので、(上方向を含む)曲がりくねったパイプにも水が通ります。

 もともとはゲームで利用しようと思って作ったテストプログラムでしたが、インチキなアルゴリズムの割にはそれっぽい動きをするので、いろいろユーザーが介入できる機能を追加してみました。

■ 動作環境

        Microsoft Windows 95/98/NT40/2000/XP
        ※ Windows2000で動作確認

        必要DLL : mfc42.dll,msvcrt.dll (2000以降では標準)

        ※ 以下のURLからダウンロードできます。
        http://www.dokokano.com/ftlabo/programs/mfc42.lzh

■ インストール

 testWater.exe を任意のフォルダに展開してください。
 このファイル1つで実行可能です。
 (Win9x系では、別途mfc42.dll,msvcrt.dllが必要になるかもしれません。上記URLよりダウンロードして、同じフォルダにおいてください)

 また、同梱される拡張子が「wmap」のファイルは、地形、水流状態を保存したサンプルファイルです。

・最新版
 最新版は以下のページからダウンロードできます。
 http://www.dokokano.com/ftlabo/

■ 起動方法

 testWater.exe を実行してください。

 起動時にパラメータとして wmapファイルを指定すると、そのファイルを読み込んで起動します。

■ 画面

 画面左側が、メイン表示枠(マップ)です。
 起動直後は、ランダムな地形が生成され、上部から水が流れ落ちます。

 画面、右下にステータスが表示されます。
・COUNT
 シミュレーション開始からのカウント
・(x,y)=水圧
 マウスをメイン表示枠上に移動すると、その座標と水圧が表示されます。

■ 操作方法

・水追加
 画面上部に水を出現させます

・クリック時動作
 メイン表示枠上で、マウス(左)クリックした場合の動作を指定します
    ・穴掘り - その位置の地面を消します
    ・穴埋め - その位置に地面を配置します
    ・水撒き - その位置に水を出現させます(SHIFT併用で50倍)
    ・水抜き - その位置の水を消します

 穴掘りと穴埋めは、SHIFTキーで反転します。

・左回転、右回転
 メイン表示枠内の地面、水を回転させます。

・初期状態
 初期化ボタンを押した際の初期状態を選択できます。
    ・ランダム - 起動直後と同様の状態です。地面がランダムに配置されます。
    ・平坦 - 上下の中央に均一な地面が配置されます。
    ・無し - なにもない状態で始まります。

・初期化
 地面、水の状態を初期化します(初期状態の設定による)

・Save、Load
 地面、水の状態を保存、読み込みします。
 保存されるファイルの拡張子は「wmap」となります。
 また、「wmap」ファイルを直接ウィンドウにドロップすることでもロードできます。

■ サンプルマップ(wmapファイル)

 [Load]ボタンを押すか、ファイルをウィンドウにドロップするとロードされます。

・waterMap_下から浸水.wmap
 「ランダム」のマップの下の部分に、水撒き(SHIFT併用)で過剰に水を配置してみました。
 水がどんどん上に上ってきます。

・waterMap_井戸.wmap
 「平坦」のマップの下側に過剰に水を配置し、1本の穴を上側に向けて掘りました。水が上っていきます。

・waterMap_回転してみて.wmap
 マップ中央に複雑な形の壁があります。回転ボタンで回転させると、水が壁に沿って流れます。
 いんちきアルゴリズムの都合上、左回転のほうがそれっぽく動きます。

・waterMap_水道.wmap
 水道みたいなマップ。水圧が伝わってくると蛇口からの水量が増えます。

・waterMap_迷路.wmap
 マップを回転させてスタート地点にある水をゴールに導いてください。

 なにか面白いマップが出来たら、是非お送りください。サイトに掲載いたします。

■ (いんちき)シミュレーションについて

 マップは128x128のセルになっており、それぞれに地面の有無と水圧を状態として持っています。
 水圧は高いほうから低いほう(あるいは水がまったく無い)に移動します。
 移動方向は、下、左右、上の順で重み付けされています。
 そのため通常は下に落ちますが、下に水がすでにある場合は左右に、十分に水圧が高ければ上方向に移動します。
 通常は1ターンあたり1単位の水圧が移動しますが、水圧が高い場合、最大5単位の水圧が移動します。

・水圧について
 ここでの水圧とは実際の水とは動きが異なります。
 1セル辺りに含まれる水の量を水圧としています。
 なんとこのシミュレーションでの「水」は圧力さえかければ圧縮可能なのです。なんなんだろう。
 水圧は上にある水の量によって増えますので、通常は水深に比例します。
 水圧によって色が変わりますので、目安としてください。
 また、壁は水圧100として計算していますので、水圧が100を超えると壁に浸透します。(薄い壁は通り抜けます)

・流れの偏り(いいわけ)
 左側から処理しているので、水が左側に偏りがちです。
 一応1ターン中に右側からも処理を行うようにして補正していますが、完全ではないです。ちょっと偏ります。
 処理順番を左右交互にしたところ偏りは改善されましたが、水が左右に震えるようになってしまい見苦しいのでやめました。
 また、もうひとつバッファをもって処理順番に依存しないようにしてみたら、動きが落ちつかなくなってしまったので、もとに戻しました。

■ プログラムについて

 毎回 FillRectでセル1つ1つを塗りつぶしています。
 1ターンあたり128x128=16384セル描画しています。富豪なので。
 こんなんでまともな速度で動くのですから、最近のマシンはすごいですね。

■ 開発履歴

▽ 2004.04.08
 初期バージョン

▽ 2004.04.11
 ・水流のアルゴリズム改良
 ・左右回転機能追加
 ・状態のセーブ、ロード機能追加
 ・サンプルデータ追加

コメント