海を描く(2020.03.16)

解説

 この作品も抽象的な形状ではなく、 具体的なもの・シーンを描きたいと思い作成しました。

蕪村の有名な句「春の海 ひねもす のたりのたりかな」をなんとなく 頭に浮かべつつ、コーディングしていました。

ソースコード解説

 清書したプログラムは以下のとおりです:

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)

 空を描くコードを省き、代わりに月を描いてみました。

こちらの作品では、月夜に反射した波頭を表現したかったので、 画面の端の方では波頭の表現を弱めています。

二次関数 (x-a)*(b-x) は、x=a,b で 0 となり、 x=(a+b)/2 で最大値をとる関数です。

この作品でも波頭は円の集まりにて表現されていますが、 この二次関数を半径に乗ずることで、 月夜に光る波頭を表現しています。

実際のコードでは、描かれる波のベースラインの高さ(=y) も 考慮したものになってますので、 式は少し複雑になっています。