polybool

Задайте операции для полигональных областей

polybool не рекомендуется. Использовать polyshape вместо этого.

Как заменить вызовы на polybool, создать polyshape объекты, чтобы представлять фигуры, вызывают соответствующую polyshape функция объекта для эквивалентной логической операции, а затем вызов polyshape boundary функция объекта. Для примера этот вызов на polybool задает операцию объединения как первый аргумент.

[Cx,Cy] = polybool('union',Ax,Ay,Bx,By)
Чтобы обновить это использование, создайте отдельные polyshape объекты для каждой формы, а затем используйте union функция объекта, связанная с polyshape объект. polyshape поддерживает логические операции, поддерживаемые polybool: объединение, пересечение, вычитание и исключающее ИЛИ. Используйте polyshape boundary функция объекта для возврата Cx и Cy. Посмотрите polyshape полный список функций объекта, включая plot.
A = polyshape(Ax,Ay,'Simplify',false); 
B = polyshape(Bx,By,'Simplify',false); 
C = union(A,B);
[Cx,Cy] = boundary(C);
Обратите внимание, что порядок вершин многоугольника, вероятно, будет отличаться между выходными данными polybool и выход вызова на boundary, потому что нет единого правильного ответа. (Даже в простом однооборотном многоугольнике вершины можно переместить циклически, не влияя на базовую геометрию.) В сложение, если геометрии входов не идеально чисты (свободны от самопересечений и т.д.), то polyshape union операция может вносить небольшие изменения, которые не обязательно выполняются в polybool.

Описание

пример

[x,y] = polybool(flag,x1,y1,x2,y2) выполняет операцию набора многоугольников, идентифицированную flag. Результат выводится с использованием того же формата, что и вход. Географические данные, охватывающие полюс, не могут использоваться непосредственно. Использовать flatearthpoly для преобразования многоугольников, содержащих полюс, в Декартовы координаты.

Большинство функций Mapping Toolbox™ соответствуют соглашению о том, что отдельные контуры с вершинами по часовой стрелке являются внешними контурами, а отдельные контуры с вершинами против часовой стрелки являются внутренними контурами. Хотя и polybool функция игнорирует порядок вершин, соблюдайте это соглашение при создании контуров, чтобы гарантировать согласованность с другими функциями.

Примеры

свернуть все

theta = linspace(0, 2*pi, 100);
x1 = cos(theta) - 0.5;
y1 = -sin(theta);    % -sin(theta) to make a clockwise contour
x2 = x1 + 1;
y2 = y1;
[xa, ya] = polybool('union', x1, y1, x2, y2);
[xb, yb] = polybool('intersection', x1, y1, x2, y2);
[xc, yc] = polybool('xor', x1, y1, x2, y2);
[xd, yd] = polybool('subtraction', x1, y1, x2, y2);

subplot(2, 2, 1)
patch(xa, ya, 1, 'FaceColor', 'r')
axis equal, axis off, hold on
plot(x1, y1, x2, y2, 'Color', 'k')
title('Union')

subplot(2, 2, 2)
patch(xb, yb, 1, 'FaceColor', 'r')
axis equal, axis off, hold on
plot(x1, y1, x2, y2, 'Color', 'k')
title('Intersection')

subplot(2, 2, 3)
% The output of the exclusive-or operation consists of disjoint
% regions.  It can be plotted as a single patch object using the
% face-vertex form.  Use poly2fv to convert a polygonal region
% to face-vertex form.
[f, v] = poly2fv(xc, yc);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, hold on
plot(x1, y1, x2, y2, 'Color', 'k')
title('Exclusive Or')

subplot(2, 2, 4)
patch(xd, yd, 1, 'FaceColor', 'r')
axis equal, axis off, hold on
plot(x1, y1, x2, y2, 'Color', 'k')
title('Subtraction')

Ax = {[1 1 6 6 1], [2 5 5 2 2], [2 5 5 2 2]};
Ay = {[1 6 6 1 1], [2 2 3 3 2], [4 4 5 5 4]};
subplot(2, 3, 1)
[f, v] = poly2fv(Ax, Ay);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Ax), plot(Ax{k}, Ay{k}, 'Color', 'k'), end
title('A')

Bx = {[0 0 7 7 0], [1 3 3 1 1], [4 6 6 4 4]};
By = {[0 7 7 0 0], [1 1 6 6 1], [1 1 6 6 1]};
subplot(2, 3, 4);
[f, v] = poly2fv(Bx, By);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Bx), plot(Bx{k}, By{k}, 'Color', 'k'), end
title('B')

subplot(2, 3, 2)
[Cx, Cy] = polybool('union', Ax, Ay, Bx, By);
[f, v] = poly2fv(Cx, Cy);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Cx), plot(Cx{k}, Cy{k}, 'Color', 'k'), end
title('A \cup B')

subplot(2, 3, 3)
[Dx, Dy] = polybool('intersection', Ax, Ay, Bx, By);
[f, v] = poly2fv(Dx, Dy);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Dx), plot(Dx{k}, Dy{k}, 'Color', 'k'), end
title('A \cap B')

subplot(2, 3, 5)
[Ex, Ey] = polybool('subtraction', Ax, Ay, Bx, By);
[f, v] = poly2fv(Ex, Ey);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Ex), plot(Ex{k}, Ey{k}, 'Color', 'k'), end
title('A - B')

subplot(2, 3, 6)
[Fx, Fy] = polybool('xor', Ax, Ay, Bx, By);
[f, v] = poly2fv(Fx, Fy);
patch('Faces', f, 'Vertices', v, 'FaceColor', 'r', ...
  'EdgeColor', 'none')
axis equal, axis off, axis([0 7 0 7]), hold on
for k = 1:numel(Fx), plot(Fx{k}, Fy{k}, 'Color', 'k'), end
title('XOR(A, B)')

Входные параметры

свернуть все

Операция набора многоугольников, заданная как одно из следующих значений.

Операция     
Перекресток области'intersection''and''&'  
Региональное объединение'union''or''|''+''plus'
Вычитание области'subtraction''minus''-'  
Область эксклюзивный или'exclusiveor''xor'   

Типы данных: char | string

Многоугольники, заданные как NaN-делимитированный вектор или массив ячеек.

Типы данных: double

Многоугольники, заданные как NaN-делимитированный вектор или массив ячеек.

Типы данных: double

Многоугольники, заданные как NaN-делимитированный вектор или массив ячеек.

Типы данных: double

Многоугольники, заданные как NaN-делимитированный вектор или массив ячеек.

Типы данных: double

Выходные аргументы

свернуть все

Многоугольник после заданной операции, возвращенный как NaN-делимитированный вектор или массив ячеек. Выход возвратов в том же формате, что и вход.

Многоугольник после заданной операции, возвращенный как NaN-делимитированный вектор или массив ячеек. Выход возвратов в том же формате, что и вход.

Совет

  • Числовые проблемы могут возникнуть, когда многоугольники имеют большое смещение от источника. Чтобы избежать этой проблемы, перед выполнением операции переведите координаты в местоположение ближе к источнику. Затем отмените перевод после завершения операции. Для примера:

    [x,y] = polybool(flag,x1-xt,y1-yt,x2-xt,y2-yt);

    x = x+xt;

    y = y+yt;

Представлено до R2006a
Для просмотра документации необходимо авторизоваться на сайте