解説
この作品も抽象的な形状ではなく、 具体的なもの・シーンを描きたいと思い作成しました。
蕪村の有名な句「春の海 ひねもす のたりのたりかな」をなんとなく 頭に浮かべつつ、コーディングしていました。
#つぶやきProcessing 海の習作
— Koji Saito (@KojiSaito) March 16, 2020
def setup():size(500,500);noStroke()
def draw():
f=frameCount*.005;background(100,120,250);fill(40,80,180);rect(0,330,500,300);fill(255,80)
for i in range(3750):y=i/250;x=i%250;t=(noise(x*.01+f+y*y,f)-0.4);h=t*y;circle(x*2,330+y*y-t*y*y*.7,t*15) pic.twitter.com/bpMmTB9qH4
ソースコード解説
清書したプログラムは以下のとおりです:
def setup():size(500,500);noStroke()
def draw():
f=frameCount*.005
background(100,120,250)
fill(40,80,180); rect(0,330,500,300) # 空
# 以下、波の表現
fill(255,80)
for i in range(3750): # 3750=250*15
y=i/250; x=i%250
t=noise(x*.01+f+y*y,f)-0.4
h=t*y
circle(x*2,330+y*y-t*y*y*.7,t*15)
波の処理は波頭の白い部分を描いているだけです。 波頭は白い円の集合で構成されています。
変数 x は波の x 座標を表しています。 処理速度の向上のため、1 ピクセルずつではなく、2 ピクセル単位で処理しています (なのでループ回数は 250 回になっています。250 = 500 /2)。
変数 y は波の基準位置を表すものです。 遠近感を出すため、2 乗しています (手前になるほど、縦方向の波の間隔が大きくなるようにしています)。
t に波の高さを代入しています。 波の高さはノイズで生成しているだけです。 ノイズを生成する際に、フレーム数から定まる単調増加な値 f を x に加える事で 時間の経過と共に横に移動するような波を生成しています。
波の高さも手前にある波ほど=下に描かれる波ほど、 より大きく描くため、波の高さも y の 2 乗に比例するよう コーディングしています。
-t*y*y*0.7 と 0.7 倍しているのは、 見栄えから定めただけです(それ以外の意味はありません)。
また、波が高ければ高いほど波頭の表現を、 より強く表現したかったため、 円の半径も t*15 としています。
この 15 という係数も特に意味はありません。 見栄えからのみ定まった係数です。
手前のものほど、より大きく、という原則からすると、 描画する円の半径も y に応じて変化させるべきなのかもしれません。 確か、こちらについても実験したように思います。
結局、思った程の効果が確認できず、 結局定数倍にしよう、ということで落ち着きました。
バリーション
この海の表現については、その後もいくつかのバリーションを作りました。 こちらに機会をみて、順次追加していきたいと思っています。
夜の海 (2020.3/23)
空を描くコードを省き、代わりに月を描いてみました。
#つぶやきProcessing
— Koji Saito (@KojiSaito) March 23, 2020
def setup():size(500,500);noStroke()
C=circle
def draw():
f=frameCount/3e2;clear();fill(9,20,50);rect(0,330,500,270);fill(-1);C(350,99,30)
for i in range(3750):y=i/250;x=i%250;t=noise(x*.01+f+y*y,f)-0.4;C(x*2,330+y*y-t*y*y*.7,t*(x-50+30+y*5)*(230+y*5-x)/3e3) pic.twitter.com/3ucsCeItpi
こちらの作品では、月夜に反射した波頭を表現したかったので、 画面の端の方では波頭の表現を弱めています。
二次関数 (x-a)*(b-x) は、x=a,b で 0 となり、 x=(a+b)/2 で最大値をとる関数です。
この作品でも波頭は円の集まりにて表現されていますが、 この二次関数を半径に乗ずることで、 月夜に光る波頭を表現しています。
実際のコードでは、描かれる波のベースラインの高さ(=y) も 考慮したものになってますので、 式は少し複雑になっています。