見出し画像

ノイズのエッジ

 今日もなかなか忙しいので、新作ではなく、これまでに作成した作品から棚つか的に紹介したいと思う。私は作品を作ると 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 作できたのは嬉しい限りである。


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?