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

9 vues (au cours des 30 derniers jours)
Sim
Sim le 10 Juil 2023
Commenté : MarKf le 7 Août 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.
load("borders.mat")
hold on
plot(b1(:,1),b1(:,2))
plot(b2(:,1),b2(:,2))

Réponse acceptée

Dyuman Joshi
Dyuman Joshi le 10 Juil 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')

Plus de réponses (1)

MarKf
MarKf le 10 Juil 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 commentaires
Sim
Sim le 11 Juil 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 le 7 Août 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).

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by