how to make a smooth spline connection at endpoints?

5 views (last 30 days)
I can draw a smooth spline across points but when I try to join the end to the beginning I get a sharp corner instead of a smooth connection. How can I smooth out the endpoint connection to make a smoothly shaped blob? Here's my code:
x1 = [0 2 1 4 3 2];
y1 = [1 0 2 1 3 2];
tnum = 1000;
t = linspace(0,1,tnum);
x1 = [x1 x1(1)]; % ADDING THE FIRST POINT TO THE END
y1 = [y1 y1(1)]; % ADDING THE FIRST POINT TO THE END
[xt yt] = ParametricSpline(x1, y1);
xref = ppval(xt, t);
yref = ppval(yt, t);
plot(x1, y1, 'o', xref, yref);
function [xtF, ytF] = ParametricSpline(x,y)
arc_length = 0;
n = length(x);
t = zeros(n, 1);
for i=2:n
arc_length = sqrt((x(i)-x(i-1))^2 + (y(i)-y(i-1))^2);
t(i) = t(i-1) + arc_length;
end
t=t./t(length(t));
xtF = spline(t, x);
ytF = spline(t, y);
end
  2 Comments
darova
darova on 26 Mar 2020
What happens if you do spline twice (add the same points)?
mark palmer
mark palmer on 26 Mar 2020
I thought of that too last night, will try, but I suspect there should be a more elegant solution.

Sign in to comment.

Accepted Answer

Ameer Hamza
Ameer Hamza on 26 Mar 2020
Try csape:
x1 = [0 2 1 4 3 2];
y1 = [1 0 2 1 3 2];
tnum = 1000;
t = linspace(0,1,tnum);
x1 = [x1 x1(1)]; % ADDING THE FIRST POINT TO THE END
y1 = [y1 y1(1)]; % ADDING THE FIRST POINT TO THE END
[xt yt] = ParametricSpline(x1, y1);
xref = ppval(xt, t);
yref = ppval(yt, t);
plot(x1, y1, 'o', xref, yref);
function [xtF, ytF] = ParametricSpline(x,y)
arc_length = 0;
n = length(x);
t = zeros(n, 1);
for i=2:n
arc_length = sqrt((x(i)-x(i-1))^2 + (y(i)-y(i-1))^2);
t(i) = t(i-1) + arc_length;
end
t=t./t(length(t));
xtF = csape(t, x, 'perodic');
ytF = csape(t, y, 'perodic');
end
Result:
  1 Comment
Akira Agata
Akira Agata on 26 Mar 2020
Or you can use spline function, like:
x1 = [0 2 1 4 3 2];
y1 = [1 0 2 1 3 2];
x1 = [x1 x1(1)]; % ADDING THE FIRST POINT TO THE END
y1 = [y1 y1(1)]; % ADDING THE FIRST POINT TO THE END
t = linspace(0,2*pi,numel(x1));
pp = spline(t,[0 x1 0; -1 y1 -1]); % Assuming an endslope at (0,1) is (0, -1)
xy2 = ppval(pp, linspace(0,2*pi));
figure
scatter(x1,y1)
hold on
plot(xy2(1,:),xy2(2,:))

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!