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

PythonからProcessingを使ってみる

日本語の解説記事はまだあまり見かけないのですが、ProcessingにはPython ModeというスケッチをJavaではなくPythonで書ける機能があります。

今日はそのPython Modeを使っていくつかスケッチを作成してみたいと思います。

Python Modeの導入

Python Modeの機能はJonathan Feinbergらによって開発されているprocessing.pyで実現されています。Python Modeは公式のIDEに取り込まれていますので、GUIから簡単にインストールすることができます。

まずIDEのウィンドウ右上にあるモード選択ボタン(通常はJavaと書かれています)を押して、Add Mode...をクリックします。

f:id:tkitao:20141025113425p:plain

次にMode ManagerのメニューからPythonを選択し、InstallボタンをクリックすることでPython Modeがインストールされます。

f:id:tkitao:20141025112622p:plain

以後は、新規にスケッチを作成する際に、右上のモード選択ボタンからPythonを選択するだけで、Pythonを使ってコードを書くことができます。

Pythonによる簡単なスケッチの作成

それでは実際にシンプルなスケッチをPythonで書いてみます。書式がPythonのものに変わるだけで、Javaの時の関数名がそのまま使えます。

x = 0

def setup():
    frame.setTitle("Python Test")
    size(300, 300)
    noStroke()
    fill(255, 0, 0)

def draw():
    global x
    background(0)
    ellipse(x, 150, 100, 100)
    x += 1

Pythonモードで動かすと、ウィンドウのタイトルがディレクトリ名を含んだフルパスのものになってしまうため、frame.setTitleメソッドでウィンドウのタイトルを明示的に指定しています。

実際の動作画面です。

f:id:tkitao:20141025123555p:plain

Pythonらしいスケッチの作成

前のサンプルではJavaの時と記述量がほとんど変わらず、Pythonを使うメリットがあまり感じられませんでしたので、processing.pyのメタボールのサンプルを軽くアレンジしてみます。

blog_num = 3
blog_pos = [[0, 0], [40, 70], [120, 0]]
blog_vel = [[1, 1], [1, 1], [1, 1]]

pg = None
pg_size = None

def setup():
    frame.setTitle("Metaball")
    size(640, 360)

    global pg, pg_size
    pg = createGraphics(width / 4, height / 4)
    pg_size = (pg.width, pg.height)

def draw():
    sqd = [[], []]
    for i in range(blog_num):
        for j in range(2):
            blog_pos[i][j] += blog_vel[i][j]
            if blog_pos[i][j] < 0 or blog_pos[i][j] > pg_size[j]:
                blog_vel[i][j] *= -1

            sqd[j].append(tuple(sq(blog_pos[i][j] - n) for n in xrange(pg_size[j])))

    pg.beginDraw()
    for y in range(pg_size[1]):
        for x in range(pg_size[0]):
            m = 1
            for i in range(blog_num):
                m += 60000 / (sqd[0][i][x] + sqd[1][i][y] + 1)
            pg.set(x, y, color(0, (x + m + y) / 2, m + x))
    pg.endDraw()

    image(pg, 0, 0, width, height)

動作画面はこちらになります。

f:id:tkitao:20141025224544p:plain

終わりに

Pythonスクリプト言語なのでJava版からの速度低下が心配でしたが、PC上であればそこそこがんばれる感じです。Pythonでさっとベースを作って、その後Javaに移植するというのも悪くなさそうです。