Context Free Art

前回の記事はこちら: Context Free Art - 西尾泰和のはてなダイアリー

怪しいものができた。


ちいさいやつ


ネタバレ画像


ミスから生まれた画像


プリント用の原稿を作ろうとしてInkScapeに貼ったらハングしたw


Context Free Artのコードを出力するPythonスクリプトを書いたり。

code = """
rule LEVEL_%d {
  END {}
  5 * {r 72} LEVEL_%s {x 1.618 s 0.618}
}
"""

N = 5
for i in range(N):
    print code % (i, i + 1)

SVGで出力して中身を見てみる。

  <circle r="0.5"
          stroke="none" fill="#000000" fill-rule="nonzero"
          transform="matrix( 103.45669          0          0 -103.45669  290.95685        338)"/>
  <circle r="0.5"
          stroke="none" fill="#ffffff" fill-rule="nonzero"
          transform="matrix( 63.936234          0          0 -63.936234  290.95685        338)"/>

ふむ。階層的になっているかと思いきや、全部べたにmatrixを吐き出している。matrixの要素が6つしかないけど、一番下の0, 0, 1を取り除いたものらしい。Coordinate Systems, Transformations and Units - SVG 1.1 - 20030114

っていうかこの程度だったら斉次行列の知識があってprint文が使えたら自分でプログラムを書いて出力できるな。やっぱりContext Free Artは適当にいじって眺めるドラフト用かな。


いくつか重なっている円があるはずだ、と思ってmatrix部分にuniqを掛けてみたけど数が変わらない。そうか、重なっている円も、円でなければ「回転角度が違う」わけか。行列から平行移動と拡大縮小の情報だけを取り出してuniqしないといけないな。どうするんだっけ。まあ今回skewがないことがわかってるから(0, 0)を入れたら平行移動が出て、(1, 0)を入れて差を見れば拡大縮小がでるはずか。座標は右から掛けるので、(0, 0)を変換すると(c, f)になる。(1, 0)を変換すると(a + c, d + f)になる。ってことは平行移動は(c, f)でスケールはsqrt(a^2 + d^2)か。