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

ux00ff

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

文字を画像化してピクセルデータを利用する

Scala Processing

もともと文字の形状を扱いたかったのですが、まずはピクセルベースでの処理を試そうと思い、 OpenProcessing に公開されている「create ‘webby’ numbers and letters」を参考に Scala に手元で書き直してみました。

www.openprocessing.org

こういうやつです。

f:id:ux00ff:20170211114014p:plain

PFont

createFont メソッドを用いて PFont を作成するのが手っ取り早いのですが、このやり方だとシステムにあるフォントしか利用できません。

ポータブルなアプリケーションを目指す場合、.vlw ファイルを作成し、アプリケーションと一緒に配布して loadFontメソッドを用いて読み込むようにします。

Loads a .vlw formatted font into a PFont object. Create a .vlw font by selecting “Create Font…” from the Tools menu. This tool creates a texture for each alphanumeric character and then adds them as a .vlw file to the current sketch’s data folder. Because the letters are defined as textures (and not vector data) the size at which the fonts are created must be considered in relation to the size at which they are drawn.

と、あるようにvlwファイルはベクターデータだけでなく指定サイズまでのテクスチャも同時に生成してくれています。含める文字を「一般的な文字」にするか「全てのUnicode文字」にするかでだいぶサイズが違います。

f:id:ux00ff:20170211112808p:plain

手元で動かすぶんには createFont が手軽なのでこっちを使っています。

移植してみた

結果はこちら。少し長くなってしまった。コードはGistにも置いてあります。

続きを読む

PAppletはインターフェイスPConstantsの実装である

Processing

えっ? というか PConstants ってインターフェイスだったの?

f:id:ux00ff:20170210123751p:plain

驚いたというかこれは完全に思いこみがあった。つまり、これまで以下のように書いていたところは、

import processing.core.PApplet
import processing.core.PConstants._

これでもいいってことになるよね。

import processing.core.PApplet
import processing.core.PApplet._

というか PApplet#println を利用していたつもりだった箇所は実はscala.Predef#println を呼んでいたということである。なんてこった。

なんてこった、とびっくりはしたけどよくよく考えて見ると PApplet#cos とか PApplet#map とかを気がつかないうちに呼んでいるより、あくまで定数だけをインポートしたいわけなので、PConstants._ をインポートする方が結果的には見通し良さそうだ。だからまあ、あまり気にしない方向でいきます。

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

Processing Scala

公式サンプルの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

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

ScalaでFlockingの公式サンプルコードを書き直してみた

Processing Scala

Processingの公式コードサンプルのFlockingは自分が好きなサンプルの一つです。

Flocking \ Examples \ Processing.org

これは Boid理論に基づいてわらわらと動作する「鳥の群れ」っぽい動きをシミュレーションするというものです。

Boid理論というのは「仲間に近づきすぎたら離れる」「群れの中心に近づこうとする」「群れの方向に合わせて並んで移動する」という簡単なルールを適応することで群れっぽい動きになるぜというもので、こちらのサイト (Boid理論 群行動生成アルゴリズム| ActionScriptテックラボ | [Smart])がわかりやすく参考になりました。

移植

で、この公式サンプルをまずは簡単に Scala に移植してみたのが以下となります。メソッドなども含めてだいたい忠実に移植しています。

続きを読む

IntelliJでProcessing with Scala プロジェクトテンプレートを用意する

Scala Processing

ProcessingのプログラムをIntelliJとScalaで開発する の通り気軽にIntelliJを利用して開発できるようになりました。

とはいえ、書き捨ての小さなプロジェクトが多いのでいちいち External Library を追加するのも面倒くさくなってきました。そこでプロジェクトテンプレートを作成します。Processing はやっぱり起動したらすぐに書き始められる「スケッチ感」が大事だと思うので。

プロジェクトテンプレートを作る方法についてはドキュメントに記載があります。

って、ただテンプレートとして保存するだけか・・・! プレースホルダをファイルに記入してプロジェクト作成時に置換するようにしたかったんだけど、プロジェクト作成ダイアログを簡易にカスタマイズする方法は提供されていないので今は我慢。機運が高まったら見てみよう。

続きを読む

Scala, Akka, Processing

Processing Scala Akka

Scalaを学ぶならAkkaも学ばねばならぬ・・・という話を誰から聞いたのかは覚えていませんが、せっかくだからAkkaもProcessing文脈でやってみようと試みたのがこちら。あまりにも誰得なのですが、とはいえ書いておかないと忘れそうなので覚書です。

環境は macOS Sierra、Processing 3系、IntelliJ IDEAを利用しています。

Akkaは Maven リポジトリから落としてきます。2.4.16をここではチョイス。

f:id:ux00ff:20170201183004p:plain

あとは実装ですが、これはまず画面からのイベントを受け取る最小限の Actor を作って見ることにします。

class BaseActor extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case MouseClickEvent(x, y) => {
      log.info("click! %d,%d".format(x, y))
    }

    case _ => {
      log.debug("missing message")
    }
  }
}

object BaseActor {
  case class MouseClickEvent(x: Int, y: Int)
}

こんな感じでいいでしょう。

続きを読む

processing.videoの代わりにOpenCVのVideoCaptureを利用する

Processing Scala OpenCV

ところで現在の Processing には、昔あった processing.video.* がありません。このあたりのコミットで delete video library now in processing-video 見ての通りばっさりやられています。

公式によると、

Video – we’ve removed the QuickTime for Java video library and are using a modified version of Andres Colubri’s GSVideo library instead. On Linux, you’ll need to install gstreamer to use the new library. On Windows and Mac OS X, you should not need to install it, however we’re working out a few kinks in the whole process.

とのことで、なるほどです。もちろん、公式の Video ライブラリをインストールしても問題ありません。サンプルコードも問題なく利用できます

f:id:ux00ff:20170201094556p:plain

しかし、それでは少し面白みがないので、ここでは OpenCVを直接利用してみることにしました。Mac OS、Processingは3系、OpenCVは3.2.0です。

続きを読む