Luaレッスン9.1「グリッド・パターンを描く」和訳

原典:

http://compasstech.com.au/TNS_Authoring/Scripting/script_tut9.html

レッスン9.1「グリッド・パターンを描く」

nの現在の値に対応した正方グリッドをdrawLineで描くことから始めます。しかし先に、デザインおよびレイアウトについて検討しましょう! グリッドはページの中央に配置するものとします。その方法はわかりますね。グリッドの周囲に空白を設けて、グリッド全体が常に表示されるようにすばさらに良いでしょう。そこで、ページの幅と高さとをnの値で割ることにします(実際は、周囲に空白を設けるのでnよりも少し大きな値で割ります)。nの値を変化させるスライダーも必要です(ほかのスライダーもあとで追加します)。ページを分割し、一方をGeometryウィンドウにし、そこにスライダーを追加します。もう一方をメイン・ウィンドウにします。

下に示したコードをよく見てください。drawArray函数を定義していますね。この函数は、「nの現在の値」「始点のx座標」「始点のy座標」「1マスの幅」「1マスの高さ」という5つの引数を必要とする函数です。

drawLine函数は、始点、終点それぞれのxy座標を引数として必要とする函数です。変数mは横線を描くのに使用します。もう一つの変数kは縦線を描くのに使用します。もう一度コードをよく見て、その機能を確認してください。

函数の定義が済んだら、実際に画面に描く必要があります。必要な変数は、on.paint函数の内部で定義することにします。ウィンドウの幅と高さとを定義し、nの現在の値を呼び出し、nの現在の値を使って、始点のxy座標と、1マスの幅および高さとを計算します。1マスの幅および高さについては、nより少し大きな値でウィンドウの寸法を割って決定します。端数が出ますので、一番小さい整数値を採用します。こうすれば、常に画面の寸法内にグリッド・パターン全体が表示されます。最後のところで、色および辺の値を設定し、定義した函数drawArrayを呼び出します。

Nspire変数nの現在の値で必要に応じて臨機応変にグリッド・パターンが描けます。 

(訳註:原文のようにループを入れ子にすると、縦線、横線が同じところに複数回引かれてしまう。問題は無いが無駄のような気がする)

local screen = platform.window

function drawArray(number, x, y, length, height, gc)

     for k = 0, number do

          for m = 0, number do

               gc:drawLine(

               x,

               y + height * m,

               x + length * number,

               y + height * m)

               gc:drawLine(

               x + length * k,

               y,

               x + length * k,

               y + height * number)

          end

     end

end

function on.paint(gc)

     w = screen:width()

     h = screen:height()

     num = var.recall("n") or 1

     xval = math.floor(w/(num+4))

     yval = math.floor(h/(num+4))

     x = w/2 - num * xval / 2

     y = h/2 - num * yval / 2

     gc:setPen("thin", "smooth")

     gc:setColorRGB(165,42,42)

     drawArray(num, x, y, xval, yval, gc)

end

---------------------------------------------------------------

(訳註)今回の実行例。原文では入れ子になっていたmループ、kループを別々のループにした。

f:id:ti-nspire:20141015102722j:plain

f:id:ti-nspire:20141015102649g:plain