Spde を使う 3

適当にだらだらと貼っつけます。

        • -

sbt の ~run を使っていると、勝手にコンパイル・実行してくれるのはいいとして毎回ウィンドウを閉じるのがめんどくさい。

ので、しばらくしたら勝手に終了するようにしてみる。

// ...

var count = 0

def draw {
  // ...

  count += 1
  if(count > 100){ System.exit(0) }
}

というような小細工を弄してみたものの、実行されるとフォーカスがエディタから描画ウィンドウに移ってしまってこれはこれでどうにも微妙。おまえは今まで……いや今日叩いた Ctrl+Tab の回数をおぼえているのか?

        • -

「二次元配列にデータを詰める」部分と「生成された二次元配列を使って描画する」部分を分けてみる。勝手がまだよく分からないのでむちゃくちゃな書き方をしてると思います。でも、ちょっと Scala っぽくなってきた。

val screenW = 400;
val screenH = 200;

val cellSize = 4;

// 縦横のセルの数
val cellNumX = screenW / cellSize
val cellNumY = screenH / cellSize

size(screenW, screenH)
frameRate(4)

var count = 0

def draw {
  fill(255)
  rect(0, 0, screenW, screenH)

  // 0 or 1 がランダムに詰まった cellNumX * cellNumY の二次元配列を生成
  var matrix = new Array[Int](cellNumX)
    .map( x => new Array[Int](cellNumY)
         .map( y => random(2).toInt )
       )

  // matrix の内容に従って描画(1ならセルを描画)
  stroke(0)
  for (yi <- 0 to cellNumY - 1){
    val y = yi * cellSize
    for (xi <- 0 to cellNumX - 1){
      val x = xi * cellSize
      if( matrix(xi)(yi) == 1){
        rect(x, y, cellSize - 2, cellSize - 2)
      }
    }
  }

  count += 1
  if(count > 10){ System.exit(0) }
}
        • -

無茶とは思いつつ強引に進める。「二次元配列にデータを詰める(データを生成する)」「生成されたデータを受け取って描画する」部分をメソッド抽出してみる。

val screenW = 400;
val screenH = 200;

val cellSize = 4;

// 縦横のセルの数
val cellNumX = screenW / cellSize
val cellNumY = screenH / cellSize

size(screenW, screenH)
frameRate(4)

var count = 0

// 0 or 1 がランダムに詰まった cellNumX * cellNumY の二次元配列を生成
def generateMatrix(): Array[Array[Int]] = {
  new Array[Int](cellNumX)
    .map( x => new Array[Int](cellNumY)
         .map( y => random(2).toInt )
       )
}

// matrix の内容に従って描画(1ならセルを描画)
def drawMatrix(matrix: Array[Array[Int]]) = {
  stroke(0)
  for (yi <- 0 to cellNumY - 1){
    val y = yi * cellSize
    for (xi <- 0 to cellNumX - 1){
      val x = xi * cellSize
      if( matrix(xi)(yi) == 1){
        rect(x, y, cellSize - 2, cellSize - 2)
      }
    }
  }
}

def draw {
  fill(255)
  rect(0, 0, screenW, screenH)

  val matrix = generateMatrix()
  drawMatrix(matrix)

  count += 1
  if(count > 10){ System.exit(0) }
}
        • -

Int じゃなくて Boolean にしてみる。

val screenW = 400;
val screenH = 200;

val cellSize = 4;

// 縦横のセルの数
val cellNumX = screenW / cellSize
val cellNumY = screenH / cellSize

size(screenW, screenH)
frameRate(4)

var count = 0

// 0 or 1 がランダムに詰まった cellNumX * cellNumY の二次元配列を生成
def generateMatrix(): Array[Array[Boolean]] = {
  new Array[Int](cellNumX)
    .map( x => new Array[Int](cellNumY)
         .map( y => random(2) > 1 )
       )
}

// matrix の内容に従って描画(1ならセルを描画)
def drawMatrix(matrix: Array[Array[Boolean]]) = {
  stroke(0)
  for (yi <- 0 to cellNumY - 1){
    val y = yi * cellSize
    for (xi <- 0 to cellNumX - 1){
      val x = xi * cellSize
      if( matrix(xi)(yi) ){
        rect(x, y, cellSize - 2, cellSize - 2)
      }
    }
  }
}

def draw {
  fill(255)
  rect(0, 0, screenW, screenH)

  val matrix = generateMatrix()
  println(matrix(0))
  drawMatrix(matrix)

  count += 1
  if(count > 10){ System.exit(0) }
}