![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/174889/image.png)
Tight Boundary around a Set of Points
18 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Jason Nicholson
le 16 Août 2016
Modifié(e) : Jason Nicholson
le 4 Jan 2018
I want to draw a tight boundary around a set of points. The code is used below to draw the black boundary around the blue points. The red areas show areas that are not tight enough for my application. Does anyone have a suggestion on how to get a tighter boundary? The data is attached.
clc; clear; close all;
load('xy.mat')
xy = [x y];
plot(xy(:,1), xy(:,2),'.')
grid on;
hold all;
xyNormalized = xy;
for iColumn = 1:2
minValue = min(xy(:,iColumn));
maxValue = max(xy(:,iColumn));
xyNormalized(:,iColumn) = (xy(:,iColumn)-minValue)/(maxValue - minValue);
end
k = boundary(xyNormalized,1);
xyBoundary = xy(k,:);
h = plot(xyBoundary(:,1), xyBoundary(:,2),'k');
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/155798/image.jpeg)
0 commentaires
Réponse acceptée
Thorsten
le 16 Août 2016
Modifié(e) : Thorsten
le 17 Août 2016
[ux, ia, ib] = uniquetol(x, 0.01);
for i= 1:max(ib), M(i,:) = [min(y(ib == i)) max(y(ib == i))]; end
plot(x, y, '.')
hold on
plot(ux, M(:,1), 'r-')
plot(ux, M(:,2), 'r-')
This is how it looks like
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/174889/image.png)
Plus de réponses (2)
FirefoxMetzger
le 16 Août 2016
This draws a boundary along the highest elements of each class, the lowest elements of each class and has the left and right outer classes as boundary:
load('xy.mat')
xy = [x y];
plot(xy(:,1), xy(:,2),'.')
grid on;
hold all;
%split data into classes and find max/min for each class
class_label = unique(x);
upper_boundary = zeros(size(class_label));
lower_boundary = zeros(size(class_label));
for idx = 1:numel(class_label)
class = y(x == class_label(idx));
upper_boundary(idx) = max(class);
lower_boundary(idx) = min(class);
end
% plot a nice boundary in red
left_boundary = y(x == class_label(1));
right_boundary = y(x == class_label(end));
plot(class_label(1)*ones(size(left_boundary)),left_boundary,'r')
plot(class_label,upper_boundary,'r')
plot(class_label(end)*ones(size(right_boundary)),right_boundary,'r')
plot(class_label,lower_boundary,'r')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/174890/image.png)
3 commentaires
Sinvaldo Moreno
le 24 Déc 2017
I believe the fast and easy way is get the boundaries:
% code
load('xy.mat');
xy = [x y]
[k, v] = boundary(xy(:,1),xy(:,2));
plot(xy(:,1), xy(:,2),'.');
hold on;
plot(xy(k,1),xy(k,2));
Voir également
Catégories
En savoir plus sur Bounding Regions dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!