Perform boolean operation on polygon(s) using the Clipper library.
inpol = Nx2 matrix of (X, Y) coordinates constituting the polygons(s) to be clipped. Polygons are separated by [NaN NaN] rows. clippol = another Nx2 matrix of (X, Y) coordinates representing the clip polygon(s).
Optional argument op, the boolean operation, can be:
In addition a rule can be specified to instruct polyclip how to assess holes, or rather, how to assess polygon fill. This works as follows: start with a winding number of zero (0). From a point outside all polygons specified in INPOL, go to the center of the innermost polygon and note which polygons are crossed. For each polygon boundary crossing from right to left, increase the winding number, while for each polygon crossing from left to right, decrement it, and then assign it to the crossed polygon. rules and rulec can be set individually for subject and clip polygons, respectively, as follows:
(for details see [1])
Output array outpol will be an Nx2 array of polygons resulting from the requested boolean operation, or in case of just one input argument an Nx1 array indicating winding direction of each subpolygon in input argument inpol.
[1]: http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm
See also: clipPolygon_mrf,clipPolygon.
The following code
pol1 = [2 2; 6 2; 6 6; 2 6; 2 2; NaN NaN; 3 3; 3 5; 5 5; 5 3; 3 3];
pol2 = [1 2; 7 4; 4 7; 1 2; NaN NaN; 2.5 3; 5.5 4; 4 5.5; 2.5 3];
lw = 2;
subplot (2, 7, [1 2])
pol1a = polygon2patch (pol1);
patch (pol1a(:, 1), pol1a(:, 2), 'facecolor', 'c', 'edgecolor', 'k', 'linewidth', lw);
axis image
title ("1. Subject polygon")
axis off
subplot (2, 7, [3 4])
patch (pol1a(:, 1), pol1a(:, 2), 'facecolor', 'c', 'edgecolor', 'none');
hold on
pol2a = polygon2patch (pol2);
patch (pol2a(:, 1), pol2a(:, 2), 'facecolor', 'y', 'edgecolor', 'b', 'linewidth', lw);
axis image
title "2. Clip polygon"
axis off
op = {"Sub - clip", "AND / Intersection", "Exclusive OR", "OR / Union"};
for i=1:numel(op)
subplot (6, 4, [12 16]+i);
[opol, npol] = clipPolygon_clipper (pol1, pol2, i-1);
opol = polygon2patch (opol);
patch (pol1a(:, 1), pol1a(:, 2), 'facecolor', 'c', 'edgecolor', 'none');
hold on
patch (pol2a(:, 1), pol2a(:, 2), 'facecolor', 'y', 'edgecolor', 'none');
patch (opol(:,1),opol(:,2), 'facecolor', 'g', 'edgecolor', 'r', ...
'linewidth', lw);
axis image
grid on
title (sprintf("%d. %s", i+3, op{i}));
axis off
endfor
subplot (2, 7, [6 7]);
[opol, npol] = clipPolygon_clipper (pol2, pol1, 0);
opol = polygon2patch (opol);
patch (pol1a(:, 1), pol1a(:, 2), 'facecolor', 'c', 'edgecolor', 'none');
hold on
patch (pol2a(:, 1), pol2a(:, 2), 'facecolor', 'y', 'edgecolor', 'none');
patch (opol(:,1),opol(:,2), 'facecolor', 'g', 'edgecolor', 'r', ...
'linewidth', lw);
axis image
grid on
axis off
title "3. Clip - sub";
Produces the following figure
| Figure 1 |
|---|
![]() |
Package: geometry