summaryrefslogtreecommitdiff
path: root/inst/clipPolyline.m
diff options
context:
space:
mode:
authorRafael Laboissière <rafael@debian.org>2020-02-09 05:51:46 -0300
committerRafael Laboissière <rafael@debian.org>2020-02-09 05:51:46 -0300
commita45e15f167ef0a7cba3e9ed572209f3522658320 (patch)
tree481982ed20977db86d2e3309ee5e709da54e2b79 /inst/clipPolyline.m
parent87f1c69f10eb490ae5bdfbd551ba386b58e199e3 (diff)
New upstream version 4.0.0
Diffstat (limited to 'inst/clipPolyline.m')
-rw-r--r--inst/clipPolyline.m74
1 files changed, 74 insertions, 0 deletions
diff --git a/inst/clipPolyline.m b/inst/clipPolyline.m
new file mode 100644
index 0000000..90cb8a7
--- /dev/null
+++ b/inst/clipPolyline.m
@@ -0,0 +1,74 @@
+## Copyright (C) 2017-2019 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 <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {} {@var{oline}} = clipPolyline (@var{inpol}, @var{clippol}, @var{op})
+## Clip (possibly composite) polylines with polygon(s) using one of boolean
+## methods.
+##
+## @var{inpol} = Nx2 matrix of (X, Y) coordinates constituting the polylines(s)
+## to be clipped. Polyline sections are separated by [NaN NaN] rows.
+## @var{clippol} = another Nx2 matrix of (X, Y) coordinates representing the
+## clip polygon(s). @var{clippol} may comprise separate and/or concentric
+## polygons (the latter with holes).
+##
+## The argument @var{op}, the boolean operation, can be:
+##
+## @itemize
+## @item 0: difference @var{inpol} - @var{clippol}
+##
+## @item 1: intersection ("AND") of @var{inpol} and @var{clippol} (= default)
+## @end itemize
+##
+## Output array @var{oline} will be an Nx2 array of polyline sections
+## resulting from the requested boolean operation.
+##
+## The optional argument @var{library} specifies which library to use for clipping.
+## Currently only @asis{"clipper"} is implemented.
+##
+## @seealso{clipPolygon}
+## @end deftypefn
+
+## Author: Philip Nienhuis <prnienhuis@users.sf.net>
+## Created: 2017-03-21
+
+function [olin, nlin] = clipPolyline (p1, p2, op, library = "clipper")
+
+ if ~(ismember (tolower (library), {"clipper"}))
+ error ('Octave:invalid-fun-call', "clipPolyline: unimplemented polygon clipping library: '%s'", library);
+ endif
+ [olin, nlin] = clipPolyline_clipper (p1, p2, op);
+
+endfunction
+
+
+%!demo
+%! sline = [0, 6.5; 1.25, 4; 1.25, 0; NaN, NaN; 0.25, 7; 1.75, 4; 1.75, 0];
+%! for ii=1:10
+%! sline = [sline; [NaN NaN]; [ii/2+0.25, 7; ii/2+1.75, 4; ii/2+1.75, 0]];
+%! endfor
+%! pol2a = [1 2; 7 4; 4 7; 1 2; 2.5 3; 4 5.5; 5.5 4; 2.5 3; 1 2];
+%! figure ();
+%! hold on
+%! patch (pol2a(:, 1), pol2a(:, 2), 'facecolor', 'y', 'edgecolor', 'b', 'linewidth', 2);
+%! [olin, nlin] = clipPolyline_clipper (sline, pol2a, 1);
+%! plot (olin(:, 1), olin(:, 2), 'r', 'linewidth', 3);
+%! [olin, nlin] = clipPolyline (sline, pol2a, 0);
+%! plot (olin(:, 1), olin(:, 2), 'g', 'linewidth', 3);
+%! grid on;
+%! box on;
+%! axis equal;
+%! legend ({"Clip polygon", "AND", "OR"});
+%! title ("Demo: clipping polylines with polygons");