近頃、Fanfiction Update Notifierなるものをやっています。ネット上に存在するファンフィクションの更新をTwitterで通知するものなのですが、その中で、
上のようなグラフを表示するページがあります(各原作別のポスト数です)。それにしてもギャルゲーが多いです(笑)
さて、このグラフ、Google Chart Toolsを使っていまして、色を一色だけ渡すと、上のように自動的に明度を変化させて色分けしてくれます。
ただ、これだとちょっと見にくいかもしれないので、巧い具合に色分けすることを考えました。
上のグラフは項目数が20なので、360 / 20 = 18°ずつ色相をずらしていけばOK、と最初は思ったのですが、これでは大間違いですね。
なぜかと言うと、20項目目の342°で、殆ど最初の0°と同じ色になってしまうからです。つまり、赤橙黄緑青藍紫と色相環を廻って、最初の赤に戻ってしまうわけです。
ですから、最後がちょうど紫になるように、( 360 – 40 ) / 20 = 16°ずつ回転させることにしました。
これでとりあえず完成、なのですが、せっかくなので、WikipediaのHSV色空間を参考に、与えられた数だけ色を返す関数を考えてみました。
function getColors( num, _s, _v ) { var deg = Math.round( 320 / num ); var h = 0; var s = _s / 100; var v = _v / 100; var tmpArray = new Array(); for( i=0; i < num; i++ ){ var hi = Math.floor( h / 60 ) % 6; var f = h / 60 - hi; var p = v*( 1 - s ); var q = v*( 1 - f*s ); var t = v*( 1 - (1-f)*s ); h += deg; var r,g,b; switch( hi ){ case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } tmpArray[ i ] = hex( r ) + hex( g ) + hex( b ); } return tmpArray.join(","); } function hex( x ){ var tmp = Math.round( x * 255 ).toString( 16 ); if( tmp.length < 2 ) return "0"+tmp; else return tmp; }
var hi = Math.floor( h / 60 ) % 6;
となっているのがミソです。Math.round()では上手くいきません。
よろしかったら、お試し下さい。