Filter löschen
Filter löschen

Interpolating [X Y Z V] values on cylinder surface

13 Ansichten (letzte 30 Tage)
Ionesco
Ionesco am 25 Aug. 2021
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?

Akzeptierte Antwort

Wan Ji
Wan Ji am 25 Aug. 2021
Bearbeitet: Wan Ji am 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 Kommentare
Wan Ji
Wan Ji am 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 am 5 Jul. 2022
How if using excel file? Like the coordinates, nodes, and the value of stress?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by