# How to select, or filter, the external border/boundary in a set of (x,y)-points?

10 views (last 30 days)
Sim on 10 Jul 2023
Commented: MarKf on 7 Aug 2023
Given two or more set of points (please see attached, as example, two sets of points called "b1" and "b2", that are stored in "borders.mat"), how can I select or filter the common external border/boundary from the union of those point datasets?
After joining the two datasets, I would like to keep only the points that represent the total common external border (i.e. removing any common set of points or any "internal" point). Here, in this example, I show only two set of points, but I have many of them.
hold on
plot(b1(:,1),b1(:,2))
plot(b2(:,1),b2(:,2))

Dyuman Joshi on 10 Jul 2023
%Original figure
plot(b1(:,1),b1(:,2))
hold on
plot(b2(:,1),b2(:,2))
%Obtain coordinates corresponding to outside border by performing
%exclusive OR on the data
z=setxor(b1,b2,'rows','stable');
%'stable' option is to maintain the order of the coordinates
%plot the boundary
figure
plot(z(:,1),z(:,2),'k')

MarKf on 10 Jul 2023
As in
b1 = borders.b1; b2 = borders.b2;
idx_common = ismember(b1,b2,'rows');
coordsincommon = b1(idx_common,:); %169
It seems that they are the exact same coordinates, so this works, tho I haven't checked if it captures them all, otherwise there is also ismembertol
Sim on 11 Jul 2023
Hi @MarKf! Thanks for your reply! I tried to compare both methods here proposed, but, unless I misinterpreted your method or I did something wrong, I do not get the desired result.... :-)
b1 = borders.b1; b2 = borders.b2;
% Dyuman Joshi's Method
c=setxor(b1,b2,'rows','stable');
plot(c(:,1),c(:,2),'r')
% MarKf's Method
d=b1(ismember(b1,b2,'rows'),:);
plot(d(:,1),d(:,2),'b','linewidth',2)
MarKf on 7 Aug 2023
Yeah the accepted answer is what you want more straightfowardly, setxor being the opposite of ismember (very useful but there is no tolerance version).
I showed how you can get those common points, answering your specific "how can I select [or filter] the common external border/boundary from the union of those point datasets?" query, you could've then used the index provided (idx_common) to filter them out. You plotted only the common boundary points directly (last point seem to get captured first or viceversa).