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