読者です 読者をやめる 読者になる 読者になる

ux00ff

ビールとプログラミングと

OpenProcessingで公開されている「Amoeba」の移植

公式サンプルのflockingに続けて、openprocessing.orgに公開されている「Amoeba」をScalaで移植してみることにします。OpenProcessingの各作品のページでは実行結果のほか、コードも公開されているので写経には最適です。

www.openprocessing.org

これはそんなにコードが大きくないので深く考えずさくっと書きました。単純移植ですね。

import java.lang.Math._
import processing.core.PApplet
import processing.core.PConstants._

class App extends PApplet {
  val N = 256
  val MIN_RAD = 50
  val MAX_RAD = 600
  val NF_ANGLE = 0.01f
  val NF_TIME = 0.005f

  override def settings(): Unit = {
    size(800, 800, JAVA2D)
  }

  override def setup(): Unit = {
    background(255)
    noFill()
    stroke(0, 15)
  }

  override def draw(): Unit = {
    translate(width / 2, height / 2)
    beginShape()
    for (i <- 0 to N) {
      val ang = PApplet.map(i, 0, N, 0, TWO_PI)
      val rad = PApplet.map(noise(i * NF_ANGLE, frameCount * NF_TIME), 0, 1, MIN_RAD, MAX_RAD)
      val x = rad * cos(ang)
      val y = rad * sin(ang)
      curveVertex(x.toFloat, y.toFloat)
    }
    endShape(CLOSE)
  }
}

ひっかかったのは使われているmapPAppletのスタティックメソッドなのに最初気がつかなかったくらい。それをいえば、sinとかcosの算術関数も元のコードではたぶん使われているのは PApplet のメソッドの方なのでしょうが、ここでは java.lang.Math の方を利用しています。まあ結果は変わらないから、いいかな・・・。

実行結果はこんな雰囲気。

f:id:ux00ff:20170210122720p:plain

こういうワイヤーフレームがうねうね動くのをみてると「っぽいなぁ」と思います。