# Interpolation of 3D point data

264 views (last 30 days)
shellmcg on 19 Apr 2016
Commented: Adam Danz on 19 Dec 2019
Hello, I have a nx5 matrix where column 3, 4 and 5 are x,y,z 3D points respectively. I was wondering how I would interpolate (smooth) this 3D data. Many thanks
shellmcg on 20 Apr 2016
Hi Walter, I was looking at a spline fit.

John D'Errico on 29 Apr 2016
Edited: John D'Errico on 29 Apr 2016
You can use my interparc tool, as found on the file exchange. It is designed to solve exactly this problem, in 2 or more dimensions.
xyz = interparc(1000,x,y,z,'spline');
xyz will be a 1000x3 array, where each row is an interpolated point on the curve.
Of course, you can do the interpolation in other ways. If you want to do the work in MATLAB yourself in much the same way as you tried to do it:
t = [0;cumsum(sqrt(diff(x).^2+diff(y).^2+diff(z).^2))];
t = t/t(end);
ti = linspace(0,1,1000);
xx = spline(t,x,ti);
yy = spline(t,y,ti);
zz = spline(t,z,ti);
The above solution, which uses a cumulative piecewise linear arclength as the parameter for interpolation, deals more properly with points that are not uniformly spaced.

Walter Roberson on 20 Apr 2016
It looks to me as if you likely want a scattered interpolant.
##### 2 CommentsShowHide 1 older comment
Adam Danz on 19 Dec 2019

shellmcg on 28 Apr 2016
Figured this Question out
Inter_p= linspace(1,length(Data),1000); %create a array of points within the length of the data
xx=spline(1:length(Data),x,Inter_p); % use points created above to interpolate x,y,and z
yy=spline(1:length(Data),y,Inter_p);
zz=spline(1:length(Data),z,Inter_p);
John D'Errico on 28 Apr 2016
I'm sorry, but this answer is just a poor way of solving the problem, presuming the points are somehow equally spaced. Use of a spline as was done here can cause some strange artifacts.