diff main/plot/fill.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/plot/fill.m	Wed Oct 10 19:54:49 2001 +0000
@@ -0,0 +1,133 @@
+## Copyright (C) 1999 Daniel Heiserer
+##
+## This program is free software.  It 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 this file; see the file COPYING.  If not, write to the
+## Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+
+## FILL creates a pseudo-shaded patch 
+## USAGE: 
+##     FILL(X,Y,C) 
+##     X x-coordinates of the patch
+##     Y y-coordinates of the patch
+##     C colour code as given by plot
+## 
+##    See also PATCH.
+
+## AUTHOR: Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de>
+## 2001-01-16 Paul Kienzle
+## * reformatting, small speedup, unwind protect
+
+function fill(x,y,c)
+
+  if nargin!=3
+    usage("fill (x,y,c)");
+  end
+  
+  c=[c(1),';;'];
+  
+  xs=size(x);
+  ys=size(y);
+  
+  if ys~=xs
+    error('x and y have to have the same size');
+  end
+  
+  ys=max(ys);
+  xs=max(xs);
+  
+  
+  ## What do we do, if we dont have a quad?
+
+  if ys<3
+    ##	error('Area only defined for at least 3 coordinates')
+    ## should I care?
+    x(2)=x(1);
+    y(2)=y(1);
+    x(3)=x(2);
+    y(3)=y(2);
+    x(4)=x(3);
+    y(4)=y(3);
+  elseif ys==3
+    ## a triangle, merge node 4 to 1
+    x(4)=x(1);
+    y(4)=y(1);
+  elseif ys>4
+    ## ok we have to split it into multiple trias,  quads look ugly 
+    held = ishold;
+    unwind_protect
+      for jj=3:ys
+      	fill([x(1),x(jj-1),x(jj)],[y(1),y(jj-1),y(jj)],c);
+      	hold on;
+      end
+    unwind_protect_cleanup
+      if (!held) hold off; end;
+    end_unwind_protect
+  end
+
+
+  ## well as long as gnuplot has no fill function ...
+  ## we do it ourselves ....
+  ## maybe this looks really ugly if we have to fill
+  ## lots of triangles which should represent a polygon
+  ## but this approach has an excellent effort/work relationship 
+  ## (maybe we are a little to economic here ;-)) ...
+  ## improveme!!!!
+  ## ok we assume our patch looks like this:
+  ##
+  ##      2+-------------------+3
+  ##       |                   |
+  ##       |                   |
+  ##       |                   |
+  ##       |                   |
+  ##       |                   |
+  ##      1+-------------------+4
+  ##
+  ## and we want to have something like this:
+  ##
+  ##      2+-------------------+3
+  ##       | | | | | | | | | | |
+  ##       | | | | | | | | | | |
+  ##       | | | | | | | | | | |
+  ##       | | | | | | | | | | |
+  ##      1+-------------------+4
+  ##
+  ## for triangles we want to have only the grids 1-2-3
+
+  ## so we create a spacing from 1:4 and 2:3 using 1/increments
+  increments=50;
+  X_14=x(1):(x(4)-x(1))/increments:x(4);
+  X_23=x(2):(x(3)-x(2))/increments:x(3);
+  ## the same for Y
+  Y_14=y(1):(y(4)-y(1))/increments:y(4);
+  Y_23=y(2):(y(3)-y(2))/increments:y(3);
+  ## ok now assume x(1)==x(4) then the :: wouldn't generate anything
+  if (length(X_14)==0)
+    X_14=x(1)*ones(1,increments+1);
+  end
+  if (length(X_23)==0)
+    X_23=x(2)*ones(1,increments+1);
+  end
+  if (length(Y_14)==0)
+    Y_14=y(1)*ones(1,increments+1);
+  end
+  if (length(Y_23)==0)
+    Y_23=y(2)*ones(1,increments+1);
+  end
+  
+  X=[X_23;X_14];
+  Y=[Y_23;Y_14];
+  idx=2:2:increments+1;
+  X(:,idx) = flipud(X(:,idx));
+  Y(:,idx) = flipud(Y(:,idx));
+  X=X(:);
+  Y=Y(:);
+  
+  plot(X,Y,c)
+  
+endfunction