HSVサークル

HSV色空間を円の中に2次元的に表したものです。

gnuplotのpaletteは1次元の関数しか使えないので、2次元的な色遣いをしようとすると、工夫が必要です。以下の例では、HSVサークルを動径方向にN個に分割し、色の範囲(cbrange)を[0:360*N]にします。そして、gray*360*Ngrayzの値に応じて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))