カラー1 - NodeBox ――の続き

カラー1 - NodeBox - Haitena だいありー

の続き.
上では,previewやswarmといった既存メソッドを使ったけれど,この関数に似た描画をする関数を自作してみた.ちなみにpreviewではsize()に合わせた描画は出来なかったけれど,自作版ではその辺配慮してみた.色テーマの取得は前回同様.

自作関数による色テーマの描画デモサンプル


import math as m
def demo_colors(clr_list,
                n=int(m.floor(3*m.sqrt((WIDTH+HEIGHT)/2))),
                colorbar=None):
    sz = min(WIDTH, HEIGHT)
    div = 2.4
    div_extra = div if not colorbar else div/0.6
    for i in xrange(n):
        r = random(sz/20, sz/10)
        coord_x = WIDTH/2 + random(-WIDTH/div, WIDTH/div)
        coord_y = HEIGHT/2 + random(-HEIGHT/div, HEIGHT/div_extra)
        clr1 = choice(clr_list)
        fill(clr1.r, clr1.g, clr1.b, random(0.5, 1.0))
        oval(coord_x-r, coord_y-r, r*2, r*2)
        r *= random(0.6, 1.0)
        clr2 = choice(clr_list)
        fill(clr2.r, clr2.g, clr2.b, random(0.5, 1.0))
        oval(coord_x-r, coord_y-r, r*2, r*2)
        
    if colorbar:
        x = y = 0
        w = h = sz/10
        for c in clr_list:
            push()
            translate(w/2, HEIGHT-(h*1.5))
            fill(c)
            rect(x, y, w, h)
            pop()
            x += w

# main
size(300, 200)

web = ximport("web")
themes = web.kuler.search("sea")

clr = ximport("colors")
sea = clr.list(themes[0])

background(sea.darkest.darken(0.35))
demo_colors(sea, colorbar=True)

size()に指定するサイズが小さい場合と大きい場合で,単調な比例関係にしてしまうと,円の密度みたいなのがちょっと微妙だったので,分かりにくいけれど,描画する円の数を以下で指定することにした(デフォルトの場合):
floor \biggl(3 \cdot \sqrt{\frac{width + height}{2}} \biggr)
ルート取ってサイズの大小での差を小さくする.本当はlog取るのが常套かもしれないが,ルートでもいいかなーという感じで.
これでsize()に依らない描画が可能.


また,demo_colors()のcolorbarを指定すると左下にカラーバーを表示する.
colorbarと円が重ならないように配慮……したことでdemo_colors()自体が分かりにくくなってしまったけれど(ぇ


前回はbananaを検索した結果の色テーマを取得したが,今回はseaで検索してみた.
もちろん,demo_colors()にはcolorオブジェクトのリストを渡せばおkなので,自作色リストをデモすることも出来る.
これは楽しい.