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

7 views (last 30 days)
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.
load("borders.mat")
hold on
plot(b1(:,1),b1(:,2))
plot(b2(:,1),b2(:,2))

Accepted Answer

Dyuman Joshi
Dyuman Joshi on 10 Jul 2023
load("borders.mat");
%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')

More Answers (1)

MarKf
MarKf on 10 Jul 2023
As in
borders = load(websave('rd', "https://nl.mathworks.com/matlabcentral/answers/uploaded_files/1430803/borders.mat"));
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
  2 Comments
Sim
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.... :-)
% Load data
borders = load(websave('rd', "https://nl.mathworks.com/matlabcentral/answers/uploaded_files/1430803/borders.mat"));
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
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).

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!