Применить операции к массиву ячеек, где каждая ячейка является многоугольником - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть некоторые проблемы, которые требуют от меня манипулирования полигонами с использованием таких операций, как перемещение, расширение, вращение и сдвиг.Данные, которые у меня есть, на самом деле о границах штатов и геометрии из data.gov о штате Делавэр.Функция delaware.m возвращает массив ячеек (1x3 ячейка) с полигональными матрицами, описывающими форму состояния Делавера, и именно с этой формой мне нужно выполнить операции.Я опубликую конкретные вопросы, чтобы вы могли понять, о чем меня спрашивают, но я все же прошу более общих указаний, чем конкретный ответ на каждый вопрос.

  1. Переведите состояние Делавера так, чтобы его центр находился приблизительно в начале координат.
  2. Расширьте переведенное состояние Делавера так, чтобы оно соответствовало квадрату длины стороны, центрированной вorigin.
  3. Поверните переведенное расширенное состояние Делавэра так, чтобы округ Нью-Касл находился внизу, а Суссекс - вверху.
  4. Расширяйте переведенное, расширенное, повернутое состояние Делавера без измененияего площадь, так что он примерно такой же ширины, как и высокий.
  5. Сдвиньте переведенный, расширенный, повернутый, расширенный штат Делавэр, самый северный конец которого находится по крайней мере в 2 единицах справа от самого южного конца.

Дело в том, что я знаю, как выполнять все эти операции в Matlab только с одним полигоном / матрицей.Я в основном борюсь с тем, как использовать это с массивом ячеек.

Например, скажем, у меня есть матрица S.

newS=S+[1;2]; %move S one unit to the right and two units up

R=[sqrt(2)/2  -sqrt(2)/2; sqrt(2)/2  sqrt(2)/2];
newS=R*S  %rotate the polygon by 45 degrees

D = [alpha 0; 0 beta]; 
%alpha is the dilation scaling the x direction and beta in the y direction
%left multiply S by this dilation matrix to dilate along the cardinal axes

Sh=[1 y; 0 1] %y controls the amount of shearing
%left multiply by S to shear a shape along the x-axis relative to the y-axis

Так, например, когда я пытаюсь выполнить операцию для перемещения фигуры вверх / вниз / влево / вправо, как я описал вышедля массива я получаю сообщение об ошибке Undefined operator '+' for input arguments of type 'cell'.

Я также пытался:

DEBoundary1 = cellfun(@sum, DEBoundary, [75.562;-39.6]); 
%this is how much I wanted to move the polygons

Но получил:

>> Lab_code
Error using cellfun
All of the input arguments must be of the same size and shape.
Previous inputs had size 1 in dimension 1. Input #3 has size 2

Полагаю, в целом, этоЕсть ли простой способ взять эти операции, которые я уже знаю, и применить их к массиву ячеек, состоящему из многоугольников?Или я должен пойти по другому пути?

1 Ответ

1 голос
/ 23 сентября 2019

Я считаю, что это то, что вы пытаетесь сделать с вашим примером +:

DEBoundary = {[0 1 -1 0; 1 -1 -1 1], [0 -1 1 0; 1 1 1 1]};
offset = [3;-2];

DEBoundary1 = cellfun(@(c) c + offset, DEBoundary, 'UniformOutput', false)

Что это значит:

cellfun(@(c)                   % c is each element in the cell
            c + offset         % add the offset to each element
                      , DEB    % The cell array to operate on
        'UniformOutput', 0)    % Specifies that the output is a cell and not a scalar

Попробуйте онлайн!

Если вы что-то путаете с cellfun, то вы можете сделать это вручную:

DEBoundary1 = cell(size(DEBoundary))
for i = 1:numel(DEBoundary)
   DEBoundary1{i} = DEBoundary{i} + offset;
end

Это должно работать и с умножением, и с другими операциями, если толькосоответствие размеров (но это математический вопрос, а не специфический для MATLAB).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...