ことの始まり
2 月 18 日(2020 年)に、遅ればせながら知った「つぶやきProcessing」。 これはメガデモにおける新たなレギュレーションの 誕生ではないか!と思わずツィートしてしまいました。
140 文字 K、じゃなかった 140 文字系という、デモシーンにおける新たなレギュレーションの誕生の瞬間であった。
— Koji Saito (@KojiSaito) February 18, 2020
詳しくは元ツィートをクリックして、スレッドを追ってみて下さい。マジで凄い。コレは来る!(多分) https://t.co/Xr4uJfKkcK
最初につぶやけた作品
それから試行錯誤をして、ようやく 1 ツィートに収めることができた作品がこちら:
t,w=0,250
— Koji Saito (@KojiSaito) February 19, 2020
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;background(w);t+=0.002
for i in range(100):circle(f(i,t,0),f(i,i,t),10)#つぶやきProcessing
昨晩の機能縮小版。 pic.twitter.com/DwNCfsp1GW
本当は、以下の作品のように、 一部のノード同士を線で繋いだ作品をツィートしたかったのですが、 どうしても文字数削減ができず、 機能縮小版としてつぶやきPrcessing しました:
#つぶやきProcessing 結構難しい。Java だと辛い。配列使わずに、なんとか作ったけどダメだった。2 tweet ぐらいなら行けそうなんだけどな。残念。 pic.twitter.com/lTdENdFeXA
— Koji Saito (@KojiSaito) February 18, 2020
解説編
プログラムを見やすく整形すると、以下のようになります:
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 に移行したのを思い出しました。 数ヶ月前の話ですが、すでに懐かしい感じがあります