function h=fillout(x,y,lims,varargin)
%FILLOUT Fill outside a 2-D polygon
% While Matlab FILL, fills inside a polygon, FILLOUT fills outside
% a boundary. The boundary can be a continuous line, defined by the
% vectors X,Y or a region defined by the 2-D arrays X,Y.
%
% Syntax:
% H = FILLOUT(X,Y,LIM,VARARGIN)
%
% Inputs:
% X, Y Boundary vectors (continuous) or 2-D arrays.
% LIM Outer limite box, like AXIS, ie, [minX maxX minY maxY],
% by default the limits of the data is used
% VARARGIN:
% Any options of the FILL command. By default the fill color
% (FaceColor) is green and the EdgeColor is none
%
%
% Output:
% H Handle of the filled surface
%
% Examples:
% % 1. Using 2-D arrays:
% x=1:10;
% y=[1:5]'*x.^2;
% x=repmat(x,5,1); nans = repmat(nan,size(x));
% figure
% subplot(2,1,1)
% fillout(x,y,[-1 11 -100 600],'b'); hold on, pcolor(x,y,nans)
%
% % 2. Using vectors:
% load <some_boundary> % with the variable x and y
% subplot(2,1,2)
% fillout(x,y); hold on, plot(x,y)
%
% MMA 23-3-2006, mma@odyle.net
h=[];
if nargin <2
disp(['## ',mfilename,' : more input arguments required']);
return
end
if prod(size(x)) > length(x)
x=var_border(x);
end
if prod(size(y)) > length(y)
y=var_border(y);
end
if length(x) ~= length(y)
disp(['## ',mfilename,' : x and y must have the same size']);
return
end
if nargin<4
varargin={'g'};
end
if nargin<3
lims=[min(x) max(x) min(y) max(y)];
else
if lims(1) > min(x), lims(1)=min(x); end
if lims(2) < max(x), lims(2)=max(x); end
if lims(3) > min(y), lims(3)=min(y); end
if lims(4) < max(y), lims(4)=max(y); end
end
xi=lims(1); xe=lims(2);
yi=lims(3); ye=lims(4);
i=find(x==min(x)); i=i(1);
x=x(:);
y=y(:);
x=[x(i:end)' x(1:i-1)' x(i)];
y=[y(i:end)' y(1:i-1)' y(i)];
x=[xi xi xe xe xi xi x(1) x];
y=[y(1) ye ye yi yi y(1) y(1) y];
h=fill(x,y,varargin{:});
set(h,'edgecolor','none');
function [x,xc] = var_border(M)
%VAR_BORDER Get border of 2D array
%
% Syntax:
% [X,XC] = VAR_BORDER(M)
%
% Input:
% M 2D array
%
% Output:
% X Border
% XC Values at the 4 corners
%
% Example:
% x = 1:10;
% y = 1:10;
% [x,y] = meshgrid(x,y);
% [xx,xxc] = var_border(x);
% [yy,yyc] = var_border(y);
% M = rand(10,10);
% [m,mc] = var_border(M);
% figure
% plot(xx,yy); hold on
% plot3(xx,yy,m,'r')
% view([-30 60])
% plot3(xxc,yyc,mc,'bo')
% axis([-1 11 -1 11 -1 2])
%
% MMA 18-8-2004, martinho@fis.ua.pt
%
% See also PLOT_BORDER3D, ROMS_BORDER
% Department of Physics
% University of Aveiro, Portugal
x = [];
xc = [];
if nargin == 0
disp(' no variable')
return
end
xl = M(:,1);
xt = M(end,:); xt = xt';
xr = M(:,end); xr = flipud(xr);
xb = M(1,:); xb = flipud(xb');
x = [xl; xt; xr; xb];
% corners:
xc = [xl(1) xl(end) xr(1) xr(end)];