森林火災のシミュレーション 4, matNext()

ルール行列と発火セルの数とをもとに現世代行列を次世代行列に書き換える。

上から順に「lua に読み込んだ現世代行列」「lua に読み込んだ、発火セルの数」「lua から返された次世代行列」。
f:id:ti-nspire:20160110154515j:plain

-- nspire 側で用意した行列を lua に読み込む。
local mat = var.recall("mat")
local matCount = var.recall("matcount")

-- ルール行列を定義する。
local matRule = {{0,0,0,0,0,0,0,0,0},
                 {1,2,2,2,2,3,3,3,3},
                 {2,3,3,4,4,5,5,5,5},
                 {3,4,4,5,5,5,5,5,5},
                 {4,5,5,5,5,5,5,5,5},
                 {6,6,6,6,6,6,6,6,6,6},
                 {7,7,7,7,7,7,7,7,7,7},
                 {8,8,8,8,8,8,8,8,8,8},
                 {9,9,9,9,9,9,9,9,9,9},
                 {9,9,9,9,9,9,9,9,9}}

-- できた行列を確認する。
function on.paint(gc)
   local temp = matNext(mat, matCount, matRule)
   drawMat(temp , 0, 0, 15, 7, gc)
end


-- カウント行列とルール行列とに従って現世代行列を書き換える部分函数(現世代行列, カウント行列, ルール行列)
function matNext(matNow, matCount, matRule)
   -- 返すための空行列を作る。
   local matNext = newMat(#matNow, #matNow[1])

   -- 次世代行列を作る。
   for r = 1, #matNow do 
      for c = 1, #matNow[1] do
         matNext[r][c] = matRule[matNow[r][c] + 1][matCount[r][c] + 1] 
      end
   end
   
   -- 出来た次世代行列を返す。
   return matNext
end


-- 空行列函数(行数, 列数)
function newMat(rowDim, colDim)    local mat = {}    for r = 1, rowDim do    mat[r] = {}       for c = 1, colDim do          mat[r][c] = 0       end    end    return mat end 
-- 行列表示函数、(穴なし行列, 原点座標, 1 辺の長さ, フォントサイズ, gc)
function drawMat(mat, x0, y0, sideLen, fontSize, gc)    for r = 1, table.maxn(mat) do       for c = 1, table.maxn(mat[r]) do          gc:setFont("sansserif", "r", fontSize)          gc:setColorRGB(0x000000)          gc:drawString(mat[r][c], x0 + (c - 1) * sideLen, y0 + (r - 1) * sideLen, "top")       end    end end