How to draw a 3D surface with all the given discrete points?

44 ビュー (過去 30 日間)
Danny
Danny 2023 年 12 月 4 日
コメント済み: Mathieu NOE 2023 年 12 月 4 日
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.
Discrete data

採用された回答

Mathieu NOE
Mathieu NOE 2023 年 12 月 4 日
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 件のコメント
Danny
Danny 2023 年 12 月 4 日
Thank you! That's exactly what I wanted. You have solved my problem.
Best regards,
Danny
Mathieu NOE
Mathieu NOE 2023 年 12 月 4 日
my pleasure !

サインインしてコメントする。

その他の回答 (1 件)

Chunru
Chunru 2023 年 12 月 4 日
編集済み: Chunru 2023 年 12 月 4 日
load(websave("XYZ_data.mat", "https://www.mathworks.com/matlabcentral/answers/uploaded_files/1559554/XYZ_data.mat"))
whos
Name Size Bytes Class Attributes cmdout 1x33 66 char x 2870x1 22960 double y 2870x1 22960 double z 2870x1 22960 double
figure
T = delaunay(x, y);
Warning: Duplicate data points have been detected and removed.
Some point indices will not be referenced by the triangulation.
% 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)
  1 件のコメント
Danny
Danny 2023 年 12 月 4 日
Thanks Chunru.
Perhaps I should explain my question further. Actually, these discrete data come from 5 curves, and I want to draw a surface that contains these curves. In other words, I want to restore these data completely on a surface. Commands "trisurf" or "surf" do give the rough shape of the surface, but the key is how to preserve these duplicate values.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeInterpolation についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by