假设我有一个对象数组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去除内部边缘?
答案 0 :(得分:1)
正如Cris在评论中所注意到的,我们需要计算每个边缘的外观,并只绘制出现一次的轮廓。函数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,因为有一个三角形,不仅最终结果是四边形。