how to make a smooth spline connection at endpoints?

4 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)

Categories

Find more on Spline Postprocessing in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!