Создание поверхности из 3 векторов в MATLAB
У меня есть этот файл data.csv, который содержит 3 столбца. Теперь я пытаюсь создать 3D-модель, которая должна выглядеть примерно так.
Я просмотрел пару постов, которые нашел здесь, и попытался создать эту модель в Matlab, но все пошло не так. Это то, что я получаю.
Вот код, который я использовал для создания этих моделей.
close all; clear all;
X=xlsread('data.csv', '', 'A:A');
Y=xlsread('data.csv', '', 'B:B');
Z=xlsread('data.csv', '', 'C:C');
[XI YI ZI] = griddata(X,Y,Z,linspace(0,1),linspace(0,1)');
figure
subplot(1,2,1)
trisurf(delaunay(X,Y),X,Y,Z)
subplot(1,2,2);
surf(XI,YI,ZI)
Что я делаю не так и как я могу это исправить, чтобы получить модель, похожую на ту, что выше?
РЕДАКТИРОВАТЬ
Я попытался разрезать плоскость Z, и это то, что я получаю. Мне нужно, чтобы самолеты были связаны. Также у меня есть больше данных, которые дают разные модели, поэтому мне нужно решение, которое охватит и другие модели.
1 ответ
Проблема заключается в ваших данных: у поверхности, которую вы хотите, есть 2 z-значения для определенной пары xy!
Я не могу придумать идеальное решение, но вы можете попробовать разрезать поверхность на две части, чтобы каждая часть представляла собой однозначную двумерную функцию z=f(x,y)
% for the upper part, let's cut it by the plane z==0
X=X(Z>0);
Y=Y(Z>0);
Z=Z(Z>0);
А затем запустите ваш код:
[XI YI ZI] = griddata(X,Y,Z,linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI)
Построение нижней части аналогично. Вы можете объединить их в одну фигуру, используя hold on
,
На форуме Matlab есть более общая дискуссия "создание-3d-сетки для некоторых точек в пространстве"
Прыжки это помогает.
Отредактировано:
Вот полный код, предполагая, что ваша поверхность может быть разрезана плоскостью (z=0):
close all; clear all;
X=xlsread('data.csv', '', 'A:A');
Y=xlsread('data.csv', '', 'B:B');
Z=xlsread('data.csv', '', 'C:C');
[XI YI ZI] = griddata(X(Z>0),Y(Z>0),Z(Z>0),linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI);
hold on;
[XI YI ZI] = griddata(X(Z<0),Y(Z<0),Z(Z<0),linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI);
hold off;