function grid_test(m, n)

% grid_test -- Grid generation demo.
%  grid_test(m, n) constructs a grid of size [m n].  This
%   is a demonstration routine which attempts to lay out
%   the algorithm in an intuitive manner.
 
% Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.
%  All Rights Reserved.
%   Disclosure without explicit written consent from the
%    copyright owner does not constitute publication.
 
% Version of 27-May-1999 22:22:17.
% Updated    03-Jun-1999 15:09:18.

if nargin < 1, m = 11; end
if nargin < 2, n = m; end

if ischar(m), m = eval(m); end
if ischar(n), n = eval(n); end

x = [1 4 3 1];
y = [1 1 2 2];

z = x + sqrt(-1)*y;
c = [1 2 3 4];   % corner indices.

z(end+1) = z(1);
c(end+1) = length(z);

counts = [m n m n];

zz = [];
cc = [];
for i = 1:4
	j = c(i):c(i+1);
	[ji, pp] = splineq(j, z(j), counts(i), 1);
	zi = ppval(pp, ji);
	zi(end) = [];
	cc = [cc length(zz)+1];
	zz = [zz zi(:).'];
end

z = zz; c = cc;

subplot(2, 2, 1)
x = real(z); y = imag(z);
plot(x, y, '+-', x(1), y(1), 'o')
title z, xlabel x, ylabel y

zoomsafe 0.9, zoomsafe

hasMex = (exist('mexrect', 'file') == 3);

iteration = 0;
straightness = 0;
zrect = z;
while abs(1-straightness) > 0.0001 & iteration < max(m, n)
	if ~hasMex
		zrect = rect(zrect, 1, c(1), c(2), c(3), c(4));
	else
		zrect = mexrect(zrect, length(zrect), c(1), c(2), c(3), c(4));
	end
	ztemp = zrect;
	ztemp(end+1) = ztemp(1);
	ctemp = c;
	ctemp(end+1) = length(ztemp);
	d = sum(abs(diff(ztemp)));
	dc = sum(abs(diff(ztemp(ctemp))));
	straightness = dc ./ d;
	iteration = iteration+1;
	disp([' ## iteration ' int2str(iteration) ...
		'; straightness = ' num2str(100*straightness) ' percent'])
end

subplot(2, 2, 2)
xr = real(zrect); yr = imag(zrect);
plot(xr, yr, '+-', xr(1), yr(1), 'o')
title zrect, xlabel u, ylabel v
zoomsafe 0.9, zoomsafe

figure(gcf)
set(gcf, 'Name', mfilename)

ind = zeros(m, n);
ind(:) = 1:prod(size(ind));
index = [ind(1:end-1, 1).', ind(end, 1:end-1), ...
			ind(end:-1:2, end).', ind(1, end:-1:2)];

z = z(:).';
z(end+1) = z(1);

zrect = zrect(:).';
zrect(end+1) = zrect(1);
c(end+1) = length(z);

d = [0 cumsum(abs(diff(z)))];		% Original boundary.
e = [0 cumsum(abs(diff(zrect)))];	% Mapped boundary.

d12 = d(c(1):c(2));
d12 = d12 - min(d12); d12 = d12 ./ max(d12);
d23 = d(c(2):c(3));
d23 = d23 - min(d23); d23 = d23 ./ max(d23);

e12 = e(c(1):c(2));
e12 = e12 - min(e12); e12 = e12 ./ max(e12);
e23 = e(c(2):c(3))
e23_scale = max(e23) - min(e23)
e23 = e23 - min(e23); e23 = e23 ./ max(e23);

hasMex = (exist('mexsepeli', 'file') == 3)

theSlopeFlag = 1;
theSlopeFlag = 0;

zz = zeros(size(z));

if ~hasMex
	for i = 1:4
		j = c(i):c(i+1);
		dd = d(j);
		dd = dd - min(dd); dd = dd ./ max(dd);
		ee = e(j);
		ee = ee - min(ee); ee = ee ./ max(ee);
		pp = splinep(ee, z(j), theSlopeFlag);
		if i == 1
			dd = d12;
		elseif i == 2
			dd = d23;
		elseif i == 3
			dd = fliplr(1-d12);
		elseif i == 4
			dd = fliplr(1-d23);
		end
		zz(j) = ppval(pp, dd);
	end
	zz(end) = [];
	u = zeros(m, n);
	v = zeros(m, n);
	u(index) = real(zz);
	v(index) = imag(zz);
	u = fps(u);
	v = fps(v);
else   % Use Mex-file.
	seta = e12;
	sxi = e23 * e23_scale;   % Note.
	for i = 1:4
		j = c(i):c(i+1);
		ee = e(j);
		ee = ee - min(ee); ee = ee ./ max(ee);
		if i == 1
			pp = splinep(ee, z(j), theSlopeFlag);
			zz(j) = ppval(pp, e12);
		elseif i == 2
			pp = splinep(ee, z(j), theSlopeFlag);
			zz(j) = ppval(pp, e23);
		elseif i == 3
			pp = splinep(ee, z(j), theSlopeFlag);
			zz(j) = ppval(pp, fliplr(1-e12));
		elseif i == 4
			pp = splinep(ee, z(j), theSlopeFlag);
			zz(j) = ppval(pp, fliplr(1-e23));
		end
	end
	zz(end) = [];
	u = zeros(m, n);
	v = zeros(m, n);
	u(index) = real(zz);
	v(index) = imag(zz);
	[u, v] = mexsepeli(u, v, m-1, n-1, sxi, seta);   % Note calling sequence.
end

uu = del2(u);
vv = del2(v);
laplacian = norm(uu(2:end-1, 2:end-1)) + norm(vv(2:end-1, 2:end-1))

subplot(2, 1, 2)
plot(u, v, u.', v.')
title gridded, xlabel x, ylabel y
axis equal
zoomsafe 0.9, zoomsafe
