Ответ 1
Обратите внимание, что функция trisurf
, которую вы изначально пытались использовать, возвращает дескриптор объекта патча. Если вы посмотрите на свойство 'FaceColor'
для объектов патча, вы увидите, что нет опции 'texturemap'
. Этот параметр действителен только для свойства 'FaceColor'
свойств поверхностных объектов. Поэтому вам придется найти способ построить свою треугольную поверхность как поверхностный объект вместо объекта патча. Вот два способа приблизиться к этому:
Если ваши данные находятся в единой сетке...
Если координаты ваших поверхностных данных представляют собой однородную сетку, так что z
представляет собой прямоугольное множество точек, которые простираются от xmin
до xmax
по оси x и от ymin
до ymax
в y-axis, вы можете построить его с помощью surf
вместо trisurf
:
Z = ... % N-by-M matrix of data
x = linspace(xmin, xmax, size(Z, 2)); % x-coordinates for columns of Z
y = linspace(ymin, ymax, size(Z, 1)); % y-coordinates for rows of Z
[X, Y] = meshgrid(x, y); % Create meshes for x and y
C = imread('image1.jpg'); % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ... % Plot surface (flips rows of C, if needed)
'FaceColor', 'texturemap', ...
'EdgeColor', 'none');
axis equal
Чтобы проиллюстрировать результаты приведенного выше кода, я инициализировал данные как Z = peaks;
, использовал встроенное образцовое изображение 'peppers.png'
и установил значения x
и y
в диапазоне от 1 до 16. Это привело к следующей текстурированной поверхности:
Если ваши данные неравномерно распределены...
Если ваши данные не расположены на регулярной основе, вы можете создать набор регулярных интервалов x
и y
(как я сделал выше, используя meshgrid
), а затем используйте одну из функций griddata
или TriScatteredInterp
, чтобы интерполировать правильную сетку значений z
из вашего нерегулярного набора значений z
. Я обсуждаю, как использовать эти две функции в моем ответе на другой вопрос SO. Здесь уточненная версия кода, который вы опубликовали с помощью TriScatteredInterp
(Примечание: по R2013a scatteredInterpolant
является рекомендуемой альтернативой):
x = ... % Scattered x data
y = ... % Scattered y data
z = ... % Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:), y(:), z(:)); % Create interpolant
N = 50; % Number of y values in uniform grid
M = 50; % Number of x values in uniform grid
xu = linspace(xmin, xmax, M); % Uniform x-coordinates
yu = linspace(ymin, ymax, N); % Uniform y-coordinates
[X, Y] = meshgrid(xu, yu); % Create meshes for xu and yu
Z = F(X, Y); % Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg'); % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ... % Plot surface
'FaceColor', 'texturemap', ...
'EdgeColor', 'none');
axis equal
В этом случае вы должны сначала выбрать значения N
и M
для размера вашей матрицы z
. Чтобы проиллюстрировать результаты приведенного выше кода, я инициализировал данные для x
, y
и z
следующим образом и использовал встроенное образцовое изображение 'peppers.png'
:
x = rand(1, 100)-0.5; % 100 random values in the range -0.5 to 0.5
y = rand(1, 100)-0.5; % 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125); % Values from a 2-D Gaussian distribution
В результате появилась следующая текстурированная поверхность:
Обратите внимание, что рядом с углами поверхности имеются зубчатые ребра. Это места, где для TriScatteredInterp
было слишком мало точек для адекватной установки интерполированной поверхности. Значения z
в этих точках, следовательно, nan
, в результате чего поверхность не отображается на графике.