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)

Описание

пример

[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