+sub hue {
+ # colour shift (red = 0 .. 1)
+ my ($r, $g, $b) = @{ $_[0] };
+ my $hue = atan2 sqrt(3) * ($g - $b), $r*2 - $g - $b;
+ $hue /= $PI * 2; # -.5 .. .5
+ $hue++ if $hue < 0; # fp $hue %= 1
+ return $hue;
+}
+
+sub hsv {
+ my ($rgb) = @_;
+ my $v = max(@{$rgb});
+ return $rgb->hue, abs(min(@{$rgb}) - $v), $v;
+}
+