% hsvx - HSV colour map with extended functionality
%
% hsvx :: N:natural -> [[N,3]] ~'same as hsv'.
%
% hsvx :: 
%    N:natural ~'size of colormap to return', 
%    0--1 ~'inital hue', 
%    0--1 ~'saturation', 
%    0--1 ~'value' 
%    options {
%       brightness :: real/0 ~'try to get even perceptual brightness: 0 not, 1 full'
%    }
% -> [[N,3]].

function M=hsvx(N,H0,S,V,varargin)

	if nargin<2, H0=0; end
	if nargin<3, S=1; end
	if nargin<4, V=1; end
	opts=options('brightness',0,varargin{:});

	H=linspace(H0,H0+1,N+1);
	M=hsv2rgb([mod(H(1:end-1),1)',repmat([S,V],N,1)]);
	if opts.brightness >0
		L=luminocity(M).^opts.brightness;
		M=M./repmat(L,1,3);
		M=V*M./max(max(M));
	end
end

