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)か。