请注意,您最初尝试使用的函数trisurf 返回patch 对象的句柄。如果查看'FaceColor' property for patch objects,可以看到没有'texturemap' 选项。该选项仅对'FaceColor' property of surface objects 有效。因此,您必须找到一种方法将三角形表面绘制为 surface 对象而不是 patch 对象。以下是解决此问题的两种方法:
如果您的数据在统一网格中...
如果您的表面数据的坐标表示一个统一的网格,使得z 是一组矩形点,在 x 轴上从 xmin 到 xmax,在 ymin 到 ymax y 轴,您可以使用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 或@ 987654329@ 从不规则的 z 值集中插入一个规则的网格 Z 值。我在my answer to another SO question 中讨论了如何使用这两个函数。这是您使用 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,从而导致未绘制表面点。