## Copyright (C) 2013 Adam H Aitkenhead ## ## This file is part of Octave. ## ## Octave is free software; you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 3 of the License, or (at ## your option) any later version. ## ## Octave is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{mapnew}] =} rgbmap (@var{n}, @var{rlim}, @var{glim}, @var{blim}) ## Generate an rgb colormap. ## ## @var{n} is the maximum number of rows in the output colormap. @var{rlim}, @var{glim} and @var{blim} ## define the minimum and maximum of the range of values in each of the RGB color channels. ## ## @seealso{rgb2ind} ## @end deftypefn ## Author: Adam H Aitkenhead ## Created: May 2013 function [mapnew] = rgbmap (n, rlim, glim, blim) if (n<8) error ("rgbmap: n must be >= 8"); endif ## Compute the number of points in each color channel diffrgb = diff([rlim; glim; blim]'); nrgb = floor (n^(1/3)+eps) * ones (1,3); ## Check if the number of points in any color channel can be increased ## without exceeding the maximum number of colors in the colormap if nrgb(1)*(nrgb(2)+1)*(nrgb(3)+1)<=n Imin = find (diffrgb == min (diffrgb), 1, 'first'); nrgb = nrgb + 1; nrgb(Imin) = nrgb(Imin) - 1; elseif nrgb(1)*nrgb(2)*(nrgb(3)+1)<=n Imax = find (diffrgb == max (diffrgb), 1, 'first'); nrgb(Imax) = nrgb(Imax) + 1; endif ## Generate the values in each colour channel steprgb = diffrgb./nrgb; r = rlim(1)+steprgb(1)/2 : steprgb(1) : rlim(2)-steprgb(1)/2; g = glim(1)+steprgb(2)/2 : steprgb(2) : glim(2)-steprgb(2)/2; b = blim(1)+steprgb(3)/2 : steprgb(3) : blim(2)-steprgb(3)/2; ## Generate the full colormap, taking all combinations of the rgb channels mapnew = zeros (prod (nrgb),3); loopi = 0; for loopr = 1:numel (r) for loopg = 1:numel (g) for loopb = 1:numel (b) loopi = loopi + 1; mapnew(loopi,:) = [r(loopr),g(loopg),b(loopb)]; endfor endfor endfor endfunction