exponenta event banner

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