How to draw a 3D surface with all the given discrete points?
40 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Danny
el 4 de Dic. de 2023
Comentada: Mathieu NOE
el 4 de Dic. de 2023
I am trying to draw data from several curves into a 3D surface. I have extracted the points in the curves as discrete data points and tried to draw a surface plot based on scatter data. The problem is that discrete points in each curve may have multiple Z-values at the same X-Y coordinate. Command 'griddata' and 'surf' have been used, but it gives warning of duplicate data points have been detected and averaged.
I have realized that the rule of 'griddata' is that only the unique Z-value can be used in the xy plane, otherwise the average will be used. The data is contained in the attachment, and the code and results are given below.
close all; clear all
load XYZ_data
scatter3(x,y,z)
% figure
[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4');
figure,surf(X,Y,Z);
figure,meshc(X,Y,Z)
How can I get a smooth surface with all the given data? Any comments will be much appreciated.
0 comentarios
Respuesta aceptada
Mathieu NOE
el 4 de Dic. de 2023
hello
of course I tried the standard solutions (surfir, griddata etc...) but as your shape is very specific , therefore also a specific code for you
try this
load XYZ_data
samples = numel(x);
[xu,ia,ic] = unique(x);
unique_curves = numel(ia);
N = samples/unique_curves; % this is length of one curve
% main loop
for k =1:N
ind = k:N:samples;
xx = x(ind);
yy = y(ind);
zz = z(ind);
% Interpolate the scattered data
xd(k,:) = linspace(min(xx),max(xx),100);
yd(k,:) = interp1(xx,yy,xd(k,:));
zd(k,:) = interp1(xx,zz,xd(k,:));
end
figure
subplot(1,2,1)
scatter3(x,y,z,8,'.k')
title('data points')
subplot(1,2,2)
h = surf(xd,yd,zd);
set(h,'edgecolor','none')
title('surface plot')
2 comentarios
Más respuestas (1)
Chunru
el 4 de Dic. de 2023
Editada: Chunru
el 4 de Dic. de 2023
load(websave("XYZ_data.mat", "https://www.mathworks.com/matlabcentral/answers/uploaded_files/1559554/XYZ_data.mat"))
whos
figure
T = delaunay(x, y);
% Seems that there are duplicate point for x, y (in addition to z?)
trisurf(T, x, y, z, "EdgeColor","none", "FaceColor","interp");
xlabel("x"); ylabel("y")
view(80, 30)
Ver también
Categorías
Más información sobre Interpolation en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!