Как убрать внутренние края из объектов в Matlab? - PullRequest
0 голосов
/ 09 января 2019

Допустим, у меня есть массив объектов objects, и каждый объект содержит vertices

Так, например, скажем, у меня есть 2 objects, каждый из которых содержит 4 vertices, и я строю вершины и соединяю их, используя линию в Matlab:

size_vertices=size(vertices);

for o=1:length(objects)
    for v=1:size_vertices(1)-1
        plot([vertices(o, v,1) vertices(o, v+1,1)], [vertices(o,v,2) vertices(o,v+1,2)], '-k' )
    end
end

Так скажем vertices(1,:,:)=[1 5; 1 1; 5 1; 4 6]

и vertices(2,:,:)=[5 10; 3 8; 1 5; 4 6]

Теперь, скажем, у меня есть произвольное количество объектов (например, в порядке от 1 до 6 на диаграмме ниже), и каждый объект может содержать произвольное количество вершин (а не только 4, как в примере выше) , (Эллипсы не являются частью ребер, они просто указывают, где находятся вершины)

Есть ли способ удалить внутренние края с помощью Matlab?

1 Ответ

0 голосов
/ 09 января 2019

Как заметил Крис в комментарии, нам нужно рассчитать внешний вид каждого ребра, и построить только те, которые появились только один раз. Функция tabulate позволяет нам достичь этого:

% Test Data
clc; clear;
vertices{1}=[1 5; 1 1; 5 1; 4 6];
vertices{2}=[5 10; 3 8; 1 5; 4 6];

% To ensure every objects are closed
for ii=1:length(vertices)
  vertices{ii}=[vertices{ii}; vertices{ii}(1,:)];  
end

% Save Egdes
edges{1}=num2str([0 0 0 0]);
for o=1:length(vertices)
    for v=1:size(vertices{o},1)-1
        tmp1=[vertices{o}(v,1) vertices{o}(v+1,1)];
        tmp2=[vertices{o}(v,2) vertices{o}(v+1,2)];
        if tmp1(1) == tmp1(2)
            tmp2=sort(tmp2);
        end
        [~,indi]=sort(tmp1);
        edges{end+1}=num2str([tmp1(indi) tmp2(indi)]);
    end
end

% Calcualte the number of appearence of each edges
sta=tabulate(edges);
figure(1); hold on
for ii=2:size(sta,1)
  if sta{ii,2} > 1
      continue
  end
  tmp=str2num(sta{ii,1});
  plot(tmp(1:2),tmp(3:4), '-k' )
end
axis([0 6 0 11])

Обратите внимание, что я изменил vertices на CellArray, так как в вашем конечном результате есть треугольник, а не только четырехугольники.

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