ノイズのエッジ
今日もなかなか忙しいので、新作ではなく、これまでに作成した作品から棚つか的に紹介したいと思う。私は作品を作ると Google Docs に文字数圧縮前のソースコードと、圧縮した #つぶやきProcessing 用のコードを共に保存している。本日紹介する作品は「ノイズのエッジ(失敗作)」というタイトルが付いていた。この作品はかなり最初の方にメモされているので、おそらく 2 年前の作品なんだと思う。そのため、何が失敗だったのか、全く思い出すことができない。
とにかく、どんな作品であったかを知るため、まずは残されているコードを Processing に入力し、実効して様子を見る。
N=noise
def setup():size(510,510);noStroke()
t=0
def f(x,y):return 1 if N(x*0.1+t*3,y*0.1,t)>0.5 else 0
def draw():
clear()
global t;t+=0.01
for y in range(102):
for x in range(102):
c=4*f(x,y)-f(x-1,y)-f(x+1,y)-f(x,y-1)-f(x,y+1)
fill(c*100,c*200,c*50);circle(x*5,y*5,6)
自分で言うのもどうかと思うが、なかなか面白いと思う(自画自賛だ)。何が失敗だったのだろう。もしかしたら、#つぶやきProcessing 化に失敗した - という意味であろうか。よく分からん。
もし、#つぶやきProcessing 化に「失敗した」という話であれば、当時は失敗したのかもしれないが、今なら #つぶやきProcessing 化できるかもしれない。というわけで、文字数削減してみよう。
noise 関数の別名として、オリジナル版では n を用いていた。最近の私の流儀では大文字を使うので N に変更したが、そもそも noise 関数を使っている場所が一箇所しかないので、この置き換えは不要である。なので、関数 f 内に noise 関数をそのまま展開する。
この関数 f もよく見ると、ノイズの値が 0.5 より大きい場合は 1 を、そうでない場合は 0 を返すだけであるので、真偽値を int に変換すれば if 文の構造は除去できそうである。
また f 内で使用している大域変数 t は、frameCount*0.01 と同値であるので、それも関数 f 内で定義、利用するように変更する。
このように変更すると、draw 関数内での global 宣言が不要になる。あとは、x と y の 2 重ループをいつものテクニックによって 1 重ループ化してみると、次のようなコードとなる。
def setup():size(510,510);noStroke()
def f(x,y):t=frameCount*.01;return int(noise(x*0.1+t*3,y*0.1,t)>0.5)
def draw():
clear()
for i in range(102*102):x=i%102;y=i/102;c=4*f(x,y)-f(x-1,y)-f(x+1,y)-f(x,y-1)-f(x,y+1);fill(c*100,c*200,c*50);circle(x*5,y*5,6)
tweet 欄に貼り付けてみると、無事 #つぶやきProcessing できる。
2 年前の私は何をもって本作を「失敗」としたのか、全く見当もつかないが、#つぶやきProcessing な作品が 1 作できたのは嬉しい限りである。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?