HSV色空間を円の中に2次元的に表したものです。
gnuplotのpalette
は1次元の関数しか使えないので、2次元的な色遣いをしようとすると、工夫が必要です。以下の例では、HSVサークルを動径方向にN
個に分割し、色の範囲(cbrange
)を[0:360*N]
にします。そして、gray*360*N(grayはzの値に応じて0から1の値をとる)を「360進数」のように思って、その2ケタ目をHSVサークルグの動径方向、その1桁目を角度部分に割り当てます。Nを適度に大きくとることで、擬似的に2次元的な色遣いが可能になります。
上の図は下のスクリプトを実行して得られるHSV-circle.epsからコピーしたものです。
# HSV色空間からRGB色空間への変換。Wikipedia参照
HSV_Hi(h)=sgn(h)*floor(abs(h)/60.0)%6+(h>=0 ? 0 : 5)
HSV_f(h)=(sgn(h)*(abs(h)-(floor(abs(h))/360)*360.0)/60.0+(h>=0 ? 0 : 6))-HSV_Hi(h)
HSV2R(h,s,v)=( \
HSV_Hi(h)==0 || HSV_Hi(h)==5 ? v : (\
HSV_Hi(h)==1 ? v*(1-HSV_f(h)*s) : (\
HSV_Hi(h)==4 ? v*(1-(1-HSV_f(h))*s) : (\
HSV_Hi(h)==2 || HSV_Hi(h)==3 ? v*(1-s) : 0.0) )))
HSV2G(h,s,v)=( \
HSV_Hi(h)==1 || HSV_Hi(h)==2 ? v : (\
HSV_Hi(h)==3 ? v*(1-HSV_f(h)*s) : (\
HSV_Hi(h)==0 ? v*(1-(1-HSV_f(h))*s) : (\
HSV_Hi(h)==4 || HSV_Hi(h)==5 ? v*(1-s) : 0.0) )))
HSV2B(h,s,v)=( \
HSV_Hi(h)==3 || HSV_Hi(h)==4 ? v : (\
HSV_Hi(h)==5 ? v*(1-HSV_f(h)*s) : (\
HSV_Hi(h)==2 ? v*(1-(1-HSV_f(h))*s) : (\
HSV_Hi(h)==0 || HSV_Hi(h)==1 ? v*(1-s) : 0.0) )))
set angles degrees
# HSVサークルの動径方向分割数
N=50.0
colmax = N*360.0
set palette model RGB functions \
HSV2R((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, (floor(gray*colmax/360.0)/N), 1),\
HSV2G((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, (floor(gray*colmax/360.0)/N), 1),\
HSV2B((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, (floor(gray*colmax/360.0)/N), 1)
set parametric
set urange [0.0:1.0]
set vrange [0.0:360.0]
set cbrange [0:colmax]
unset colorbox
set border 0
unset ytics
unset xtics
set zrange [0:colmax]
set samples 100
set isosamples 181
set pm3d corners2color c1
set size ratio 1
set view map
splot u*cos(v),u*sin(v),floor(u*N)*360.0+v with pm3d title ""
set terminal post color size 5in,5in
set out "HSV-circle.eps"
replot
set out
set term win
なお、上のスクリプトのset palette...
の部分を以下で置き換えると、中心の黒いHSVサークルが描けます。
set palette model RGB functions \
HSV2R((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, 1, (floor(gray*colmax/360.0)/N)),\
HSV2G((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, 1, (floor(gray*colmax/360.0)/N)),\
HSV2B((gray*colmax/360.0-floor(gray*colmax/360.0))*360.0, 1, (floor(gray*colmax/360.0)/N))