Interpolating [X Y Z V] values on cylinder surface

10 views (last 30 days)
I have four 1D arrays: x,y,z and v, representing (x,y,z) coordinates on a cylinder and v, the value (temperature) measured in that respective (x,y,z) point.
What I would like is to show the temperature distribution on the surface of the cylinder by interpolating these values. Something like this:
What I have managed is to scatter those points on the surface of the cylinder:
For the interpolation, I tried to use meshgrid and griddata, but I can't make it work.
function plot3D(x,y,z,v,m)
ddx=(2*pi*max(x))/m;
ddy=(2*pi*max(x))/m;
ddz=(max(z)-min(z))/m;
dx = min(x):ddx:max(x);
dy = min(y):ddy:max(y);
dz = min(z):ddy:max(z);
Tmin = min(v);Tmax=max(v);
[xqX,yqX,zqX] = meshgrid(dx,dy,dz);
vqX = griddata(x,y,z,v,xqX,yqX,zqX);
surf(xqX,yqX,zqX,vqX),hold on,
caxis([Tmin Tmax]);colormap('jet');shading interp;colorbar;
end
Any ideas if it is possible?

Accepted Answer

Wan Ji
Wan Ji on 25 Aug 2021
Edited: Wan Ji on 25 Aug 2021
Actually, scatteredInterpolant function is easy to implement what you think.
function plot3D(x,y,z,v,m)
% scatter3(x,y,z);
Tmin = min(v); Tmax = max(v);
radius = mean(sqrt(x.^2+y.^2)); % use mean radius as radius
theta = linspace(0, 2*pi,m+1); % divide theta to m segments
minZ = min(z); maxZ = max(z);
Z = linspace(minZ, maxZ, m+1); % divide z to m segments
[Z, T] = meshgrid(Z, theta); % create meshgrid with theta and z
X = radius.*cos(T); % calculate X and Y for mesh
Y = radius.*sin(T);
F = scatteredInterpolant(x,y,z,v,'linear'); % create interp handle
V = zeros(size(X));
V(:) = F(X(:),Y(:),Z(:)); % interp the value
Vave = 0.5*(V(end,:)+V(1,:)); % fix the minor flaw (average the beginnig and the end of corresponding theta)
V(end,:) = Vave; % fix the minor flaw
V(1,:) = Vave; % fix the minor flaw
surf(X,Y,Z,V,'edgecolor','none')
caxis([Tmin Tmax]);colormap('jet');shading interp;colorbar;
Now use this function to produce figure
load('xyzvm_cylinder.mat')
plot3D(x,y,z,v,40)
The result shows as following
  4 Comments
Wan Ji
Wan Ji on 25 Aug 2021
Hi, friend,
There still exists a flaw in my code, and I have fixed it. This flaw is due to the case that 2*pi and 0 are the same position for theta, so I averaged them to provide a fixed value.
Yours
Wan Ji
Simson Hutagalung
Simson Hutagalung on 5 Jul 2022
How if using excel file? Like the coordinates, nodes, and the value of stress?

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!