## Copyright (C) 2016 Philip Nienhuis
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## This program 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 program. If not, see .
## -*- texinfo -*-
## @deftypefn {} {@var{outpol} =} joinPolygons (@var{inpol})
## Convert a cell style set of polygons into an array of subpolygons
## separated by NaN rows.
##
## @var{inpol} is expected to be an Nx1 (column) cell array with each cell
## containing either a matrix of Mx1 (X), Mx2 (X,Y), or Mx3 (X,Y,Z) coordinates.
##
## @var{outpol} is a numeric Px1, Px2 or Px3 array os subpolygons each
## separated by a row of NaN values.
##
## @seealso{splitPolygons}
## @end deftypefn
## Author: Philip Nienhuis
## Created: 2016-05-10
function [polys] = joinPolygons (poly)
if (! iscell (poly))
error ('Octave:invalid-input-arg', 'joinPolygons: cell array expected');
elseif (isempty (poly))
polys = [];
return
elseif (isvector (poly) && any (cellfun (@(p)isrow(p) && numel(p) != 1, poly)))
error ('Octave:invalid-input-arg', 'joinPolygons: column vectors expected');
endif
XY(1:2:2*size (poly, 1), :) = [{poly{:}}'];
XY(2:2:2*size (poly, 1) - 1, :) = NaN (1, size (poly{1}, 2));
polys = cell2mat (XY);
endfunction
%!test
%! assert (joinPolygons ({1,2}), [1 2]);
%!test
%! assert (joinPolygons ({}), []);
%!test
%! XY = joinPolygons ({[1 6; 2 5; 3 4]; [4 3; 5 2; 6 1]});
%! assert (XY, [1 6; 2 5; 3 4; NaN NaN; 4 3; 5 2; 6 1]);
%!error joinPolygons ([1 2 NaN 3 4], [56 NaN 78])
%!error joinPolygons ({[1,0], [0,2]});