# hsv2rgb -- # # Convert hsv to rgb # # Arguments: # h hue # s saturation # v value # Results: # Returns an rgb triple from hsv # proc hsv2rgb {h s v} { if {$s <= 0.0} { # achromatic set v [expr {int($v)}] return "$v $v $v" } else { set v [expr {double($v)}] if {$h >= 1.0} { set h 0.0 } set h [expr {6.0 * $h}] set f [expr {double($h) - int($h)}] set p [expr {int(256 * $v * (1.0 - $s))}] set q [expr {int(256 * $v * (1.0 - ($s * $f)))}] set t [expr {int(256 * $v * (1.0 - ($s * (1.0 - $f))))}] set v [expr {int(256 * $v)}] switch [expr {int($h)}] { 0 { return "$v $t $p" } 1 { return "$q $v $p" } 2 { return "$p $v $t" } 3 { return "$p $q $v" } 4 { return "$t $p $v" } 5 { return "$v $p $q" } } } }