@KojiSaito が最初に
「つぶやきProcessing」できたもの (2020.02.19)

ことの始まり

 2 月 18 日(2020 年)に、遅ればせながら知った「つぶやきProcessing」。 これはメガデモにおける新たなレギュレーションの 誕生ではないか!と思わずツィートしてしまいました。

最初につぶやけた作品

 それから試行錯誤をして、ようやく 1 ツィートに収めることができた作品がこちら:

本当は、以下の作品のように、 一部のノード同士を線で繋いだ作品をツィートしたかったのですが、 どうしても文字数削減ができず、 機能縮小版としてつぶやきPrcessing しました:

解説編

プログラムを見やすく整形すると、以下のようになります:

t,w=0,250
def setup():size(500,500)
u=lambda p,q,r:noise(p,q,r)*500-w
f=lambda p,q,r:cos(t)*u(p,q,r)-sin(t)*u(p,q,r)+w
def draw():
    global t
	t+=0.002
    background(w)
    for i in range(100):
        circle(f(i,t,0),f(i,i,t),10)

関数 f は、回転をさせようと試行錯誤していた時の名残なのではないかな?と思います。 この時点では、まだ上手く回転させることができませんでした。 回転させるよりも、1 ツィートに収めることを優先してコーディングしていたと 記憶しています。

 おまけとして、ノードを線で結ぶ当初の作品のソースコードも以下に掲載しておきます。 ここで使っているテクニックとしては、 線を結ぶノードの番号を noise 関数を用いて決定している点です。 noise 関数は乱数と異なり、同じ引数については同じ値を返します。 そのため、最初の for ループ内では、frameCount や乱数を使っていませんので、 実は毎フレームごとに同じ数値が変数 a,b には順次代入されていきます。 そんな技法を思いついて、文字数削減を目指していました:

void setup(){
	size(500,500);
}

float t,c,s,W=500,w=250,N=100;

float u(int i){ return noise(i,t)*W-w;   }
float v(int i){ return noise(i,i,t)*W-w; }
float f(int i){ return c*u(i)-s*v(i)+w;  }
float g(int i){ return s*u(i)+c*v(i)+w;  }

void draw() {
	background(255);
	c=cos(t);
	s=sin(t);
	stroke(120);

	int i,a,b;
	for(i=0; i<N; i++) {
		a=int(noise(i)*N);
		b=int(noise(i,i)*N);
		line(f(a),g(a),f(b),g(b));
	}

	stroke(10);
	for(i=0; i<N; i++) {
    	circle(f(i),g(i),10);
    	t+=0.0001;    
  	}
}

 今回、ソースコードを編集していて気がついたのですが、 最初は Java で参戦しようとしてたんですね(思い出しました)。

Java だと関数を 1 文字の変数に代入して、 文字数を削減するという技法が使えないため、 Python に移行したのを思い出しました。 数ヶ月前の話ですが、すでに懐かしい感じがあります