Mercurial > hg > octave-lyh
diff scripts/plot/private/__patch__.m @ 13299:e9f6a6edec42
Improvements to patch() and fix for bugs reported in #34417.
* scripts/plot/patch.m: Add demos.
* scripts/plot/private/__patch__.m: Improvements to input parsing.
* scripts/plot/__go_draw_axes__.m: Accommodate patches with one scalar color
per vertex.
author | Ben Abbott <bpabbott@mac.com> |
---|---|
date | Sat, 08 Oct 2011 17:34:15 -0400 |
parents | 41c2f4633a62 |
children | 9a83ec29aec9 |
line wrap: on
line diff
--- a/scripts/plot/private/__patch__.m +++ b/scripts/plot/private/__patch__.m @@ -31,6 +31,8 @@ failed = false; + is_numeric_arg = cellfun (@isnumeric, varargin); + if (isempty (varargin)) args = {"xdata", [0; 1; 1], "ydata", [0; 0; 1], "facecolor", "blue"}; args = setvertexdata (args); @@ -51,26 +53,47 @@ else failed = true; endif - elseif (isnumeric (varargin{1})) - if (nargin < 3 || ! isnumeric (varargin{2})) + elseif (is_numeric_arg(1)) + if (nargin < 3 || ! is_numeric_arg(2)) failed = true; else - x = varargin{1}; - y = varargin{2}; - iarg = 3; - if (nargin > 3 && ndims (varargin{3}) == 2 && ndims (x) == 2 - && size_equal(x, varargin{3}) && !ischar(varargin{3})) + if (nargin > 4 && all (is_numeric_arg(1:4))) + x = varargin{1}; + y = varargin{2}; z = varargin{3}; - iarg++; - else + c = varargin{4}; + iarg = 5; + elseif (nargin > 3 && all (is_numeric_arg(1:3))) + x = varargin{1}; + y = varargin{2}; z = []; + c = varargin{3}; + iarg = 4; + elseif (nargin > 2 && all (is_numeric_arg(1:2))) + x = varargin{1}; + y = varargin{2}; + z = []; + iarg = 3; + if (rem (nargin - iarg, 2) == 1) + c = varargin {iarg}; + iarg++; + else + c = []; + endif endif if (isvector (x)) x = x(:); y = y(:); z = z(:); + if (isnumeric (c)) + if (isvector (c) && numel (c) == numel (x)) + c = c(:); + elseif (size (c, 1) != numel (x) && size (c, 2) == numel (x)) + c = c.'; + endif + endif endif args{1} = "xdata"; args{2} = x; @@ -79,9 +102,7 @@ args{5} = "zdata"; args{6} = z; - if (isnumeric (varargin{iarg})) - c = varargin{iarg}; - iarg++; + if (isnumeric (c)) if (ndims (c) == 3 && size (c, 2) == 1) c = permute (c, [1, 3, 2]); @@ -108,23 +129,31 @@ args{10} = c; else ## Color Vectors - if (rows (c) != rows (x) || rows (c) != length (y)) - error ("patch: size of x, y, and c must be equal"); - else + if (isempty (c)) args{7} = "facecolor"; args{8} = "interp"; args{9} = "cdata"; args{10} = []; + else + if (rows (c) != rows (x) || rows (c) != length (y)) + error ("patch: size of x, y, and c must be equal"); + elseif (rows (c) == rows (x) && rows (c) == rows (y)) + args{7} = "facecolor"; + args{8} = "interp"; + args{9} = "cdata"; + args{10} = c; + else + error ("patch: color value not valid"); + endif endif endif - elseif (ischar (varargin{iarg}) && rem (nargin - iarg, 2) != 0) + elseif (ischar (c) && rem (nargin - iarg, 2) == 0) ## Assume that any additional argument over an even number is ## color string. args{7} = "facecolor"; - args{8} = tolower (varargin{iarg}); + args{8} = tolower (c); args{9} = "cdata"; args{10} = []; - iarg++; else args{7} = "facecolor"; args{8} = [0, 1, 0]; @@ -288,6 +317,8 @@ if (ndims (c) == 3) fvc = reshape (c, size (c, 1) * size (c, 2), size(c, 3)); + elseif (isvector (c)) + fvc = c(:); else fvc = c.'; endif