Subscribed unsubscribe Subscribe Subscribe

森林火災のシミュレーション 1, drawCell()

ライフ・ゲームのときと同じ手順でスクリプトを作る。

森林を等間隔に分割し、樹木の部分を緑色、空き地を茶色、火災発生箇所を赤色で表現する。

シナリオ(見方はライフ・ゲームのときと同じ):
f:id:ti-nspire:20160104151550j:plain
(下掲参考文献の図 11.24。図中の「近傍にある発火セルの合計数」は、注目セルとムーア近傍と合わせて 9 つのセルを対象としている。)



まずは行列の要素に応じてセルの色を塗り分けてみる。
f:id:ti-nspire:20160104163950j:plain

local color = {0x8B4513, -- 空き地(茶)
               0x00CD66, -- 樹木(緑)
               0xFFFF00, -- 発火準備(黄)
               0xFFFF00, -- 発火準備(黄)
               0xFFFF00, -- 発火準備(黄)
               0xFF0000, -- 発火(赤)
               0xFF0000, -- 発火(赤)
               0xFF0000, -- 発火(赤)
               0xFF0000, -- 発火(赤)
               0xAAAAAA} -- 木炭(灰)
local sideLen = 10
local mat = var.recall("mat")
function on.paint(gc)
   for r = 1, #mat do 
      for c = 1, #mat[1] do
         if mat[r][c] ~= nil then
            drawCell(c, r, sideLen, color[mat[r][c] + 1], gc) -- 行列の要素の値に応じて色を塗り分ける
            ---[[
            gc:setColorRGB(0,0,0)
            gc:setFont("sansserif", "r", 7)
            gc:drawString(mat[r][c], (c - 1) * sideLen, (r - 1) * sideLen, "top")
            --]]
         end
      end
   end
end
function drawCell(c, r, sideLen, color, gc)
   gc:setColorRGB(color)
   gc:fillRect((c - 1) * sideLen, (r - 1) * sideLen, sideLen, sideLen)
end


参考:

新 Excelコンピュータシミュレーション -数学モデルを作って楽しく学ぼう-

新 Excelコンピュータシミュレーション -数学モデルを作って楽しく学ぼう-

p.167-189

Remove all ads