デジタル 8 色について
プログラムでアニメーションを生成するとき、 鮮やかな色を適当に割り振りたい、という状況に遭遇する場合があります。 つぶやき Processing においても、もちろんそうです。
しかし、RGB 値をいい感じに割り振るのも大変です。
Processing の標準設定では、古の 8 bit マイコンのようにデジタル 8 色を表現する場合、 それぞれの色は以下のような引数として fill 関数に与える必要があります。
fill( 0, 0,0) # 黒
fill( 0, 0,255) # 青
fill(255, 0,0) # 赤
fill(255, 0,255) # 紫
fill( 0,255, 0) # 緑
fill( 0,255,255) # 水色
fill(255,255, 0) # 黄色
fill(255,255,255) # 白
乱数でこれらの引数を適当に生成するのは、結構な文字数を要してしまいます。
カラフルな色とは何か?
つぶやき Processing のため、文字数を減らす - code golf するために、 そもそも必要とするカラフルな色とは何か?を考えてみたく思います。
それは彩度と明度が高い色に他なりません。 であれば、色相を適当に変化させながら、彩度と明度は最大値として、 色指定すれば良さそうです。
幸いなことに Processing には colorMode という関数があり、 RGB の各チャネルの値で色を指定する代わりに、 色相(=Hue)、彩度(=Saturation)、明度(=Brightness) により 色の指定を行う HSB モードがあります。
colorMode(HSB,N) # N にて各チャネルの最大値を指定する
これを活用し、例えば、
colorMode(HSB,8)
fill(random(8),8,8)
などとするとカラフルな色を少ない文字数で表現できます。
#つぶやきProcessing
— Koji Saito (@KojiSaito) March 11, 2020
def setup():size(500,500);colorMode(3,8)
L=range(36)
def draw():
background(0,0,8);randomSeed(1)
for i in L:
fill(random(8),8,8);f=i+frameCount*.01;beginShape()
for k in L:t=k/6.;r=15+noise(t+f)*30;vertex(r*cos(t)+i%6*99+5,r*sin(t)+i/6*99)
endShape(2) pic.twitter.com/XsqqndIsFV
備考:上記作品の注意事項
上で示した作品では、colorMode(HSB,8) ではなく colorMode(3,8) と記述しています。 これは、どうしても 2 文字削減したかったので、 苦肉の策としてこのように記述したんだと記憶しています。
なぜ、これで動くのでしょうか?
あくまでも、私の開発環境では、という但し書き付きなのですが、 HSB というのは単なる定数であり、その定数の値は 3 であるためです。
私の環境では、Processing のプログラム中で print(HSB) を実行すると、 3 という値が表示されました。 ですので、HSB という文字列は 3 という値で代替可能であると推測し、 試しに実行してみたら、何も問題がなかった、ということです。
Processing はプログラミング言語ではなく、フレームワークである、 と考えれば当たり前の話であり、何を今更…と怒られそうです。
しかし、自分の経験では、 Processing をプログラミング言語の一種として捉えている人も存在しているため、 今回、念のためここに記しておきます。
まあ、とにかく、上で示した つぶやき Processing のコードは、 もしかすると動かない可能性がある、ということです。 もし動かなかったら、colorMode(3,8) を colorMode(HSB,8) に変更して実行してみて下さい。