# HG changeset patch # User Rik # Date 1379609655 25200 # Node ID 0fa126e9944e08c0dcce9e239680090c0dd82a90 # Parent 000be929e8358f59758b1cd5592037f14a0f4981 trisurf.m: Overhaul function. * scripts/plot/trisurf.m: Add more documentation about C matrix argument. Remove invalid calling form with only 3 inputs. Add code to check for 5th argument being a color matrix. Turn off axis plot box for visual compatibility with Matlab. Add %!error tests for input validation. diff -r 000be929e835 -r 0fa126e9944e scripts/plot/trisurf.m --- a/scripts/plot/trisurf.m Thu Sep 19 09:33:55 2013 -0700 +++ b/scripts/plot/trisurf.m Thu Sep 19 09:54:15 2013 -0700 @@ -37,7 +37,9 @@ ## change the colormap to control the appearance. ## ## Optionally, the color of the mesh can be specified independently of @var{z} -## by supplying a color matrix, @var{c}. +## by supplying a color matrix, @var{c}. If @var{z} has N elements, then +## @var{c} should be an Nx1 vector for colormap data or an Nx3 matrix for +## RGB data. ## ## Any property/value pairs are passed directly to the underlying patch object. ## @@ -48,43 +50,49 @@ function h = trisurf (tri, x, y, z, varargin) - if (nargin < 3) + if (nargin < 4) print_usage (); endif - if (nargin == 3) - triplot (tri, x, y); - elseif (ischar (z)) - triplot (tri, x, y, z, varargin{:}); - else - if (nargin > 4 && isnumeric (varargin{1})) - c = varargin{1}; - varargin(1) = []; - else - c = z; - endif - if (! any (strcmpi (varargin, "FaceColor"))) - nfc = numel (varargin) + 1; - varargin(nfc+(0:1)) = {"FaceColor", "flat"}; - else - nfc = find (any (strcmpi (varargin, "FaceColor")), 1); + if (nargin > 4 && isnumeric (varargin{1})) + c = varargin{1}; + varargin(1) = []; + if (isvector (c)) + if (numel (c) != numel (z)) + error ("trisurf: C must have 'numel (Z)' elements"); + endif + c = c(:); + elseif (rows (c) != numel (z) || columns (c) != 3) + error ("trisurf: TrueColor C matrix must be 'numel (Z)' rows by 3 columns"); endif - if (! any (strcmpi (varargin, "EdgeColor")) - && strcmpi (varargin{nfc+1}, "interp")) - varargin(end+(1:2)) = {"EdgeColor", "none"}; - endif - hax = newplot (); - htmp = patch ("Faces", tri, "Vertices", [x(:), y(:), z(:)], - "FaceVertexCData", reshape (c, numel (c), 1), - varargin{:}); - if (nargout > 0) - h = htmp; - endif + else + c = z(:); + endif + ## FIXME: Is all this extra input parsing necessary? + ## Is it for Matlab compatibility? + if (! any (strcmpi (varargin, "FaceColor"))) + nfc = numel (varargin) + 1; + varargin(nfc+(0:1)) = {"FaceColor", "flat"}; + else + nfc = find (any (strcmpi (varargin, "FaceColor")), 1); + endif + if (! any (strcmpi (varargin, "EdgeColor")) + && strcmpi (varargin{nfc+1}, "interp")) + varargin(end+(1:2)) = {"EdgeColor", "none"}; + endif - if (! ishold ()) - set (hax, "view", [-37.5, 30], - "xgrid", "on", "ygrid", "on", "zgrid", "on"); - endif + hax = newplot (); + + htmp = patch ("Faces", tri, "Vertices", [x(:), y(:), z(:)], + "FaceVertexCData", c, varargin{:}); + + if (! ishold ()) + set (hax, "view", [-37.5, 30], "box", "off", + "xgrid", "on", "ygrid", "on", "zgrid", "on"); + endif + + if (nargout > 0) + h = htmp; endif endfunction @@ -154,3 +162,13 @@ %! tri = delaunay (x, y); %! trisurf (tri, x, y, z, 'facecolor', 'interp', 'edgecolor', 'k'); +%% Test input validation +%!error trisurf () +%!error trisurf (1) +%!error trisurf (1,2) +%!error trisurf (1,2,3) +%!error trisurf (1,2,3,4,[5 6]) +%!error trisurf (1,2,3,4,[5 6]') +%!error trisurf ([1;1],[2;2],[3;3],[4;4],zeros(3,3)) +%!error trisurf ([1;1],[2;2],[3;3],[4;4],zeros(2,2)) +