1## Author: Paul Kienzle <pkienzle@users.sf.net>
2## This program is granted to the public domain.
3
4## -*- texinfo -*-
5## @deftypefn {Function File} {@var{M} =} colorgradient (@var{C}, @var{w}, @var{n})
6## Define a colour map which smoothly traverses the given colors.
7## @var{C} contains the colours, one row per r,g,b value.
8## @var{w}(i) is the relative length of the transition from colour i to colour i+1
9## in the entire gradient.  The default is ones(rows(C)-1,1).
10## n is the length of the colour map.  The default is rows(colormap).
11##
12## E.g.,
13## @example
14## colorgradient([0,0,1; 1,1,0; 1,0,0])  # blue -> yellow -> red
15## x = linspace(0,1,200);
16## imagesc(x(:,ones(30,1)))';
17## @end example
18## @end deftypefn
19
20function ret = colorgradient (C, w, n)
21  if nargin < 1 || nargin > 3
22    print_usage;
23  endif
24
25  if nargin == 1
26    n = rows(colormap);
27    w = ones(length(C)-1,1);
28  elseif nargin == 2
29    if (length(w) == 1)
30      n = w;
31      w = ones(rows(C)-1,1);
32    else
33      n = rows(colormap);
34    endif
35  endif
36
37  if (length(w)+1 != rows(C))
38    error("must have one weight for each color interval");
39  endif
40
41  w = 1+round((n-1)*cumsum([0;w(:)])/sum(w));
42  map = zeros(n,3);
43  for i=1:length(w)-1
44    if (w(i) != w(i+1))
45      map(w(i):w(i+1),1) = linspace(C(i,1),C(i+1,1),w(i+1)-w(i)+1)';
46      map(w(i):w(i+1),2) = linspace(C(i,2),C(i+1,2),w(i+1)-w(i)+1)';
47      map(w(i):w(i+1),3) = linspace(C(i,3),C(i+1,3),w(i+1)-w(i)+1)';
48    endif
49  endfor
50
51  if nargout == 0
52    colormap(map);
53  else
54    ret = map;
55  endif
56endfunction
57