一番上がHSVで30度ずつ回転したもの。2番目がHLSで30度ずつ回転したもの。3番目がHLSでLを1.2倍にしていったもので、4番目が同じく0.8倍にしていったもの。

3番目と4番目に関しては昨日アルファ値に関して行ったのと同じ方法で値域を0..1に制限してある。あと、それだけだと値が1.0になることがありえなくなるのでINFINITYっていう定数を導入した。

Pythonはcolorsysっていう標準ライブラリでRGBだのHSVだのHLSだのの変換が用意されているのでラクチンだった。うっかりポイントとしてはcolorsysでは色相も0..1なので、30増やしても赤いまま、というあたりか。360.0で割ってやる必要がある。

HLSの長所は3番目と4番目のような「明るくなる、暗くなる」がL(輝度)の値で一元管理されているところか。


あー。普通に計算している範囲では1.0にならないからINFINITYを導入して1.0、ってやったんだけどひとたび1.0になるとそこから変化しなくなるんだなぁ。あたりまえか。1023 / 1024くらいの値で止めるようにするか。



    cont.loop(
        300, lambda cont:(
            cont.trans(0.4)
            .rot(degrees(5))
            .scale(0.98)
            .hls(h=15)),
        lambda cont:(
            cont
#            .rainbow()
            .circle(fill_opacity=0.5)))

色相環の大部分は虹などの中にも同じ順番で色が出てくる、でも短波長の紫と長波長の赤の「間」なんてものは存在しない。実際には波長は環になっていないからね。実際には赤紫ではなく紫外線や赤外線になって見えなくなるはずだから、HLSでHが赤紫の範囲のときにはレンダリングを行わない、というフィルタを噛ませてみた。


http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:CIExy1931_sRGB.png
うーん、波長的には水色の領域がもっと圧縮されるのか。


Context Free Artでは指定できなかったけど、SVGのcircleにはstrokeがあり、枠線の色をしているすることができる。つまりコンテキストはfillの色と別に枠線の色を持つ必要があるわけだ。んー。.hls(h=15, target="stroke")でいいかな。target省略時はtarget="fill"ってことで。