how to make a smooth spline connection at endpoints?

2 Ansichten (letzte 30 Tage)
mark palmer
mark palmer am 26 Mär. 2020
Kommentiert: mark palmer am 26 Mär. 2020
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 Kommentare
darova
darova am 26 Mär. 2020
What happens if you do spline twice (add the same points)?
mark palmer
mark palmer am 26 Mär. 2020
I thought of that too last night, will try, but I suspect there should be a more elegant solution.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Ameer Hamza
Ameer Hamza am 26 Mär. 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 Kommentar
Akira Agata
Akira Agata am 26 Mär. 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,:))

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Spline Postprocessing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by