# how to get one shape out of multiple shapes

6 views (last 30 days)

Show older comments

Asliddin Komilov
on 13 Dec 2023

Commented: Asliddin Komilov
on 22 Dec 2023

Hi,

I have multiple shapes I need to merge into a single shape, because I have sets of shapes those I have to merge and compare with each other (put into a one plot).

the set of data is attached and I can plot it like this:

plot(X(:, [1:end 1])', Y(:, [1:end 1])')

let me know, if you know how to do it, thanks.

I got this shape using patch, but it generated a Patch file that I cannot use.

Ideally, I would like my data was interpolated so the final shape will not have sharp edges but be smooth and go down to Y=0.

Help me handle that too if you can. thanks

##### 1 Comment

Dyuman Joshi
on 13 Dec 2023

"I got this shape using patch, but it generated a Patch file that I cannot use."

You can't use the patch object or you can't use the output generated?

What is the expected output? It will be helpful if you can show an illustration.

### Accepted Answer

DGM
on 13 Dec 2023

patch() doesn't create a file. If you created a file somehow, nobody knows how you did it.

I'm not sure where this is going, but here's a guess.

% loads X,Y

load data.mat

% get rid of NaNs

xhasnans = any(isnan(X),2);

yhasnans = any(isnan(Y),2);

goodrows = ~(xhasnans | yhasnans);

X = X(goodrows,:);

Y = Y(goodrows,:);

% find convex hull

K = convhull(double(X),double(Y));

Xh = X(K);

Yh = Y(K);

% plot the convex hull, show the curve endpoint

plot(Xh,Yh); hold on

plot(X(1),Yh(1),'o')

% get rid of the base of the curve

Xh = Xh(3:end-1);

Yh = Yh(3:end-1);

% extrapolate to Y=0 from last 10 datapoints

Np = 10; % number of points to use

% the right-hand part of the curve

Yhr = Yh(1:Np);

Xhr = Xh(1:Np);

Yexr = [0;Yhr];

Xexr = interp1(Yhr,Xhr,Yexr,'linear','extrap');

% the left-hand part of the curve

Yhl = Yh(end-Np+1:end);

Xhl = Xh(end-Np+1:end);

Yexl = [Yhl;0];

Xexl = interp1(Yhl,Xhl,Yexl,'linear','extrap');

% put them back together

Xex = [Xexr; Xh(Np+1:end-Np); Xexl];

Yex = [Yexr; Yh(Np+1:end-Np); Yexl];

% close the curve (if needed

Xex = Xex([1:end 1]);

Yex = Yex([1:end 1]);

% plot the extraploated curve, show the endpoint

plot(Xex,Yex,'--')

plot(Xex(1),Yex(1),'*')

##### 3 Comments

DGM
on 14 Dec 2023

### More Answers (2)

Mathieu NOE
on 13 Dec 2023

hello

try this

x = double(X(:));

y = double(Y(:));

% remove nan

id = isnan(x) & isnan(y);

x(id) = [];

y(id) = [];

% k = boundary(___,s) specifies shrink factor s using any of the previous syntaxes.

% s is a scalar between 0 and 1. Setting s to 0 gives the convex hull,

% and setting s to 1 gives a compact boundary that envelops the points.

% The default shrink factor is 0.5.

s = 0.1;

k = boundary(x,y,s);

x_out = x(k);

y_out = y(k);

% find lower left "corner" point to make extrapolation towards Y = 0

[mx,ix1] = min(x_out);

my = y_out(ix1);

ind = find(x_out<(mx+1));

slope = mean(diff(y_out(ind))./diff(x_out(ind)));

x_lower_left = mx - my/slope;

% find lower right "corner" point to make extrapolation towards Y = 0

[mx,ix2] = max(x_out);

my = y_out(ix2);

ind = find(x_out>(mx-1));

slope = mean(diff(y_out(ind))./diff(x_out(ind)));

x_lower_right = mx - my/slope;

% add those two new points to x_out and y_out

x_out2 = [x_out(1:ix2-1); x_lower_right; x_out(ix2:ix1); x_lower_left; x_out(ix1+1:end) ] ;

y_out2 = [y_out(1:ix2-1); 0 ; y_out(ix2:ix1); 0 ; y_out(ix1+1:end) ] ;

plot(x,y, '*', x_out, y_out, '-*r', x_out2, y_out2, '-g')

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!